@infrab4a/connect 1.0.0-beta.32 → 1.0.0-beta.33

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 (574) hide show
  1. package/README.md +24 -24
  2. package/bundles/infrab4a-connect.umd.js +4088 -4206
  3. package/bundles/infrab4a-connect.umd.js.map +1 -1
  4. package/domain/catalog/index.d.ts +2 -2
  5. package/domain/catalog/models/category.d.ts +23 -23
  6. package/domain/catalog/models/enums/index.d.ts +1 -1
  7. package/domain/catalog/models/enums/shops.enum.d.ts +5 -5
  8. package/domain/catalog/models/index.d.ts +6 -6
  9. package/domain/catalog/models/kit-product.d.ts +12 -12
  10. package/domain/catalog/models/product.d.ts +39 -39
  11. package/domain/catalog/models/types/category-condition.type.d.ts +4 -4
  12. package/domain/catalog/models/types/category-filter.type.d.ts +4 -4
  13. package/domain/catalog/models/types/index.d.ts +7 -7
  14. package/domain/catalog/models/types/product-review.type.d.ts +17 -17
  15. package/domain/catalog/models/types/shops-description.type.d.ts +7 -7
  16. package/domain/catalog/models/types/shops-price.type.d.ts +10 -10
  17. package/domain/catalog/models/types/stock.type.d.ts +3 -3
  18. package/domain/catalog/models/types/variant-grade.type.d.ts +4 -4
  19. package/domain/catalog/models/variant.d.ts +18 -18
  20. package/domain/catalog/repositories/category.repository.d.ts +15 -15
  21. package/domain/catalog/repositories/index.d.ts +4 -4
  22. package/domain/catalog/repositories/product.repository.d.ts +12 -12
  23. package/domain/catalog/repositories/subscription-product.repository.d.ts +4 -4
  24. package/domain/catalog/repositories/variant.repository.d.ts +4 -4
  25. package/domain/generic/index.d.ts +2 -2
  26. package/domain/generic/model/base.model.d.ts +10 -10
  27. package/domain/generic/model/identifier-fields.d.ts +4 -4
  28. package/domain/generic/model/index.d.ts +3 -3
  29. package/domain/generic/model/types/base-model-builder.type.d.ts +15 -15
  30. package/domain/generic/model/types/identifier-model.type.d.ts +7 -7
  31. package/domain/generic/model/types/index.d.ts +5 -5
  32. package/domain/generic/model/types/model-base-structure.type.d.ts +6 -6
  33. package/domain/generic/model/types/non-function-properties.type.d.ts +12 -12
  34. package/domain/generic/model/types/non-function-property-name.type.d.ts +4 -4
  35. package/domain/generic/repository/create.repository.d.ts +8 -8
  36. package/domain/generic/repository/crud.repository.d.ts +19 -19
  37. package/domain/generic/repository/delete.repository.d.ts +7 -7
  38. package/domain/generic/repository/enums/index.d.ts +2 -2
  39. package/domain/generic/repository/enums/update-option-actions.enum.d.ts +7 -7
  40. package/domain/generic/repository/enums/where.enum.d.ts +13 -13
  41. package/domain/generic/repository/find.repository.d.ts +11 -11
  42. package/domain/generic/repository/get.repository.d.ts +5 -5
  43. package/domain/generic/repository/index.d.ts +9 -9
  44. package/domain/generic/repository/read.repository.d.ts +14 -14
  45. package/domain/generic/repository/types/index.d.ts +6 -6
  46. package/domain/generic/repository/types/repository-find-filters.type.d.ts +13 -13
  47. package/domain/generic/repository/types/repository-find-result.type.d.ts +4 -4
  48. package/domain/generic/repository/types/repository-limit-options.type.d.ts +4 -4
  49. package/domain/generic/repository/types/repository-order-by-list.type.d.ts +5 -5
  50. package/domain/generic/repository/types/repository-update-params.type.d.ts +11 -11
  51. package/domain/generic/repository/types/where-options.type.d.ts +2 -2
  52. package/domain/generic/repository/update.repository.d.ts +6 -6
  53. package/domain/index.d.ts +6 -6
  54. package/domain/location/index.d.ts +1 -1
  55. package/domain/location/models/address.d.ts +22 -22
  56. package/domain/location/models/index.d.ts +2 -2
  57. package/domain/location/models/types/index.d.ts +3 -3
  58. package/domain/location/models/types/location-bound.type.d.ts +6 -6
  59. package/domain/location/models/types/location-geometry.type.d.ts +7 -7
  60. package/domain/location/models/types/location-lat-lng.type.d.ts +4 -4
  61. package/domain/shop-settings/enums/filter-type.enum.d.ts +19 -19
  62. package/domain/shop-settings/enums/index.d.ts +2 -2
  63. package/domain/shop-settings/enums/questions-filters.enum.d.ts +19 -19
  64. package/domain/shop-settings/helpers/beauty-questions.helper.d.ts +9 -9
  65. package/domain/shop-settings/helpers/index.d.ts +1 -1
  66. package/domain/shop-settings/index.d.ts +4 -4
  67. package/domain/shop-settings/models/home.d.ts +17 -17
  68. package/domain/shop-settings/models/index.d.ts +3 -3
  69. package/domain/shop-settings/models/shop-menu.d.ts +7 -7
  70. package/domain/shop-settings/models/types/banner.type.d.ts +6 -6
  71. package/domain/shop-settings/models/types/benefit.type.d.ts +5 -5
  72. package/domain/shop-settings/models/types/home-data.type.d.ts +15 -15
  73. package/domain/shop-settings/models/types/index.d.ts +5 -5
  74. package/domain/shop-settings/models/types/menu-nav.type.d.ts +8 -8
  75. package/domain/shop-settings/models/types/sub-menu.type.d.ts +8 -8
  76. package/domain/shop-settings/repositories/home.repository.d.ts +4 -4
  77. package/domain/shop-settings/repositories/index.d.ts +2 -2
  78. package/domain/shop-settings/repositories/shop-menu.repository.d.ts +4 -4
  79. package/domain/shopping/index.d.ts +2 -2
  80. package/domain/shopping/models/buy-2-win.d.ts +16 -16
  81. package/domain/shopping/models/checkout.d.ts +27 -27
  82. package/domain/shopping/models/coupons/coupon.d.ts +26 -26
  83. package/domain/shopping/models/coupons/enums/coupon-subtypes.enum.d.ts +4 -4
  84. package/domain/shopping/models/coupons/enums/coupon-types.enum.d.ts +6 -6
  85. package/domain/shopping/models/coupons/enums/exclusivities.enum.d.ts +5 -5
  86. package/domain/shopping/models/coupons/enums/index.d.ts +3 -3
  87. package/domain/shopping/models/coupons/financial-coupon.d.ts +9 -9
  88. package/domain/shopping/models/coupons/index.d.ts +3 -3
  89. package/domain/shopping/models/enums/checkout-types.enum.d.ts +4 -4
  90. package/domain/shopping/models/enums/index.d.ts +2 -2
  91. package/domain/shopping/models/enums/order-status.enum.d.ts +10 -10
  92. package/domain/shopping/models/index.d.ts +11 -11
  93. package/domain/shopping/models/line-item.d.ts +8 -8
  94. package/domain/shopping/models/order.d.ts +9 -9
  95. package/domain/shopping/models/payment.d.ts +67 -67
  96. package/domain/shopping/models/shipping-method.d.ts +16 -16
  97. package/domain/shopping/models/subscription/checkout.d.ts +21 -21
  98. package/domain/shopping/models/subscription/index.d.ts +2 -2
  99. package/domain/shopping/models/subscription/plan.d.ts +10 -10
  100. package/domain/shopping/models/types/index.d.ts +7 -7
  101. package/domain/shopping/models/types/payment-address.type.d.ts +12 -12
  102. package/domain/shopping/models/types/payment-billing.type.d.ts +7 -7
  103. package/domain/shopping/models/types/payment-card.type.d.ts +14 -14
  104. package/domain/shopping/models/types/payment-customer.type.d.ts +18 -18
  105. package/domain/shopping/models/types/payment-document.type.d.ts +6 -6
  106. package/domain/shopping/models/types/payment-item.type.d.ts +11 -11
  107. package/domain/shopping/models/types/payment-shipping.type.d.ts +10 -10
  108. package/domain/shopping/repositories/buy-2-win.repository.d.ts +4 -4
  109. package/domain/shopping/repositories/checkout.repository.d.ts +4 -4
  110. package/domain/shopping/repositories/coupon.repository.d.ts +4 -4
  111. package/domain/shopping/repositories/index.d.ts +7 -7
  112. package/domain/shopping/repositories/legacy-order.repository.d.ts +3 -3
  113. package/domain/shopping/repositories/order.repository.d.ts +4 -4
  114. package/domain/shopping/repositories/payment.repository.d.ts +4 -4
  115. package/domain/shopping/repositories/subscription/checkout.repository.d.ts +4 -4
  116. package/domain/shopping/repositories/subscription/index.d.ts +2 -2
  117. package/domain/shopping/repositories/subscription/plan.repository.d.ts +4 -4
  118. package/domain/users/errors/index.d.ts +3 -3
  119. package/domain/users/errors/unauthorized.error.d.ts +5 -5
  120. package/domain/users/errors/user-already-registered.error.d.ts +5 -5
  121. package/domain/users/errors/weak-password.error.d.ts +5 -5
  122. package/domain/users/index.d.ts +5 -5
  123. package/domain/users/models/beauty-profile.d.ts +11 -11
  124. package/domain/users/models/enums/accessory-importances.enum.d.ts +5 -5
  125. package/domain/users/models/enums/area.enum.d.ts +11 -11
  126. package/domain/users/models/enums/beard-problems.enum.d.ts +9 -9
  127. package/domain/users/models/enums/beard-sizes.enum.d.ts +7 -7
  128. package/domain/users/models/enums/beauty-product-importances.enum.d.ts +6 -6
  129. package/domain/users/models/enums/body-problems.enum.d.ts +11 -11
  130. package/domain/users/models/enums/body-shapes.enum.d.ts +7 -7
  131. package/domain/users/models/enums/body-tattoos.enum.d.ts +5 -5
  132. package/domain/users/models/enums/face-skin-oilinesses.enum.d.ts +7 -7
  133. package/domain/users/models/enums/face-skin-problems.enum.d.ts +10 -10
  134. package/domain/users/models/enums/face-skin-tones.enum.d.ts +8 -8
  135. package/domain/users/models/enums/family-incomes.enum.d.ts +8 -8
  136. package/domain/users/models/enums/fragrance-importances.enum.d.ts +5 -5
  137. package/domain/users/models/enums/hair-colors.enum.d.ts +10 -10
  138. package/domain/users/models/enums/hair-problems.enum.d.ts +10 -10
  139. package/domain/users/models/enums/hair-strands.enum.d.ts +8 -8
  140. package/domain/users/models/enums/hair-types.enum.d.ts +7 -7
  141. package/domain/users/models/enums/index.d.ts +20 -20
  142. package/domain/users/models/enums/office-position.enum.d.ts +6 -6
  143. package/domain/users/models/enums/product-spents.enum.d.ts +8 -8
  144. package/domain/users/models/enums/user-type.enum.d.ts +8 -8
  145. package/domain/users/models/index.d.ts +7 -7
  146. package/domain/users/models/lead.d.ts +7 -7
  147. package/domain/users/models/subscription/edition.d.ts +16 -16
  148. package/domain/users/models/subscription/enums/billing-status.enum.d.ts +3 -3
  149. package/domain/users/models/subscription/enums/edition-status.enum.d.ts +4 -4
  150. package/domain/users/models/subscription/enums/index.d.ts +4 -4
  151. package/domain/users/models/subscription/enums/payment-type.enum.d.ts +5 -5
  152. package/domain/users/models/subscription/enums/status.enum.d.ts +4 -4
  153. package/domain/users/models/subscription/index.d.ts +4 -4
  154. package/domain/users/models/subscription/payment.d.ts +13 -13
  155. package/domain/users/models/subscription/subscription.d.ts +28 -28
  156. package/domain/users/models/user-address.d.ts +7 -7
  157. package/domain/users/models/user-payment-method.d.ts +14 -14
  158. package/domain/users/models/user.d.ts +26 -26
  159. package/domain/users/repositories/beauty-profile.repository.d.ts +4 -4
  160. package/domain/users/repositories/edition.repository.d.ts +4 -4
  161. package/domain/users/repositories/index.d.ts +8 -8
  162. package/domain/users/repositories/lead.repository.d.ts +4 -4
  163. package/domain/users/repositories/subscription-payment.repository.d.ts +4 -4
  164. package/domain/users/repositories/subscription.repository.d.ts +4 -4
  165. package/domain/users/repositories/user-address.repository.d.ts +4 -4
  166. package/domain/users/repositories/user-payment-method.repository.d.ts +4 -4
  167. package/domain/users/repositories/user.repository.d.ts +6 -6
  168. package/domain/users/services/authentication.service.d.ts +12 -12
  169. package/domain/users/services/index.d.ts +3 -3
  170. package/domain/users/services/register.service.d.ts +7 -7
  171. package/domain/users/services/types/basic-user-data.type.d.ts +4 -4
  172. package/domain/users/services/types/index.d.ts +1 -1
  173. package/domain/users/use-cases/authentication.d.ts +21 -21
  174. package/domain/users/use-cases/index.d.ts +4 -4
  175. package/domain/users/use-cases/recovery-password.d.ts +6 -6
  176. package/domain/users/use-cases/register.d.ts +13 -13
  177. package/domain/users/use-cases/signout.d.ts +6 -6
  178. package/errors/duplicated-results.error.d.ts +5 -5
  179. package/errors/index.d.ts +4 -4
  180. package/errors/invalid-argument.error.d.ts +5 -5
  181. package/errors/not-found.error.d.ts +5 -5
  182. package/errors/required-argument.error.d.ts +6 -6
  183. package/esm2015/domain/catalog/index.js +3 -3
  184. package/esm2015/domain/catalog/models/category.js +10 -10
  185. package/esm2015/domain/catalog/models/enums/index.js +2 -2
  186. package/esm2015/domain/catalog/models/enums/shops.enum.js +7 -7
  187. package/esm2015/domain/catalog/models/index.js +7 -7
  188. package/esm2015/domain/catalog/models/kit-product.js +18 -18
  189. package/esm2015/domain/catalog/models/product.js +21 -21
  190. package/esm2015/domain/catalog/models/types/category-condition.type.js +2 -2
  191. package/esm2015/domain/catalog/models/types/category-filter.type.js +2 -2
  192. package/esm2015/domain/catalog/models/types/index.js +8 -8
  193. package/esm2015/domain/catalog/models/types/product-review.type.js +2 -2
  194. package/esm2015/domain/catalog/models/types/shops-description.type.js +2 -2
  195. package/esm2015/domain/catalog/models/types/shops-price.type.js +2 -2
  196. package/esm2015/domain/catalog/models/types/stock.type.js +2 -2
  197. package/esm2015/domain/catalog/models/types/variant-grade.type.js +2 -2
  198. package/esm2015/domain/catalog/models/variant.js +10 -10
  199. package/esm2015/domain/catalog/repositories/category.repository.js +2 -2
  200. package/esm2015/domain/catalog/repositories/index.js +5 -5
  201. package/esm2015/domain/catalog/repositories/product.repository.js +2 -2
  202. package/esm2015/domain/catalog/repositories/subscription-product.repository.js +2 -2
  203. package/esm2015/domain/catalog/repositories/variant.repository.js +2 -2
  204. package/esm2015/domain/generic/index.js +3 -3
  205. package/esm2015/domain/generic/model/base.model.js +23 -23
  206. package/esm2015/domain/generic/model/identifier-fields.js +2 -2
  207. package/esm2015/domain/generic/model/index.js +4 -4
  208. package/esm2015/domain/generic/model/types/base-model-builder.type.js +2 -2
  209. package/esm2015/domain/generic/model/types/identifier-model.type.js +2 -2
  210. package/esm2015/domain/generic/model/types/index.js +6 -6
  211. package/esm2015/domain/generic/model/types/model-base-structure.type.js +2 -2
  212. package/esm2015/domain/generic/model/types/non-function-properties.type.js +2 -2
  213. package/esm2015/domain/generic/model/types/non-function-property-name.type.js +2 -2
  214. package/esm2015/domain/generic/repository/create.repository.js +2 -2
  215. package/esm2015/domain/generic/repository/crud.repository.js +2 -2
  216. package/esm2015/domain/generic/repository/delete.repository.js +2 -2
  217. package/esm2015/domain/generic/repository/enums/index.js +3 -3
  218. package/esm2015/domain/generic/repository/enums/update-option-actions.enum.js +9 -9
  219. package/esm2015/domain/generic/repository/enums/where.enum.js +15 -15
  220. package/esm2015/domain/generic/repository/find.repository.js +2 -2
  221. package/esm2015/domain/generic/repository/get.repository.js +2 -2
  222. package/esm2015/domain/generic/repository/index.js +10 -10
  223. package/esm2015/domain/generic/repository/read.repository.js +2 -2
  224. package/esm2015/domain/generic/repository/types/index.js +7 -7
  225. package/esm2015/domain/generic/repository/types/repository-find-filters.type.js +2 -2
  226. package/esm2015/domain/generic/repository/types/repository-find-result.type.js +2 -2
  227. package/esm2015/domain/generic/repository/types/repository-limit-options.type.js +2 -2
  228. package/esm2015/domain/generic/repository/types/repository-order-by-list.type.js +2 -2
  229. package/esm2015/domain/generic/repository/types/repository-update-params.type.js +2 -2
  230. package/esm2015/domain/generic/repository/types/where-options.type.js +2 -2
  231. package/esm2015/domain/generic/repository/update.repository.js +2 -2
  232. package/esm2015/domain/index.js +7 -7
  233. package/esm2015/domain/location/index.js +2 -2
  234. package/esm2015/domain/location/models/address.js +7 -7
  235. package/esm2015/domain/location/models/index.js +3 -3
  236. package/esm2015/domain/location/models/types/index.js +4 -4
  237. package/esm2015/domain/location/models/types/location-bound.type.js +2 -2
  238. package/esm2015/domain/location/models/types/location-geometry.type.js +2 -2
  239. package/esm2015/domain/location/models/types/location-lat-lng.type.js +2 -2
  240. package/esm2015/domain/shop-settings/enums/filter-type.enum.js +21 -21
  241. package/esm2015/domain/shop-settings/enums/index.js +3 -3
  242. package/esm2015/domain/shop-settings/enums/questions-filters.enum.js +21 -21
  243. package/esm2015/domain/shop-settings/helpers/beauty-questions.helper.js +46 -46
  244. package/esm2015/domain/shop-settings/helpers/index.js +2 -2
  245. package/esm2015/domain/shop-settings/index.js +5 -5
  246. package/esm2015/domain/shop-settings/models/home.js +7 -7
  247. package/esm2015/domain/shop-settings/models/index.js +4 -4
  248. package/esm2015/domain/shop-settings/models/shop-menu.js +7 -7
  249. package/esm2015/domain/shop-settings/models/types/banner.type.js +2 -2
  250. package/esm2015/domain/shop-settings/models/types/benefit.type.js +2 -2
  251. package/esm2015/domain/shop-settings/models/types/home-data.type.js +2 -2
  252. package/esm2015/domain/shop-settings/models/types/index.js +6 -6
  253. package/esm2015/domain/shop-settings/models/types/menu-nav.type.js +2 -2
  254. package/esm2015/domain/shop-settings/models/types/sub-menu.type.js +2 -2
  255. package/esm2015/domain/shop-settings/repositories/home.repository.js +2 -2
  256. package/esm2015/domain/shop-settings/repositories/index.js +3 -3
  257. package/esm2015/domain/shop-settings/repositories/shop-menu.repository.js +2 -2
  258. package/esm2015/domain/shopping/index.js +3 -3
  259. package/esm2015/domain/shopping/models/buy-2-win.js +14 -14
  260. package/esm2015/domain/shopping/models/checkout.js +38 -38
  261. package/esm2015/domain/shopping/models/coupons/coupon.js +23 -23
  262. package/esm2015/domain/shopping/models/coupons/enums/coupon-subtypes.enum.js +6 -6
  263. package/esm2015/domain/shopping/models/coupons/enums/coupon-types.enum.js +8 -8
  264. package/esm2015/domain/shopping/models/coupons/enums/exclusivities.enum.js +7 -7
  265. package/esm2015/domain/shopping/models/coupons/enums/index.js +4 -4
  266. package/esm2015/domain/shopping/models/coupons/financial-coupon.js +28 -28
  267. package/esm2015/domain/shopping/models/coupons/index.js +4 -4
  268. package/esm2015/domain/shopping/models/enums/checkout-types.enum.js +6 -6
  269. package/esm2015/domain/shopping/models/enums/index.js +3 -3
  270. package/esm2015/domain/shopping/models/enums/order-status.enum.js +12 -12
  271. package/esm2015/domain/shopping/models/index.js +12 -12
  272. package/esm2015/domain/shopping/models/line-item.js +4 -4
  273. package/esm2015/domain/shopping/models/order.js +11 -11
  274. package/esm2015/domain/shopping/models/payment.js +169 -169
  275. package/esm2015/domain/shopping/models/shipping-method.js +7 -7
  276. package/esm2015/domain/shopping/models/subscription/checkout.js +28 -28
  277. package/esm2015/domain/shopping/models/subscription/index.js +3 -3
  278. package/esm2015/domain/shopping/models/subscription/plan.js +7 -7
  279. package/esm2015/domain/shopping/models/types/index.js +8 -8
  280. package/esm2015/domain/shopping/models/types/payment-address.type.js +2 -2
  281. package/esm2015/domain/shopping/models/types/payment-billing.type.js +2 -2
  282. package/esm2015/domain/shopping/models/types/payment-card.type.js +2 -2
  283. package/esm2015/domain/shopping/models/types/payment-customer.type.js +2 -2
  284. package/esm2015/domain/shopping/models/types/payment-document.type.js +2 -2
  285. package/esm2015/domain/shopping/models/types/payment-item.type.js +2 -2
  286. package/esm2015/domain/shopping/models/types/payment-shipping.type.js +2 -2
  287. package/esm2015/domain/shopping/repositories/buy-2-win.repository.js +2 -2
  288. package/esm2015/domain/shopping/repositories/checkout.repository.js +2 -2
  289. package/esm2015/domain/shopping/repositories/coupon.repository.js +2 -2
  290. package/esm2015/domain/shopping/repositories/index.js +8 -8
  291. package/esm2015/domain/shopping/repositories/legacy-order.repository.js +2 -2
  292. package/esm2015/domain/shopping/repositories/order.repository.js +2 -2
  293. package/esm2015/domain/shopping/repositories/payment.repository.js +2 -2
  294. package/esm2015/domain/shopping/repositories/subscription/checkout.repository.js +2 -2
  295. package/esm2015/domain/shopping/repositories/subscription/index.js +3 -3
  296. package/esm2015/domain/shopping/repositories/subscription/plan.repository.js +2 -2
  297. package/esm2015/domain/users/errors/index.js +4 -4
  298. package/esm2015/domain/users/errors/unauthorized.error.js +8 -8
  299. package/esm2015/domain/users/errors/user-already-registered.error.js +8 -8
  300. package/esm2015/domain/users/errors/weak-password.error.js +8 -8
  301. package/esm2015/domain/users/index.js +6 -6
  302. package/esm2015/domain/users/models/beauty-profile.js +12 -12
  303. package/esm2015/domain/users/models/enums/accessory-importances.enum.js +7 -7
  304. package/esm2015/domain/users/models/enums/area.enum.js +13 -13
  305. package/esm2015/domain/users/models/enums/beard-problems.enum.js +11 -11
  306. package/esm2015/domain/users/models/enums/beard-sizes.enum.js +9 -9
  307. package/esm2015/domain/users/models/enums/beauty-product-importances.enum.js +8 -8
  308. package/esm2015/domain/users/models/enums/body-problems.enum.js +13 -13
  309. package/esm2015/domain/users/models/enums/body-shapes.enum.js +9 -9
  310. package/esm2015/domain/users/models/enums/body-tattoos.enum.js +7 -7
  311. package/esm2015/domain/users/models/enums/face-skin-oilinesses.enum.js +9 -9
  312. package/esm2015/domain/users/models/enums/face-skin-problems.enum.js +12 -12
  313. package/esm2015/domain/users/models/enums/face-skin-tones.enum.js +10 -10
  314. package/esm2015/domain/users/models/enums/family-incomes.enum.js +10 -10
  315. package/esm2015/domain/users/models/enums/fragrance-importances.enum.js +7 -7
  316. package/esm2015/domain/users/models/enums/hair-colors.enum.js +12 -12
  317. package/esm2015/domain/users/models/enums/hair-problems.enum.js +12 -12
  318. package/esm2015/domain/users/models/enums/hair-strands.enum.js +10 -10
  319. package/esm2015/domain/users/models/enums/hair-types.enum.js +9 -9
  320. package/esm2015/domain/users/models/enums/index.js +21 -21
  321. package/esm2015/domain/users/models/enums/office-position.enum.js +8 -8
  322. package/esm2015/domain/users/models/enums/product-spents.enum.js +10 -10
  323. package/esm2015/domain/users/models/enums/user-type.enum.js +10 -10
  324. package/esm2015/domain/users/models/index.js +8 -8
  325. package/esm2015/domain/users/models/lead.js +7 -7
  326. package/esm2015/domain/users/models/subscription/edition.js +7 -7
  327. package/esm2015/domain/users/models/subscription/enums/billing-status.enum.js +5 -5
  328. package/esm2015/domain/users/models/subscription/enums/edition-status.enum.js +6 -6
  329. package/esm2015/domain/users/models/subscription/enums/index.js +5 -5
  330. package/esm2015/domain/users/models/subscription/enums/payment-type.enum.js +7 -7
  331. package/esm2015/domain/users/models/subscription/enums/status.enum.js +6 -6
  332. package/esm2015/domain/users/models/subscription/index.js +5 -5
  333. package/esm2015/domain/users/models/subscription/payment.js +14 -14
  334. package/esm2015/domain/users/models/subscription/subscription.js +43 -43
  335. package/esm2015/domain/users/models/user-address.js +7 -7
  336. package/esm2015/domain/users/models/user-payment-method.js +7 -7
  337. package/esm2015/domain/users/models/user.js +26 -26
  338. package/esm2015/domain/users/repositories/beauty-profile.repository.js +2 -2
  339. package/esm2015/domain/users/repositories/edition.repository.js +2 -2
  340. package/esm2015/domain/users/repositories/index.js +9 -9
  341. package/esm2015/domain/users/repositories/lead.repository.js +2 -2
  342. package/esm2015/domain/users/repositories/subscription-payment.repository.js +2 -2
  343. package/esm2015/domain/users/repositories/subscription.repository.js +2 -2
  344. package/esm2015/domain/users/repositories/user-address.repository.js +2 -2
  345. package/esm2015/domain/users/repositories/user-payment-method.repository.js +2 -2
  346. package/esm2015/domain/users/repositories/user.repository.js +2 -2
  347. package/esm2015/domain/users/services/authentication.service.js +2 -2
  348. package/esm2015/domain/users/services/index.js +4 -4
  349. package/esm2015/domain/users/services/register.service.js +2 -2
  350. package/esm2015/domain/users/services/types/basic-user-data.type.js +2 -2
  351. package/esm2015/domain/users/services/types/index.js +2 -2
  352. package/esm2015/domain/users/use-cases/authentication.js +40 -40
  353. package/esm2015/domain/users/use-cases/index.js +5 -5
  354. package/esm2015/domain/users/use-cases/recovery-password.js +12 -12
  355. package/esm2015/domain/users/use-cases/register.js +34 -34
  356. package/esm2015/domain/users/use-cases/signout.js +12 -12
  357. package/esm2015/errors/duplicated-results.error.js +8 -8
  358. package/esm2015/errors/index.js +5 -5
  359. package/esm2015/errors/invalid-argument.error.js +8 -8
  360. package/esm2015/errors/not-found.error.js +8 -8
  361. package/esm2015/errors/required-argument.error.js +9 -9
  362. package/esm2015/index.js +6 -6
  363. package/esm2015/infra/elasticsearch/adapters/axios.adapter.js +22 -57
  364. package/esm2015/infra/elasticsearch/adapters/elastic-search.adapter.js +2 -2
  365. package/esm2015/infra/elasticsearch/adapters/index.js +3 -3
  366. package/esm2015/infra/elasticsearch/index.js +4 -4
  367. package/esm2015/infra/elasticsearch/indexes/index.js +2 -2
  368. package/esm2015/infra/elasticsearch/indexes/products-index.js +59 -90
  369. package/esm2015/infra/elasticsearch/types/elastic-search-result.js +2 -2
  370. package/esm2015/infra/elasticsearch/types/index.js +2 -2
  371. package/esm2015/infra/firebase/auth/authentication-firebase-auth.service.js +52 -52
  372. package/esm2015/infra/firebase/auth/index.js +3 -3
  373. package/esm2015/infra/firebase/auth/register-firebase-auth.service.js +26 -26
  374. package/esm2015/infra/firebase/auth/types/firebase-user-with-id.type.js +2 -2
  375. package/esm2015/infra/firebase/firestore/index.js +4 -4
  376. package/esm2015/infra/firebase/firestore/mixins/index.js +10 -10
  377. package/esm2015/infra/firebase/firestore/mixins/with-create-firestore.mixin.js +31 -31
  378. package/esm2015/infra/firebase/firestore/mixins/with-crud-firestore.mixin.js +10 -10
  379. package/esm2015/infra/firebase/firestore/mixins/with-delete-firestore.mixin.js +18 -18
  380. package/esm2015/infra/firebase/firestore/mixins/with-find-firestore.mixin.js +86 -86
  381. package/esm2015/infra/firebase/firestore/mixins/with-firestore.mixin.js +22 -22
  382. package/esm2015/infra/firebase/firestore/mixins/with-get-firestore.mixin.js +24 -24
  383. package/esm2015/infra/firebase/firestore/mixins/with-helpers.mixin.js +17 -17
  384. package/esm2015/infra/firebase/firestore/mixins/with-sub-collection.mixin.js +11 -11
  385. package/esm2015/infra/firebase/firestore/mixins/with-update-firestore.mixin.js +45 -45
  386. package/esm2015/infra/firebase/firestore/models/user-search.js +7 -7
  387. package/esm2015/infra/firebase/firestore/repositories/catalog/category-firestore.repository.js +72 -72
  388. package/esm2015/infra/firebase/firestore/repositories/catalog/index.js +5 -5
  389. package/esm2015/infra/firebase/firestore/repositories/catalog/product-firestore.repository.js +53 -53
  390. package/esm2015/infra/firebase/firestore/repositories/catalog/product-variant-firestore.repository.js +14 -14
  391. package/esm2015/infra/firebase/firestore/repositories/catalog/subscription-product-firestore.repository.js +12 -12
  392. package/esm2015/infra/firebase/firestore/repositories/index.js +5 -5
  393. package/esm2015/infra/firebase/firestore/repositories/shop-settings/home-firestore.repository.js +56 -56
  394. package/esm2015/infra/firebase/firestore/repositories/shop-settings/index.js +3 -3
  395. package/esm2015/infra/firebase/firestore/repositories/shop-settings/shop-menu-firestore.repository.js +12 -12
  396. package/esm2015/infra/firebase/firestore/repositories/shopping/buy-2-win-firestore.repository.js +12 -12
  397. package/esm2015/infra/firebase/firestore/repositories/shopping/checkout-firestore.repository.js +12 -12
  398. package/esm2015/infra/firebase/firestore/repositories/shopping/checkout-subscription-firestore.repository.js +12 -12
  399. package/esm2015/infra/firebase/firestore/repositories/shopping/coupon-firestore.repository.js +29 -29
  400. package/esm2015/infra/firebase/firestore/repositories/shopping/index.js +9 -9
  401. package/esm2015/infra/firebase/firestore/repositories/shopping/legacy-order-firestore.repository.js +9 -9
  402. package/esm2015/infra/firebase/firestore/repositories/shopping/order-firestore.repository.js +12 -12
  403. package/esm2015/infra/firebase/firestore/repositories/shopping/payment-firestore.repository.js +12 -12
  404. package/esm2015/infra/firebase/firestore/repositories/shopping/subscription-plan-firestore.repository.js +12 -12
  405. package/esm2015/infra/firebase/firestore/repositories/users/index.js +10 -10
  406. package/esm2015/infra/firebase/firestore/repositories/users/lead-firestore.repository.js +12 -12
  407. package/esm2015/infra/firebase/firestore/repositories/users/subscription-edition-firestore.repository.js +14 -14
  408. package/esm2015/infra/firebase/firestore/repositories/users/subscription-firestore.repository.js +12 -12
  409. package/esm2015/infra/firebase/firestore/repositories/users/subscription-payment-firestore.repository.js +14 -14
  410. package/esm2015/infra/firebase/firestore/repositories/users/user-address-firestore.repository.js +14 -14
  411. package/esm2015/infra/firebase/firestore/repositories/users/user-beauty-profile-firestore.repository.js +14 -14
  412. package/esm2015/infra/firebase/firestore/repositories/users/user-firestore.repository.js +70 -70
  413. package/esm2015/infra/firebase/firestore/repositories/users/user-payment-method-firestore.repository.js +14 -14
  414. package/esm2015/infra/firebase/firestore/repositories/users/user-search-firestore.repository.js +12 -12
  415. package/esm2015/infra/firebase/firestore/types/firestore-sub.repository.type.js +2 -2
  416. package/esm2015/infra/firebase/firestore/types/firestore.helpers.type.js +2 -2
  417. package/esm2015/infra/firebase/firestore/types/firestore.repository.type.js +2 -2
  418. package/esm2015/infra/firebase/firestore/types/index.js +4 -4
  419. package/esm2015/infra/firebase/index.js +3 -3
  420. package/esm2015/infra/hasura-graphql/enums/hasura-graphql-column-type.enum.js +13 -13
  421. package/esm2015/infra/hasura-graphql/enums/hasura-graphql-where.enum.js +15 -15
  422. package/esm2015/infra/hasura-graphql/enums/index.js +3 -3
  423. package/esm2015/infra/hasura-graphql/index.js +5 -5
  424. package/esm2015/infra/hasura-graphql/mixins/helpers/attribute-option.helper.js +31 -31
  425. package/esm2015/infra/hasura-graphql/mixins/helpers/filter-option.helper.js +18 -18
  426. package/esm2015/infra/hasura-graphql/mixins/helpers/graphql-field.helper.js +70 -70
  427. package/esm2015/infra/hasura-graphql/mixins/helpers/index.js +4 -4
  428. package/esm2015/infra/hasura-graphql/mixins/index.js +8 -8
  429. package/esm2015/infra/hasura-graphql/mixins/with-create-hasura-graphql.mixin.js +45 -45
  430. package/esm2015/infra/hasura-graphql/mixins/with-crud-hasura-graphql.mixin.js +10 -10
  431. package/esm2015/infra/hasura-graphql/mixins/with-delete-hasura-graphql.mixin.js +29 -29
  432. package/esm2015/infra/hasura-graphql/mixins/with-find-hasura-graphql.mixin.js +93 -93
  433. package/esm2015/infra/hasura-graphql/mixins/with-get-hasura-graphql.mixin.js +35 -35
  434. package/esm2015/infra/hasura-graphql/mixins/with-hasura-graphql.mixin.js +94 -95
  435. package/esm2015/infra/hasura-graphql/mixins/with-update-hasura-graphql.mixin.js +56 -56
  436. package/esm2015/infra/hasura-graphql/models/category-hasura-graphql.js +4 -4
  437. package/esm2015/infra/hasura-graphql/models/index.js +5 -5
  438. package/esm2015/infra/hasura-graphql/models/kit-product-hasura-graphql.js +15 -15
  439. package/esm2015/infra/hasura-graphql/models/product-hasura-graphql.js +11 -11
  440. package/esm2015/infra/hasura-graphql/models/variant-hasura-graphql.js +9 -9
  441. package/esm2015/infra/hasura-graphql/repositories/catalog/category-hasura-graphql.repository.js +135 -135
  442. package/esm2015/infra/hasura-graphql/repositories/catalog/index.js +4 -4
  443. package/esm2015/infra/hasura-graphql/repositories/catalog/product-hasura-graphql.repository.js +369 -367
  444. package/esm2015/infra/hasura-graphql/repositories/catalog/variant-hasura-graphql.repository.js +100 -100
  445. package/esm2015/infra/hasura-graphql/repositories/index.js +2 -2
  446. package/esm2015/infra/hasura-graphql/types/fields.type.js +2 -2
  447. package/esm2015/infra/hasura-graphql/types/graphql.repository.type.js +2 -2
  448. package/esm2015/infra/hasura-graphql/types/hasura-graphql-auth-options.type.js +2 -2
  449. package/esm2015/infra/hasura-graphql/types/hasura-graphql-fields.type.js +2 -2
  450. package/esm2015/infra/hasura-graphql/types/hasura-graphql-headers.type.js +2 -2
  451. package/esm2015/infra/hasura-graphql/types/index.js +9 -9
  452. package/esm2015/infra/hasura-graphql/types/nested-field.type.js +2 -2
  453. package/esm2015/infra/hasura-graphql/types/query-builder-options.type.js +2 -2
  454. package/esm2015/infra/hasura-graphql/types/variable-options.type.js +2 -2
  455. package/esm2015/infra/index.js +4 -4
  456. package/esm2015/infrab4a-connect.js +4 -4
  457. package/esm2015/utils/index.js +8 -8
  458. package/esm2015/utils/is-uuid.js +3 -3
  459. package/esm2015/utils/mixins/base.mixin.js +6 -6
  460. package/esm2015/utils/mixins/index.js +4 -4
  461. package/esm2015/utils/mixins/merge-constructor-params.type.js +2 -2
  462. package/esm2015/utils/mixins/mixin-ctor.type.js +2 -2
  463. package/esm2015/utils/parse-datetime.js +14 -14
  464. package/esm2015/utils/types/array-element.type.js +2 -2
  465. package/esm2015/utils/types/index.js +3 -3
  466. package/esm2015/utils/types/prop.type.js +2 -2
  467. package/fesm2015/infrab4a-connect.js +2794 -2858
  468. package/fesm2015/infrab4a-connect.js.map +1 -1
  469. package/index.d.ts +5 -5
  470. package/infra/elasticsearch/adapters/axios.adapter.d.ts +11 -14
  471. package/infra/elasticsearch/adapters/elastic-search.adapter.d.ts +4 -7
  472. package/infra/elasticsearch/adapters/index.d.ts +2 -2
  473. package/infra/elasticsearch/index.d.ts +3 -3
  474. package/infra/elasticsearch/indexes/index.d.ts +1 -1
  475. package/infra/elasticsearch/indexes/products-index.d.ts +11 -15
  476. package/infra/elasticsearch/types/elastic-search-result.d.ts +7 -7
  477. package/infra/elasticsearch/types/index.d.ts +1 -1
  478. package/infra/firebase/auth/authentication-firebase-auth.service.d.ts +12 -12
  479. package/infra/firebase/auth/index.d.ts +2 -2
  480. package/infra/firebase/auth/register-firebase-auth.service.d.ts +8 -8
  481. package/infra/firebase/auth/types/firebase-user-with-id.type.d.ts +3 -3
  482. package/infra/firebase/firestore/index.d.ts +3 -3
  483. package/infra/firebase/firestore/mixins/index.d.ts +9 -9
  484. package/infra/firebase/firestore/mixins/with-create-firestore.mixin.d.ts +4 -4
  485. package/infra/firebase/firestore/mixins/with-crud-firestore.mixin.d.ts +4 -4
  486. package/infra/firebase/firestore/mixins/with-delete-firestore.mixin.d.ts +4 -4
  487. package/infra/firebase/firestore/mixins/with-find-firestore.mixin.d.ts +4 -4
  488. package/infra/firebase/firestore/mixins/with-firestore.mixin.d.ts +4 -4
  489. package/infra/firebase/firestore/mixins/with-get-firestore.mixin.d.ts +4 -4
  490. package/infra/firebase/firestore/mixins/with-helpers.mixin.d.ts +11 -11
  491. package/infra/firebase/firestore/mixins/with-sub-collection.mixin.d.ts +7 -7
  492. package/infra/firebase/firestore/mixins/with-update-firestore.mixin.d.ts +7 -7
  493. package/infra/firebase/firestore/models/user-search.d.ts +9 -9
  494. package/infra/firebase/firestore/repositories/catalog/category-firestore.repository.d.ts +17 -17
  495. package/infra/firebase/firestore/repositories/catalog/index.d.ts +4 -4
  496. package/infra/firebase/firestore/repositories/catalog/product-firestore.repository.d.ts +11 -11
  497. package/infra/firebase/firestore/repositories/catalog/product-variant-firestore.repository.d.ts +13 -13
  498. package/infra/firebase/firestore/repositories/catalog/subscription-product-firestore.repository.d.ts +8 -8
  499. package/infra/firebase/firestore/repositories/index.d.ts +4 -4
  500. package/infra/firebase/firestore/repositories/shop-settings/home-firestore.repository.d.ts +16 -16
  501. package/infra/firebase/firestore/repositories/shop-settings/index.d.ts +2 -2
  502. package/infra/firebase/firestore/repositories/shop-settings/shop-menu-firestore.repository.d.ts +8 -8
  503. package/infra/firebase/firestore/repositories/shopping/buy-2-win-firestore.repository.d.ts +8 -8
  504. package/infra/firebase/firestore/repositories/shopping/checkout-firestore.repository.d.ts +8 -8
  505. package/infra/firebase/firestore/repositories/shopping/checkout-subscription-firestore.repository.d.ts +8 -8
  506. package/infra/firebase/firestore/repositories/shopping/coupon-firestore.repository.d.ts +12 -12
  507. package/infra/firebase/firestore/repositories/shopping/index.d.ts +8 -8
  508. package/infra/firebase/firestore/repositories/shopping/legacy-order-firestore.repository.d.ts +7 -7
  509. package/infra/firebase/firestore/repositories/shopping/order-firestore.repository.d.ts +8 -8
  510. package/infra/firebase/firestore/repositories/shopping/payment-firestore.repository.d.ts +8 -8
  511. package/infra/firebase/firestore/repositories/shopping/subscription-plan-firestore.repository.d.ts +8 -8
  512. package/infra/firebase/firestore/repositories/users/index.d.ts +9 -9
  513. package/infra/firebase/firestore/repositories/users/lead-firestore.repository.d.ts +8 -8
  514. package/infra/firebase/firestore/repositories/users/subscription-edition-firestore.repository.d.ts +13 -13
  515. package/infra/firebase/firestore/repositories/users/subscription-firestore.repository.d.ts +8 -8
  516. package/infra/firebase/firestore/repositories/users/subscription-payment-firestore.repository.d.ts +13 -13
  517. package/infra/firebase/firestore/repositories/users/user-address-firestore.repository.d.ts +13 -13
  518. package/infra/firebase/firestore/repositories/users/user-beauty-profile-firestore.repository.d.ts +13 -13
  519. package/infra/firebase/firestore/repositories/users/user-firestore.repository.d.ts +19 -19
  520. package/infra/firebase/firestore/repositories/users/user-payment-method-firestore.repository.d.ts +13 -13
  521. package/infra/firebase/firestore/repositories/users/user-search-firestore.repository.d.ts +9 -9
  522. package/infra/firebase/firestore/types/firestore-sub.repository.type.d.ts +6 -6
  523. package/infra/firebase/firestore/types/firestore.helpers.type.d.ts +8 -8
  524. package/infra/firebase/firestore/types/firestore.repository.type.d.ts +12 -12
  525. package/infra/firebase/firestore/types/index.d.ts +3 -3
  526. package/infra/firebase/index.d.ts +2 -2
  527. package/infra/hasura-graphql/enums/hasura-graphql-column-type.enum.d.ts +11 -11
  528. package/infra/hasura-graphql/enums/hasura-graphql-where.enum.d.ts +13 -13
  529. package/infra/hasura-graphql/enums/index.d.ts +2 -2
  530. package/infra/hasura-graphql/index.d.ts +4 -4
  531. package/infra/hasura-graphql/mixins/helpers/attribute-option.helper.d.ts +13 -13
  532. package/infra/hasura-graphql/mixins/helpers/filter-option.helper.d.ts +6 -6
  533. package/infra/hasura-graphql/mixins/helpers/graphql-field.helper.d.ts +8 -8
  534. package/infra/hasura-graphql/mixins/helpers/index.d.ts +3 -3
  535. package/infra/hasura-graphql/mixins/index.d.ts +7 -7
  536. package/infra/hasura-graphql/mixins/with-create-hasura-graphql.mixin.d.ts +8 -8
  537. package/infra/hasura-graphql/mixins/with-crud-hasura-graphql.mixin.d.ts +11 -11
  538. package/infra/hasura-graphql/mixins/with-delete-hasura-graphql.mixin.d.ts +7 -7
  539. package/infra/hasura-graphql/mixins/with-find-hasura-graphql.mixin.d.ts +31 -31
  540. package/infra/hasura-graphql/mixins/with-get-hasura-graphql.mixin.d.ts +24 -24
  541. package/infra/hasura-graphql/mixins/with-hasura-graphql.mixin.d.ts +11 -11
  542. package/infra/hasura-graphql/mixins/with-update-hasura-graphql.mixin.d.ts +14 -14
  543. package/infra/hasura-graphql/models/category-hasura-graphql.d.ts +6 -6
  544. package/infra/hasura-graphql/models/index.d.ts +4 -4
  545. package/infra/hasura-graphql/models/kit-product-hasura-graphql.d.ts +6 -6
  546. package/infra/hasura-graphql/models/product-hasura-graphql.d.ts +9 -9
  547. package/infra/hasura-graphql/models/variant-hasura-graphql.d.ts +9 -9
  548. package/infra/hasura-graphql/repositories/catalog/category-hasura-graphql.repository.d.ts +22 -22
  549. package/infra/hasura-graphql/repositories/catalog/index.d.ts +3 -3
  550. package/infra/hasura-graphql/repositories/catalog/product-hasura-graphql.repository.d.ts +26 -26
  551. package/infra/hasura-graphql/repositories/catalog/variant-hasura-graphql.repository.d.ts +13 -13
  552. package/infra/hasura-graphql/repositories/index.d.ts +1 -1
  553. package/infra/hasura-graphql/types/fields.type.d.ts +2 -2
  554. package/infra/hasura-graphql/types/graphql.repository.type.d.ts +21 -21
  555. package/infra/hasura-graphql/types/hasura-graphql-auth-options.type.d.ts +8 -8
  556. package/infra/hasura-graphql/types/hasura-graphql-fields.type.d.ts +36 -36
  557. package/infra/hasura-graphql/types/hasura-graphql-headers.type.d.ts +7 -7
  558. package/infra/hasura-graphql/types/index.d.ts +8 -8
  559. package/infra/hasura-graphql/types/nested-field.type.d.ts +7 -7
  560. package/infra/hasura-graphql/types/query-builder-options.type.d.ts +7 -7
  561. package/infra/hasura-graphql/types/variable-options.type.d.ts +9 -9
  562. package/infra/index.d.ts +3 -3
  563. package/infrab4a-connect.d.ts +5 -5
  564. package/package.json +1 -1
  565. package/utils/index.d.ts +7 -7
  566. package/utils/is-uuid.d.ts +1 -1
  567. package/utils/mixins/base.mixin.d.ts +3 -3
  568. package/utils/mixins/index.d.ts +3 -3
  569. package/utils/mixins/merge-constructor-params.type.d.ts +3 -3
  570. package/utils/mixins/mixin-ctor.type.d.ts +1 -1
  571. package/utils/parse-datetime.d.ts +1 -1
  572. package/utils/types/array-element.type.d.ts +1 -1
  573. package/utils/types/index.d.ts +2 -2
  574. package/utils/types/prop.type.d.ts +1 -1
@@ -1,367 +1,369 @@
1
- import { __awaiter, __rest } from "tslib";
2
- import { Shops, Where, } from '../../../../domain';
3
- import { NotFoundError } from '../../../../errors';
4
- import { Base, isNil, omit } from '../../../../utils';
5
- import { HasuraGraphQLColumnType, HasuraGraphQLWhere } from '../../enums';
6
- import { withCrudHasuraGraphQL, withHasuraGraphQL } from '../../mixins';
7
- import { ProductHasuraGraphQL } from '../../models';
8
- export class ProductHasuraGraphQLRepository extends withCrudHasuraGraphQL(withHasuraGraphQL(Base)) {
9
- constructor(endpoint, authOptions) {
10
- super({
11
- tableName: 'product',
12
- model: ProductHasuraGraphQL,
13
- endpoint,
14
- authOptions,
15
- fields: [],
16
- });
17
- this.bindReviewToModel = (plain) => (Object.assign(Object.assign({}, omit(plain, ['product_id', 'created_at', 'updated_at', 'person_id', 'order_id'])), { createdAt: typeof plain.created_at === 'string' ? new Date(plain.created_at) : plain.created_at, updatedAt: typeof plain.updated_at === 'string' ? new Date(plain.updated_at) : plain.updated_at, personId: plain.person_id, orderId: plain.order_id }));
18
- this.bindReviewToHasura = (review) => (Object.assign(Object.assign({}, omit(review, ['productId', 'createdAt', 'updatedAt', 'personId', 'orderId'])), { person_id: review.personId, order_id: review.orderId }));
19
- const commonFields = [
20
- { id: { columnName: 'id', to: (value) => +value, from: (value) => value.toString() } },
21
- { firestoreId: { columnName: 'firestore_id' } },
22
- { CEST: { columnName: 'cest' } },
23
- { EAN: { columnName: 'ean' } },
24
- { NCM: { columnName: 'ncm' } },
25
- 'brand',
26
- { costPrice: { columnName: 'cost_price' } },
27
- {
28
- description: {
29
- columnName: 'description',
30
- from: (description) => Object.values(Shops).reduce((shops, shop) => (Object.assign(Object.assign({}, shops), { [shop]: { description } })), {}),
31
- to: (value) => Object.values(value).shift().description,
32
- },
33
- },
34
- { hasVariants: { columnName: 'has_variants' } },
35
- { images: { columnName: 'images', to: (value) => { var _a; return `{"${((_a = value === null || value === void 0 ? void 0 : value.join) === null || _a === void 0 ? void 0 : _a.call(value, `","`)) || ''}"}`; } } },
36
- { miniatures: { columnName: 'miniatures', to: (value) => { var _a; return `{"${((_a = value === null || value === void 0 ? void 0 : value.join) === null || _a === void 0 ? void 0 : _a.call(value, `","`)) || ''}"}`; } } },
37
- 'name',
38
- {
39
- price: {
40
- columnName: 'price',
41
- from: (price, data) => Object.values(Shops).reduce((prices, shop) => (Object.assign(Object.assign({}, prices), { [shop]: {
42
- price,
43
- fullPrice: data.full_price,
44
- subscriberDiscountPercentage: data.subscriber_discount_percentage,
45
- subscriberPrice: data.subscriber_price,
46
- } })), {}),
47
- bindFindFilter: (sentence) => {
48
- const filters = Object.values(sentence).shift();
49
- return Object.assign(Object.assign(Object.assign(Object.assign({}, (((filters === null || filters === void 0 ? void 0 : filters.price) || (filters === null || filters === void 0 ? void 0 : filters.price) === 0) && { price: filters.price })), ((filters.fullPrice || filters.fullPrice === 0) && { full_price: filters.fullPrice })), ((filters.subscriberDiscountPercentage || filters.subscriberDiscountPercentage === 0) && {
50
- subscriber_discount_percentage: filters.subscriberDiscountPercentage,
51
- })), ((filters.subscriberPrice || filters.subscriberPrice === 0) && {
52
- subscriber_price: filters.subscriberPrice,
53
- }));
54
- },
55
- bindPersistData: (value) => {
56
- const priceData = Object.values(value).shift();
57
- return Object.assign(Object.assign(Object.assign(Object.assign({}, ((priceData === null || priceData === void 0 ? void 0 : priceData.price) >= 0 && { price: priceData.price })), (priceData.fullPrice >= 0 && { full_price: priceData.fullPrice })), (priceData.subscriberDiscountPercentage >= 0 && {
58
- subscriber_discount_percentage: priceData.subscriberDiscountPercentage,
59
- })), (priceData.subscriberPrice >= 0 && { subscriber_price: priceData.subscriberPrice }));
60
- },
61
- },
62
- },
63
- { fullPrice: { columnName: 'full_price' } },
64
- { subscriberDiscountPercentage: { columnName: 'subscriber_discount_percentage' } },
65
- { subscriberPrice: { columnName: 'subscriber_price' } },
66
- 'published',
67
- { publishedGlam: { columnName: 'published_glam' } },
68
- 'sku',
69
- {
70
- stock: {
71
- columnName: 'stock',
72
- from: (quantity) => ({ quantity }),
73
- to: (value) => (isNil(value === null || value === void 0 ? void 0 : value.quantity) ? value : value === null || value === void 0 ? void 0 : value.quantity),
74
- },
75
- },
76
- 'slug',
77
- 'type',
78
- 'video',
79
- 'weight',
80
- {
81
- shopAvailability: {
82
- columnName: 'shop_availabilities',
83
- fields: ['shop'],
84
- from: (shop) => (Array.isArray(shop) ? shop.map((row) => row.shop) : []),
85
- to: (shops) => shops.map((shop) => ({ shop })),
86
- },
87
- },
88
- { tags: { columnName: 'tags', type: HasuraGraphQLColumnType.Jsonb } },
89
- { isKit: { columnName: 'is_kit' } },
90
- { createdAt: { columnName: 'created_at' } },
91
- { updatedAt: { columnName: 'updated_at' } },
92
- ];
93
- this.fields = [
94
- ...commonFields,
95
- {
96
- categories: {
97
- columnName: 'categories',
98
- fields: ['category_id'],
99
- bindPersistData: (value) => ({
100
- categories: { data: value.map((category) => ({ category_id: +category })) },
101
- }),
102
- to: (categories) => categories.map((categoryId) => +categoryId),
103
- from: (categories) => (categories === null || categories === void 0 ? void 0 : categories.map((category) => { var _a; return (_a = category === null || category === void 0 ? void 0 : category.category_id) === null || _a === void 0 ? void 0 : _a.toString(); })) || [],
104
- },
105
- },
106
- {
107
- kitProducts: {
108
- columnName: 'kit_products',
109
- foreignKeyColumn: { productId: 'id' },
110
- fields: [
111
- { productId: { columnName: 'product_id' } },
112
- { kitProductId: { columnName: 'kit_product_id' } },
113
- 'quantity',
114
- { product: { columnName: 'product', foreignKeyColumn: { id: 'product_id' }, fields: commonFields } },
115
- ],
116
- },
117
- },
118
- ];
119
- }
120
- get reviewsFields() {
121
- return [
122
- 'id',
123
- 'shop',
124
- 'rate',
125
- 'author',
126
- 'email',
127
- 'location',
128
- 'review',
129
- 'status',
130
- 'title',
131
- 'person_id',
132
- 'points',
133
- 'order_id',
134
- 'created_at',
135
- 'updated_at',
136
- ];
137
- }
138
- create(data) {
139
- const _super = Object.create(null, {
140
- create: { get: () => super.create }
141
- });
142
- return __awaiter(this, void 0, void 0, function* () {
143
- const product = yield _super.create.call(this, omit(data, ['reviews']));
144
- try {
145
- product.reviews = yield this.updateReviews(+product.id, data);
146
- }
147
- catch (error) {
148
- yield this.delete({ id: product.id });
149
- throw error;
150
- }
151
- return product;
152
- });
153
- }
154
- get(identifiers) {
155
- const _super = Object.create(null, {
156
- get: { get: () => super.get }
157
- });
158
- var _a;
159
- return __awaiter(this, void 0, void 0, function* () {
160
- const product = Number.isNaN(+identifiers.id)
161
- ? (_a = (yield this.find({ filters: { firestoreId: identifiers.id } })).data) === null || _a === void 0 ? void 0 : _a[0]
162
- : yield _super.get.call(this, identifiers);
163
- product.reviews = yield this.findReviewsByProduct(+product.id);
164
- return product;
165
- });
166
- }
167
- getBySlug(slug, shop) {
168
- var _a;
169
- return __awaiter(this, void 0, void 0, function* () {
170
- const result = yield this.find({
171
- filters: {
172
- slug: { operator: Where.EQUALS, value: slug },
173
- shopAvailability: { operator: Where.IN, value: [shop] },
174
- },
175
- });
176
- return (_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a.shift();
177
- });
178
- }
179
- update(params) {
180
- const _super = Object.create(null, {
181
- update: { get: () => super.update }
182
- });
183
- return __awaiter(this, void 0, void 0, function* () {
184
- const { categories, kitProducts, reviews, id: checkId } = params, data = __rest(params, ["categories", "kitProducts", "reviews", "id"]);
185
- const plainData = this.paramsToPlain({ id: checkId });
186
- const id = yield this.getId(plainData.id);
187
- const product = yield _super.update.call(this, Object.assign({ id }, data));
188
- product.categories = categories && (yield this.updateCategories(+id, { categories }));
189
- product.kitProducts = kitProducts && (yield this.updateKitProducts(+id, { kitProducts }));
190
- product.reviews = reviews && (yield this.updateReviews(+id, { reviews }));
191
- return product;
192
- });
193
- }
194
- fetchReviews(status) {
195
- return __awaiter(this, void 0, void 0, function* () {
196
- const reviews = {
197
- status: status === 'pending'
198
- ? { [HasuraGraphQLWhere.ISNULL]: true }
199
- : { [HasuraGraphQLWhere.EQUALS]: status === 'approved' },
200
- };
201
- const { product: data } = yield this.query('product', ['id', 'name', 'sku', { reviews: { columnName: 'reviews', fields: this.reviewsFields } }], {
202
- where: { value: { reviews }, type: 'product_bool_exp', required: true },
203
- });
204
- return data.reduce((reviews, product) => [
205
- ...reviews,
206
- ...product.reviews
207
- .filter((review) => (status === 'pending' && [undefined, null].includes(review.status)) ||
208
- (status === 'approved' && review.status === true) ||
209
- (status === 'rejected' && review.status === false))
210
- .map((review) => (Object.assign(Object.assign({}, this.bindReviewToModel(review)), { productId: product.id, productName: product.name, productSku: product.sku }))),
211
- ], []);
212
- });
213
- }
214
- updateCategories(productId, { categories }) {
215
- return __awaiter(this, void 0, void 0, function* () {
216
- const plainData = this.paramsToPlain({ categories });
217
- yield this.mutation('delete_category_product', ['affected_rows'], {
218
- where: {
219
- type: 'category_product_bool_exp',
220
- required: true,
221
- value: { product_id: { _eq: productId } },
222
- },
223
- });
224
- yield this.mutation('insert_category_product', ['affected_rows'], {
225
- objects: {
226
- type: '[category_product_insert_input!]',
227
- required: true,
228
- value: plainData.categories.map((categoryId) => ({ category_id: categoryId, product_id: productId })),
229
- },
230
- });
231
- return plainData.categories;
232
- });
233
- }
234
- updateKitProducts(productId, { kitProducts }) {
235
- return __awaiter(this, void 0, void 0, function* () {
236
- const plainData = this.paramsToPlain({ kitProducts });
237
- yield this.mutation('delete_product_kit', ['affected_rows'], {
238
- where: {
239
- type: 'product_kit_bool_exp',
240
- required: true,
241
- value: { product_id: { _eq: productId } },
242
- },
243
- });
244
- yield this.mutation('insert_product_kit', ['affected_rows'], {
245
- objects: {
246
- type: '[product_kit_insert_input!]',
247
- required: true,
248
- value: plainData.kitProducts.map((kitProduct) => ({
249
- kit_product_id: kitProduct.productId || kitProduct.product.id,
250
- product_id: productId,
251
- quantity: kitProduct.quantity,
252
- })),
253
- },
254
- });
255
- return plainData.kitProducts;
256
- });
257
- }
258
- updateReviews(productId, { reviews }) {
259
- return __awaiter(this, void 0, void 0, function* () {
260
- if (!reviews)
261
- return [];
262
- if ('action' in reviews && reviews.action === 'remove') {
263
- const reviewIds = yield Promise.all(reviews.value.map((reviewData) => __awaiter(this, void 0, void 0, function* () {
264
- const review = yield this.findReview(reviewData, productId);
265
- return review === null || review === void 0 ? void 0 : review.id;
266
- })));
267
- yield this.mutation('delete_product_review', ['affected_rows'], {
268
- where: { value: { id: { _in: reviewIds.filter(Boolean) } }, type: 'product_review_bool_exp', required: true },
269
- });
270
- return reviews.value.map((review, index) => !reviewIds[index] && review).filter(Boolean);
271
- }
272
- const plainData = this.paramsToPlain({ reviews });
273
- return Promise.all(plainData.reviews.map((reviewData) => __awaiter(this, void 0, void 0, function* () {
274
- const review = yield this.findReview(reviewData, productId);
275
- if (review)
276
- return this.bindReviewToModel((yield this.mutation('update_product_review_by_pk', this.reviewsFields, {
277
- pk_columns: {
278
- value: { id: review.id },
279
- type: 'product_review_pk_columns_input',
280
- required: true,
281
- },
282
- _set: {
283
- value: omit(this.bindReviewToHasura(reviewData), ['id', 'product_id']),
284
- type: 'product_review_set_input',
285
- required: true,
286
- },
287
- })).update_product_review_by_pk);
288
- return this.bindReviewToModel((yield this.mutation('insert_product_review_one', this.reviewsFields, {
289
- object: {
290
- value: omit(Object.assign(Object.assign({}, this.bindReviewToHasura(reviewData)), { product_id: productId }), ['id']),
291
- type: 'product_review_insert_input',
292
- required: true,
293
- },
294
- })).insert_product_review_one);
295
- })));
296
- });
297
- }
298
- getId(id) {
299
- var _a, _b;
300
- return __awaiter(this, void 0, void 0, function* () {
301
- if (!Number.isNaN(+id))
302
- return id;
303
- const { data } = yield this.find({ filters: { firestoreId: id } });
304
- if ((_a = data === null || data === void 0 ? void 0 : data[0]) === null || _a === void 0 ? void 0 : _a.id)
305
- return (_b = data === null || data === void 0 ? void 0 : data[0]) === null || _b === void 0 ? void 0 : _b.id;
306
- throw new NotFoundError(`Product with id ${id} not found`);
307
- });
308
- }
309
- findReviewsByProduct(productId) {
310
- return __awaiter(this, void 0, void 0, function* () {
311
- const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
312
- where: {
313
- value: {
314
- product_id: { _eq: productId },
315
- },
316
- type: 'product_review_bool_exp',
317
- required: true,
318
- },
319
- });
320
- return data && data.map((review) => this.bindReviewToModel(review));
321
- });
322
- }
323
- findReview(review, productId) {
324
- return __awaiter(this, void 0, void 0, function* () {
325
- if (review.id)
326
- return review;
327
- let loadedReview;
328
- if (review.personId)
329
- loadedReview = yield this.getReviewByPersonId(review.personId, productId);
330
- if (!loadedReview && review.author && review.email)
331
- loadedReview = yield this.getReviewByAuthorAndEmail(review.author, review.email, productId);
332
- return loadedReview || review;
333
- });
334
- }
335
- getReviewByPersonId(personId, productId) {
336
- return __awaiter(this, void 0, void 0, function* () {
337
- const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
338
- where: {
339
- value: {
340
- product_id: { _eq: productId },
341
- person_id: { _eq: personId },
342
- },
343
- type: `product_review_bool_exp`,
344
- required: true,
345
- },
346
- });
347
- return data && data[0] && this.bindReviewToModel(data[0]);
348
- });
349
- }
350
- getReviewByAuthorAndEmail(author, email, productId) {
351
- return __awaiter(this, void 0, void 0, function* () {
352
- const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
353
- where: {
354
- value: {
355
- product_id: { _eq: productId },
356
- author: { _eq: author },
357
- email: { _eq: email },
358
- },
359
- type: `product_review_bool_exp`,
360
- required: true,
361
- },
362
- });
363
- return data && data[0] && this.bindReviewToModel(data[0]);
364
- });
365
- }
366
- }
367
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC9zcmMvaW5mcmEvaGFzdXJhLWdyYXBocWwvcmVwb3NpdG9yaWVzL2NhdGFsb2cvcHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBT0wsS0FBSyxFQUdMLEtBQUssR0FDTixNQUFNLG9CQUFvQixDQUFBO0FBQzNCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDekUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQW9CbkQsTUFBTSxPQUFPLDhCQUNYLFNBQVEscUJBQXFCLENBQUMsaUJBQWlCLENBQXVCLElBQUksQ0FBQyxDQUFDO0lBc0I1RSxZQUFZLFFBQWdCLEVBQUUsV0FBcUM7UUFDakUsS0FBSyxDQUFDO1lBQ0osU0FBUyxFQUFFLFNBQVM7WUFDcEIsS0FBSyxFQUFFLG9CQUFvQjtZQUMzQixRQUFRO1lBQ1IsV0FBVztZQUNYLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQyxDQUFBO1FBdVlJLHNCQUFpQixHQUFHLENBQUMsS0FBMEIsRUFBaUIsRUFBRSxDQUFDLGlDQUN0RSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEtBQ25GLFNBQVMs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LElBQUksRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN0RixLQUFLLEVBQUU7b0JBQ0wsS0FBSyxFQUFFO3dCQUNMLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUU7d0JBQzlCLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUU7d0JBQ3ZCLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUU7cUJBQ3RCO29CQUNELElBQUksRUFBRSx5QkFBeUI7b0JBQy9CLFFBQVEsRUFBRSxJQUFJO2lCQUNmO2FBQ0YsQ0FBQyxDQUFBO1lBRUYsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUMzRCxDQUFDO0tBQUE7Q0FlRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENyZWF0ZVJlcG9zaXRvcnlQYXJhbXMsXG4gIEdldFJlcG9zaXRvcnlQYXJhbXMsXG4gIFByb2R1Y3RSZXBvc2l0b3J5LFxuICBQcm9kdWN0UmV2aWV3LFxuICBSZXZpZXdTdGF0dXNQYXJhbXMsXG4gIFJldmlld1dpdGhQcm9kdWN0RGF0YSxcbiAgU2hvcHMsXG4gIFNob3BzUHJpY2UsXG4gIFVwZGF0ZVJlcG9zaXRvcnlQYXJhbXMsXG4gIFdoZXJlLFxufSBmcm9tICcuLi8uLi8uLi8uLi9kb21haW4nXG5pbXBvcnQgeyBOb3RGb3VuZEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vZXJyb3JzJ1xuaW1wb3J0IHsgQmFzZSwgaXNOaWwsIG9taXQgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscydcbmltcG9ydCB7IEhhc3VyYUdyYXBoUUxDb2x1bW5UeXBlLCBIYXN1cmFHcmFwaFFMV2hlcmUgfSBmcm9tICcuLi8uLi9lbnVtcydcbmltcG9ydCB7IHdpdGhDcnVkSGFzdXJhR3JhcGhRTCwgd2l0aEhhc3VyYUdyYXBoUUwgfSBmcm9tICcuLi8uLi9taXhpbnMnXG5pbXBvcnQgeyBQcm9kdWN0SGFzdXJhR3JhcGhRTCB9IGZyb20gJy4uLy4uL21vZGVscydcbmltcG9ydCB7IEhhc3VyYUdyYXBoUUxBdXRoT3B0aW9ucywgSGFzdXJhR3JhcGhRTEZpZWxkcyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuXG50eXBlIFByb2R1Y3RSZXZpZXdGaWVsZHMgPSB7XG4gIGlkPzogc3RyaW5nXG4gIHNob3A6IFNob3BzXG4gIHJhdGU6IG51bWJlclxuICBhdXRob3I/OiBzdHJpbmdcbiAgZW1haWw/OiBzdHJpbmdcbiAgbG9jYXRpb24/OiBzdHJpbmdcbiAgcmV2aWV3Pzogc3RyaW5nXG4gIHN0YXR1cz86IGJvb2xlYW5cbiAgdGl0bGU/OiBzdHJpbmdcbiAgcGVyc29uX2lkPzogbnVtYmVyXG4gIHBvaW50cz86IG51bWJlclxuICBvcmRlcl9pZD86IHN0cmluZ1xuICBjcmVhdGVkX2F0PzogRGF0ZVxuICB1cGRhdGVkX2F0PzogRGF0ZVxufVxuXG5leHBvcnQgY2xhc3MgUHJvZHVjdEhhc3VyYUdyYXBoUUxSZXBvc2l0b3J5XG4gIGV4dGVuZHMgd2l0aENydWRIYXN1cmFHcmFwaFFMKHdpdGhIYXN1cmFHcmFwaFFMPFByb2R1Y3RIYXN1cmFHcmFwaFFMPihCYXNlKSlcbiAgaW1wbGVtZW50cyBQcm9kdWN0UmVwb3NpdG9yeVxue1xuICBwcml2YXRlIGdldCByZXZpZXdzRmllbGRzKCk6IEFycmF5PGtleW9mIFByb2R1Y3RSZXZpZXdGaWVsZHM+IHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2lkJyxcbiAgICAgICdzaG9wJyxcbiAgICAgICdyYXRlJyxcbiAgICAgICdhdXRob3InLFxuICAgICAgJ2VtYWlsJyxcbiAgICAgICdsb2NhdGlvbicsXG4gICAgICAncmV2aWV3JyxcbiAgICAgICdzdGF0dXMnLFxuICAgICAgJ3RpdGxlJyxcbiAgICAgICdwZXJzb25faWQnLFxuICAgICAgJ3BvaW50cycsXG4gICAgICAnb3JkZXJfaWQnLFxuICAgICAgJ2NyZWF0ZWRfYXQnLFxuICAgICAgJ3VwZGF0ZWRfYXQnLFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGVuZHBvaW50OiBzdHJpbmcsIGF1dGhPcHRpb25zOiBIYXN1cmFHcmFwaFFMQXV0aE9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICB0YWJsZU5hbWU6ICdwcm9kdWN0JyxcbiAgICAgIG1vZGVsOiBQcm9kdWN0SGFzdXJhR3JhcGhRTCxcbiAgICAgIGVuZHBvaW50LFxuICAgICAgYXV0aE9wdGlvbnMsXG4gICAgICBmaWVsZHM6IFtdLFxuICAgIH0pXG5cbiAgICBjb25zdCBjb21tb25GaWVsZHM6IEhhc3VyYUdyYXBoUUxGaWVsZHM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+ID0gW1xuICAgICAgeyBpZDogeyBjb2x1bW5OYW1lOiAnaWQnLCB0bzogKHZhbHVlKSA9PiArdmFsdWUsIGZyb206ICh2YWx1ZSkgPT4gdmFsdWUudG9TdHJpbmcoKSB9IH0sXG4gICAgICB7IGZpcmVzdG9yZUlkOiB7IGNvbHVtbk5hbWU6ICdmaXJlc3RvcmVfaWQnIH0gfSxcbiAgICAgIHsgQ0VTVDogeyBjb2x1bW5OYW1lOiAnY2VzdCcgfSB9LFxuICAgICAgeyBFQU46IHsgY29sdW1uTmFtZTogJ2VhbicgfSB9LFxuICAgICAgeyBOQ006IHsgY29sdW1uTmFtZTogJ25jbScgfSB9LFxuICAgICAgJ2JyYW5kJyxcbiAgICAgIHsgY29zdFByaWNlOiB7IGNvbHVtbk5hbWU6ICdjb3N0X3ByaWNlJyB9IH0sXG4gICAgICB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICAgICAgY29sdW1uTmFtZTogJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICBmcm9tOiAoZGVzY3JpcHRpb24pID0+XG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKFNob3BzKS5yZWR1Y2UoKHNob3BzLCBzaG9wKSA9PiAoeyAuLi5zaG9wcywgW3Nob3BdOiB7IGRlc2NyaXB0aW9uIH0gfSksIHt9KSxcbiAgICAgICAgICB0bzogKHZhbHVlKSA9PiBPYmplY3QudmFsdWVzKHZhbHVlKS5zaGlmdCgpLmRlc2NyaXB0aW9uLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHsgaGFzVmFyaWFudHM6IHsgY29sdW1uTmFtZTogJ2hhc192YXJpYW50cycgfSB9LFxuICAgICAgeyBpbWFnZXM6IHsgY29sdW1uTmFtZTogJ2ltYWdlcycsIHRvOiAodmFsdWUpID0+IGB7XCIke3ZhbHVlPy5qb2luPy4oYFwiLFwiYCkgfHwgJyd9XCJ9YCB9IH0sXG4gICAgICB7IG1pbmlhdHVyZXM6IHsgY29sdW1uTmFtZTogJ21pbmlhdHVyZXMnLCB0bzogKHZhbHVlKSA9PiBge1wiJHt2YWx1ZT8uam9pbj8uKGBcIixcImApIHx8ICcnfVwifWAgfSB9LFxuICAgICAgJ25hbWUnLFxuICAgICAge1xuICAgICAgICBwcmljZToge1xuICAgICAgICAgIGNvbHVtbk5hbWU6ICdwcmljZScsXG4gICAgICAgICAgZnJvbTogKHByaWNlLCBkYXRhKTogU2hvcHNQcmljZSA9PlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhTaG9wcykucmVkdWNlKFxuICAgICAgICAgICAgICAocHJpY2VzOiBTaG9wc1ByaWNlLCBzaG9wKSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnByaWNlcyxcbiAgICAgICAgICAgICAgICBbc2hvcF06IHtcbiAgICAgICAgICAgICAgICAgIHByaWNlLFxuICAgICAgICAgICAgICAgICAgZnVsbFByaWNlOiBkYXRhLmZ1bGxfcHJpY2UsXG4gICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlOiBkYXRhLnN1YnNjcmliZXJfZGlzY291bnRfcGVyY2VudGFnZSxcbiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJQcmljZTogZGF0YS5zdWJzY3JpYmVyX3ByaWNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgYmluZEZpbmRGaWx0ZXI6IChzZW50ZW5jZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IE9iamVjdC52YWx1ZXMoc2VudGVuY2UpLnNoaWZ0KClcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uKChmaWx0ZXJzPy5wcmljZSB8fCBmaWx0ZXJzPy5wcmljZSA9PT0gMCkgJiYgeyBwcmljZTogZmlsdGVycy5wcmljZSB9KSxcbiAgICAgICAgICAgICAgLi4uKChmaWx0ZXJzLmZ1bGxQcmljZSB8fCBmaWx0ZXJzLmZ1bGxQcmljZSA9PT0gMCkgJiYgeyBmdWxsX3ByaWNlOiBmaWx0ZXJzLmZ1bGxQcmljZSB9KSxcbiAgICAgICAgICAgICAgLi4uKChmaWx0ZXJzLnN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2UgfHwgZmlsdGVycy5zdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlID09PSAwKSAmJiB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlcl9kaXNjb3VudF9wZXJjZW50YWdlOiBmaWx0ZXJzLnN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAuLi4oKGZpbHRlcnMuc3Vic2NyaWJlclByaWNlIHx8IGZpbHRlcnMuc3Vic2NyaWJlclByaWNlID09PSAwKSAmJiB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlcl9wcmljZTogZmlsdGVycy5zdWJzY3JpYmVyUHJpY2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYmluZFBlcnNpc3REYXRhOiAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByaWNlRGF0YSA9IE9iamVjdC52YWx1ZXModmFsdWUpLnNoaWZ0KClcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uKHByaWNlRGF0YT8ucHJpY2UgPj0gMCAmJiB7IHByaWNlOiBwcmljZURhdGEucHJpY2UgfSksXG4gICAgICAgICAgICAgIC4uLihwcmljZURhdGEuZnVsbFByaWNlID49IDAgJiYgeyBmdWxsX3ByaWNlOiBwcmljZURhdGEuZnVsbFByaWNlIH0pLFxuICAgICAgICAgICAgICAuLi4ocHJpY2VEYXRhLnN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2UgPj0gMCAmJiB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlcl9kaXNjb3VudF9wZXJjZW50YWdlOiBwcmljZURhdGEuc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC4uLihwcmljZURhdGEuc3Vic2NyaWJlclByaWNlID49IDAgJiYgeyBzdWJzY3JpYmVyX3ByaWNlOiBwcmljZURhdGEuc3Vic2NyaWJlclByaWNlIH0pLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgeyBmdWxsUHJpY2U6IHsgY29sdW1uTmFtZTogJ2Z1bGxfcHJpY2UnIH0gfSxcbiAgICAgIHsgc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZTogeyBjb2x1bW5OYW1lOiAnc3Vic2NyaWJlcl9kaXNjb3VudF9wZXJjZW50YWdlJyB9IH0sXG4gICAgICB7IHN1YnNjcmliZXJQcmljZTogeyBjb2x1bW5OYW1lOiAnc3Vic2NyaWJlcl9wcmljZScgfSB9LFxuICAgICAgJ3B1Ymxpc2hlZCcsXG4gICAgICB7IHB1Ymxpc2hlZEdsYW06IHsgY29sdW1uTmFtZTogJ3B1Ymxpc2hlZF9nbGFtJyB9IH0sXG4gICAgICAnc2t1JyxcbiAgICAgIHtcbiAgICAgICAgc3RvY2s6IHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiAnc3RvY2snLFxuICAgICAgICAgIGZyb206IChxdWFudGl0eTogbnVtYmVyKSA9PiAoeyBxdWFudGl0eSB9KSxcbiAgICAgICAgICB0bzogKHZhbHVlKSA9PiAoaXNOaWwodmFsdWU/LnF1YW50aXR5KSA/IHZhbHVlIDogdmFsdWU/LnF1YW50aXR5KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAnc2x1ZycsXG4gICAgICAndHlwZScsXG4gICAgICAndmlkZW8nLFxuICAgICAgJ3dlaWdodCcsXG4gICAgICB7XG4gICAgICAgIHNob3BBdmFpbGFiaWxpdHk6IHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiAnc2hvcF9hdmFpbGFiaWxpdGllcycsXG4gICAgICAgICAgZmllbGRzOiBbJ3Nob3AnXSxcbiAgICAgICAgICBmcm9tOiAoc2hvcCkgPT4gKEFycmF5LmlzQXJyYXkoc2hvcCkgPyBzaG9wLm1hcCgocm93OiB7IHNob3A6IFNob3BzIH0pID0+IHJvdy5zaG9wKSA6IFtdKSxcbiAgICAgICAgICB0bzogKHNob3BzKSA9PiBzaG9wcy5tYXAoKHNob3A6IFNob3BzKSA9PiAoeyBzaG9wIH0pKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7IHRhZ3M6IHsgY29sdW1uTmFtZTogJ3RhZ3MnLCB0eXBlOiBIYXN1cmFHcmFwaFFMQ29sdW1uVHlwZS5Kc29uYiB9IH0sXG4gICAgICB7IGlzS2l0OiB7IGNvbHVtbk5hbWU6ICdpc19raXQnIH0gfSxcbiAgICAgIHsgY3JlYXRlZEF0OiB7IGNvbHVtbk5hbWU6ICdjcmVhdGVkX2F0JyB9IH0sXG4gICAgICB7IHVwZGF0ZWRBdDogeyBjb2x1bW5OYW1lOiAndXBkYXRlZF9hdCcgfSB9LFxuICAgIF1cblxuICAgIHRoaXMuZmllbGRzID0gW1xuICAgICAgLi4uY29tbW9uRmllbGRzLFxuICAgICAge1xuICAgICAgICBjYXRlZ29yaWVzOiB7XG4gICAgICAgICAgY29sdW1uTmFtZTogJ2NhdGVnb3JpZXMnLFxuICAgICAgICAgIGZpZWxkczogWydjYXRlZ29yeV9pZCddLFxuICAgICAgICAgIGJpbmRQZXJzaXN0RGF0YTogKHZhbHVlKSA9PiAoe1xuICAgICAgICAgICAgY2F0ZWdvcmllczogeyBkYXRhOiB2YWx1ZS5tYXAoKGNhdGVnb3J5KSA9PiAoeyBjYXRlZ29yeV9pZDogK2NhdGVnb3J5IH0pKSB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRvOiAoY2F0ZWdvcmllcykgPT4gY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5SWQpID0+ICtjYXRlZ29yeUlkKSxcbiAgICAgICAgICBmcm9tOiAoY2F0ZWdvcmllczogeyBjYXRlZ29yeV9pZDogbnVtYmVyIH1bXSkgPT5cbiAgICAgICAgICAgIGNhdGVnb3JpZXM/Lm1hcCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5Py5jYXRlZ29yeV9pZD8udG9TdHJpbmcoKSkgfHwgW10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBraXRQcm9kdWN0czoge1xuICAgICAgICAgIGNvbHVtbk5hbWU6ICdraXRfcHJvZHVjdHMnLFxuICAgICAgICAgIGZvcmVpZ25LZXlDb2x1bW46IHsgcHJvZHVjdElkOiAnaWQnIH0sXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7IHByb2R1Y3RJZDogeyBjb2x1bW5OYW1lOiAncHJvZHVjdF9pZCcgfSB9LFxuICAgICAgICAgICAgeyBraXRQcm9kdWN0SWQ6IHsgY29sdW1uTmFtZTogJ2tpdF9wcm9kdWN0X2lkJyB9IH0sXG4gICAgICAgICAgICAncXVhbnRpdHknLFxuICAgICAgICAgICAgeyBwcm9kdWN0OiB7IGNvbHVtbk5hbWU6ICdwcm9kdWN0JywgZm9yZWlnbktleUNvbHVtbjogeyBpZDogJ3Byb2R1Y3RfaWQnIH0sIGZpZWxkczogY29tbW9uRmllbGRzIH0gfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdXG4gIH1cblxuICBhc3luYyBjcmVhdGUoZGF0YTogQ3JlYXRlUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4pOiBQcm9taXNlPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiB7XG4gICAgY29uc3QgcHJvZHVjdCA9IGF3YWl0IHN1cGVyLmNyZWF0ZShvbWl0KGRhdGEsIFsncmV2aWV3cyddKSlcblxuICAgIHRyeSB7XG4gICAgICBwcm9kdWN0LnJldmlld3MgPSBhd2FpdCB0aGlzLnVwZGF0ZVJldmlld3MoK3Byb2R1Y3QuaWQsIGRhdGEpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlKHsgaWQ6IHByb2R1Y3QuaWQgfSlcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvZHVjdFxuICB9XG5cbiAgYXN5bmMgZ2V0KGlkZW50aWZpZXJzOiBHZXRSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPik6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUw+IHtcbiAgICBjb25zdCBwcm9kdWN0ID0gTnVtYmVyLmlzTmFOKCtpZGVudGlmaWVycy5pZClcbiAgICAgID8gKGF3YWl0IHRoaXMuZmluZCh7IGZpbHRlcnM6IHsgZmlyZXN0b3JlSWQ6IGlkZW50aWZpZXJzLmlkIH0gfSkpLmRhdGE/LlswXVxuICAgICAgOiBhd2FpdCBzdXBlci5nZXQoaWRlbnRpZmllcnMpXG5cbiAgICBwcm9kdWN0LnJldmlld3MgPSBhd2FpdCB0aGlzLmZpbmRSZXZpZXdzQnlQcm9kdWN0KCtwcm9kdWN0LmlkKVxuXG4gICAgcmV0dXJuIHByb2R1Y3RcbiAgfVxuXG4gIGFzeW5jIGdldEJ5U2x1ZyhzbHVnOiBzdHJpbmcsIHNob3A6IFNob3BzKTogUHJvbWlzZTxQcm9kdWN0SGFzdXJhR3JhcGhRTD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZmluZCh7XG4gICAgICBmaWx0ZXJzOiB7XG4gICAgICAgIHNsdWc6IHsgb3BlcmF0b3I6IFdoZXJlLkVRVUFMUywgdmFsdWU6IHNsdWcgfSxcbiAgICAgICAgc2hvcEF2YWlsYWJpbGl0eTogeyBvcGVyYXRvcjogV2hlcmUuSU4sIHZhbHVlOiBbc2hvcF0gfSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHJldHVybiByZXN1bHQ/LmRhdGE/LnNoaWZ0KClcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShwYXJhbXM6IFVwZGF0ZVJlcG9zaXRvcnlQYXJhbXM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+KTogUHJvbWlzZTxQcm9kdWN0SGFzdXJhR3JhcGhRTD4ge1xuICAgIGNvbnN0IHsgY2F0ZWdvcmllcywga2l0UHJvZHVjdHMsIHJldmlld3MsIGlkOiBjaGVja0lkLCAuLi5kYXRhIH0gPSBwYXJhbXNcbiAgICBjb25zdCBwbGFpbkRhdGEgPSB0aGlzLnBhcmFtc1RvUGxhaW4oeyBpZDogY2hlY2tJZCB9KVxuICAgIGNvbnN0IGlkID0gYXdhaXQgdGhpcy5nZXRJZChwbGFpbkRhdGEuaWQpXG4gICAgY29uc3QgcHJvZHVjdCA9IGF3YWl0IHN1cGVyLnVwZGF0ZSh7IGlkLCAuLi5kYXRhIH0pXG5cbiAgICBwcm9kdWN0LmNhdGVnb3JpZXMgPSBjYXRlZ29yaWVzICYmIChhd2FpdCB0aGlzLnVwZGF0ZUNhdGVnb3JpZXMoK2lkLCB7IGNhdGVnb3JpZXMgfSkpXG4gICAgcHJvZHVjdC5raXRQcm9kdWN0cyA9IGtpdFByb2R1Y3RzICYmIChhd2FpdCB0aGlzLnVwZGF0ZUtpdFByb2R1Y3RzKCtpZCwgeyBraXRQcm9kdWN0cyB9KSlcbiAgICBwcm9kdWN0LnJldmlld3MgPSByZXZpZXdzICYmIChhd2FpdCB0aGlzLnVwZGF0ZVJldmlld3MoK2lkLCB7IHJldmlld3MgfSkpXG5cbiAgICByZXR1cm4gcHJvZHVjdFxuICB9XG5cbiAgYXN5bmMgZmV0Y2hSZXZpZXdzKHN0YXR1czogUmV2aWV3U3RhdHVzUGFyYW1zKTogUHJvbWlzZTxSZXZpZXdXaXRoUHJvZHVjdERhdGFbXT4ge1xuICAgIGNvbnN0IHJldmlld3MgPSB7XG4gICAgICBzdGF0dXM6XG4gICAgICAgIHN0YXR1cyA9PT0gJ3BlbmRpbmcnXG4gICAgICAgICAgPyB7IFtIYXN1cmFHcmFwaFFMV2hlcmUuSVNOVUxMXTogdHJ1ZSB9XG4gICAgICAgICAgOiB7IFtIYXN1cmFHcmFwaFFMV2hlcmUuRVFVQUxTXTogc3RhdHVzID09PSAnYXBwcm92ZWQnIH0sXG4gICAgfVxuICAgIGNvbnN0IHsgcHJvZHVjdDogZGF0YSB9ID0gYXdhaXQgdGhpcy5xdWVyeShcbiAgICAgICdwcm9kdWN0JyxcbiAgICAgIFsnaWQnLCAnbmFtZScsICdza3UnLCB7IHJldmlld3M6IHsgY29sdW1uTmFtZTogJ3Jldmlld3MnLCBmaWVsZHM6IHRoaXMucmV2aWV3c0ZpZWxkcyB9IH1dLFxuICAgICAge1xuICAgICAgICB3aGVyZTogeyB2YWx1ZTogeyByZXZpZXdzIH0sIHR5cGU6ICdwcm9kdWN0X2Jvb2xfZXhwJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgcmV0dXJuIGRhdGEucmVkdWNlKFxuICAgICAgKHJldmlld3MsIHByb2R1Y3QpID0+IFtcbiAgICAgICAgLi4ucmV2aWV3cyxcbiAgICAgICAgLi4ucHJvZHVjdC5yZXZpZXdzXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChyZXZpZXcpID0+XG4gICAgICAgICAgICAgIChzdGF0dXMgPT09ICdwZW5kaW5nJyAmJiBbdW5kZWZpbmVkLCBudWxsXS5pbmNsdWRlcyhyZXZpZXcuc3RhdHVzKSkgfHxcbiAgICAgICAgICAgICAgKHN0YXR1cyA9PT0gJ2FwcHJvdmVkJyAmJiByZXZpZXcuc3RhdHVzID09PSB0cnVlKSB8fFxuICAgICAgICAgICAgICAoc3RhdHVzID09PSAncmVqZWN0ZWQnICYmIHJldmlldy5zdGF0dXMgPT09IGZhbHNlKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgocmV2aWV3KSA9PiAoe1xuICAgICAgICAgICAgLi4udGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChyZXZpZXcpLFxuICAgICAgICAgICAgcHJvZHVjdElkOiBwcm9kdWN0LmlkLFxuICAgICAgICAgICAgcHJvZHVjdE5hbWU6IHByb2R1Y3QubmFtZSxcbiAgICAgICAgICAgIHByb2R1Y3RTa3U6IHByb2R1Y3Quc2t1LFxuICAgICAgICAgIH0pKSxcbiAgICAgIF0sXG4gICAgICBbXSBhcyBSZXZpZXdXaXRoUHJvZHVjdERhdGFbXSxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUNhdGVnb3JpZXMoXG4gICAgcHJvZHVjdElkOiBudW1iZXIsXG4gICAgeyBjYXRlZ29yaWVzIH06IFBpY2s8VXBkYXRlUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4sICdjYXRlZ29yaWVzJz4sXG4gICk6IFByb21pc2U8UHJvZHVjdEhhc3VyYUdyYXBoUUxbJ2NhdGVnb3JpZXMnXT4ge1xuICAgIGNvbnN0IHBsYWluRGF0YSA9IHRoaXMucGFyYW1zVG9QbGFpbih7IGNhdGVnb3JpZXMgfSlcblxuICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ2RlbGV0ZV9jYXRlZ29yeV9wcm9kdWN0JywgWydhZmZlY3RlZF9yb3dzJ10sIHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHR5cGU6ICdjYXRlZ29yeV9wcm9kdWN0X2Jvb2xfZXhwJyxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHZhbHVlOiB7IHByb2R1Y3RfaWQ6IHsgX2VxOiBwcm9kdWN0SWQgfSB9LFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgYXdhaXQgdGhpcy5tdXRhdGlvbignaW5zZXJ0X2NhdGVnb3J5X3Byb2R1Y3QnLCBbJ2FmZmVjdGVkX3Jvd3MnXSwge1xuICAgICAgb2JqZWN0czoge1xuICAgICAgICB0eXBlOiAnW2NhdGVnb3J5X3Byb2R1Y3RfaW5zZXJ0X2lucHV0IV0nLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHBsYWluRGF0YS5jYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnlJZCkgPT4gKHsgY2F0ZWdvcnlfaWQ6IGNhdGVnb3J5SWQsIHByb2R1Y3RfaWQ6IHByb2R1Y3RJZCB9KSksXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICByZXR1cm4gcGxhaW5EYXRhLmNhdGVnb3JpZXNcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlS2l0UHJvZHVjdHMoXG4gICAgcHJvZHVjdElkOiBudW1iZXIsXG4gICAgeyBraXRQcm9kdWN0cyB9OiBQaWNrPFVwZGF0ZVJlcG9zaXRvcnlQYXJhbXM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+LCAna2l0UHJvZHVjdHMnPixcbiAgKTogUHJvbWlzZTxQcm9kdWN0SGFzdXJhR3JhcGhRTFsna2l0UHJvZHVjdHMnXT4ge1xuICAgIGNvbnN0IHBsYWluRGF0YSA9IHRoaXMucGFyYW1zVG9QbGFpbih7IGtpdFByb2R1Y3RzIH0pXG5cbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdkZWxldGVfcHJvZHVjdF9raXQnLCBbJ2FmZmVjdGVkX3Jvd3MnXSwge1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgdHlwZTogJ3Byb2R1Y3Rfa2l0X2Jvb2xfZXhwJyxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHZhbHVlOiB7IHByb2R1Y3RfaWQ6IHsgX2VxOiBwcm9kdWN0SWQgfSB9LFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgYXdhaXQgdGhpcy5tdXRhdGlvbignaW5zZXJ0X3Byb2R1Y3Rfa2l0JywgWydhZmZlY3RlZF9yb3dzJ10sIHtcbiAgICAgIG9iamVjdHM6IHtcbiAgICAgICAgdHlwZTogJ1twcm9kdWN0X2tpdF9pbnNlcnRfaW5wdXQhXScsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB2YWx1ZTogcGxhaW5EYXRhLmtpdFByb2R1Y3RzLm1hcCgoa2l0UHJvZHVjdCkgPT4gKHtcbiAgICAgICAgICBraXRfcHJvZHVjdF9pZDoga2l0UHJvZHVjdC5wcm9kdWN0SWQgfHwga2l0UHJvZHVjdC5wcm9kdWN0LmlkLFxuICAgICAgICAgIHByb2R1Y3RfaWQ6IHByb2R1Y3RJZCxcbiAgICAgICAgICBxdWFudGl0eToga2l0UHJvZHVjdC5xdWFudGl0eSxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHBsYWluRGF0YS5raXRQcm9kdWN0c1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVSZXZpZXdzKFxuICAgIHByb2R1Y3RJZDogbnVtYmVyLFxuICAgIHsgcmV2aWV3cyB9OiBQaWNrPFVwZGF0ZVJlcG9zaXRvcnlQYXJhbXM8UHJvZHVjdEhhc3VyYUdyYXBoUUw+LCAncmV2aWV3cyc+LFxuICApOiBQcm9taXNlPFByb2R1Y3RSZXZpZXdbXT4ge1xuICAgIGlmICghcmV2aWV3cykgcmV0dXJuIFtdXG4gICAgaWYgKCdhY3Rpb24nIGluIHJldmlld3MgJiYgcmV2aWV3cy5hY3Rpb24gPT09ICdyZW1vdmUnKSB7XG4gICAgICBjb25zdCByZXZpZXdJZHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcmV2aWV3cy52YWx1ZS5tYXAoYXN5bmMgKHJldmlld0RhdGEpID0+IHtcbiAgICAgICAgICBjb25zdCByZXZpZXcgPSBhd2FpdCB0aGlzLmZpbmRSZXZpZXcocmV2aWV3RGF0YSwgcHJvZHVjdElkKVxuXG4gICAgICAgICAgcmV0dXJuIHJldmlldz8uaWRcbiAgICAgICAgfSksXG4gICAgICApXG5cbiAgICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ2RlbGV0ZV9wcm9kdWN0X3JldmlldycsIFsnYWZmZWN0ZWRfcm93cyddLCB7XG4gICAgICAgIHdoZXJlOiB7IHZhbHVlOiB7IGlkOiB7IF9pbjogcmV2aWV3SWRzLmZpbHRlcihCb29sZWFuKSB9IH0sIHR5cGU6ICdwcm9kdWN0X3Jldmlld19ib29sX2V4cCcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gcmV2aWV3cy52YWx1ZS5tYXAoKHJldmlldywgaW5kZXgpID0+ICFyZXZpZXdJZHNbaW5kZXhdICYmIHJldmlldykuZmlsdGVyKEJvb2xlYW4pXG4gICAgfVxuXG4gICAgY29uc3QgcGxhaW5EYXRhID0gdGhpcy5wYXJhbXNUb1BsYWluKHsgcmV2aWV3cyB9KVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgcGxhaW5EYXRhLnJldmlld3MubWFwKGFzeW5jIChyZXZpZXdEYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IHJldmlldyA9IGF3YWl0IHRoaXMuZmluZFJldmlldyhyZXZpZXdEYXRhLCBwcm9kdWN0SWQpXG5cbiAgICAgICAgaWYgKHJldmlldylcbiAgICAgICAgICByZXR1cm4gdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tdXRhdGlvbigndXBkYXRlX3Byb2R1Y3RfcmV2aWV3X2J5X3BrJywgdGhpcy5yZXZpZXdzRmllbGRzLCB7XG4gICAgICAgICAgICAgICAgcGtfY29sdW1uczoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IHsgaWQ6IHJldmlldy5pZCB9LFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3Byb2R1Y3RfcmV2aWV3X3BrX2NvbHVtbnNfaW5wdXQnLFxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBfc2V0OiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogb21pdCh0aGlzLmJpbmRSZXZpZXdUb0hhc3VyYShyZXZpZXdEYXRhKSwgWydpZCcsICdwcm9kdWN0X2lkJ10pLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3Byb2R1Y3RfcmV2aWV3X3NldF9pbnB1dCcsXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS51cGRhdGVfcHJvZHVjdF9yZXZpZXdfYnlfcGssXG4gICAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmJpbmRSZXZpZXdUb01vZGVsKFxuICAgICAgICAgIChcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ2luc2VydF9wcm9kdWN0X3Jldmlld19vbmUnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcbiAgICAgICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IG9taXQoeyAuLi50aGlzLmJpbmRSZXZpZXdUb0hhc3VyYShyZXZpZXdEYXRhKSwgcHJvZHVjdF9pZDogcHJvZHVjdElkIH0sIFsnaWQnXSksXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Byb2R1Y3RfcmV2aWV3X2luc2VydF9pbnB1dCcsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICkuaW5zZXJ0X3Byb2R1Y3RfcmV2aWV3X29uZSxcbiAgICAgICAgKVxuICAgICAgfSksXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRJZChpZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIU51bWJlci5pc05hTigraWQpKSByZXR1cm4gaWRcblxuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5maW5kKHsgZmlsdGVyczogeyBmaXJlc3RvcmVJZDogaWQgfSB9KVxuXG4gICAgaWYgKGRhdGE/LlswXT8uaWQpIHJldHVybiBkYXRhPy5bMF0/LmlkXG5cbiAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgUHJvZHVjdCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmRSZXZpZXdzQnlQcm9kdWN0KHByb2R1Y3RJZDogbnVtYmVyKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3W10+IHtcbiAgICBjb25zdCB7IHByb2R1Y3RfcmV2aWV3OiBkYXRhIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5KCdwcm9kdWN0X3JldmlldycsIHRoaXMucmV2aWV3c0ZpZWxkcywge1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwcm9kdWN0X2lkOiB7IF9lcTogcHJvZHVjdElkIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdwcm9kdWN0X3Jldmlld19ib29sX2V4cCcsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5tYXAoKHJldmlldykgPT4gdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChyZXZpZXcpKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kUmV2aWV3KHJldmlldzogUHJvZHVjdFJldmlldywgcHJvZHVjdElkOiBudW1iZXIpOiBQcm9taXNlPFByb2R1Y3RSZXZpZXc+IHtcbiAgICBpZiAocmV2aWV3LmlkKSByZXR1cm4gcmV2aWV3XG5cbiAgICBsZXQgbG9hZGVkUmV2aWV3OiBQcm9kdWN0UmV2aWV3XG5cbiAgICBpZiAocmV2aWV3LnBlcnNvbklkKSBsb2FkZWRSZXZpZXcgPSBhd2FpdCB0aGlzLmdldFJldmlld0J5UGVyc29uSWQocmV2aWV3LnBlcnNvbklkLCBwcm9kdWN0SWQpXG4gICAgaWYgKCFsb2FkZWRSZXZpZXcgJiYgcmV2aWV3LmF1dGhvciAmJiByZXZpZXcuZW1haWwpXG4gICAgICBsb2FkZWRSZXZpZXcgPSBhd2FpdCB0aGlzLmdldFJldmlld0J5QXV0aG9yQW5kRW1haWwocmV2aWV3LmF1dGhvciwgcmV2aWV3LmVtYWlsLCBwcm9kdWN0SWQpXG5cbiAgICByZXR1cm4gbG9hZGVkUmV2aWV3IHx8IHJldmlld1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRSZXZpZXdCeVBlcnNvbklkKHBlcnNvbklkOiBudW1iZXIsIHByb2R1Y3RJZDogbnVtYmVyKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3PiB7XG4gICAgY29uc3QgeyBwcm9kdWN0X3JldmlldzogZGF0YSB9ID0gYXdhaXQgdGhpcy5xdWVyeSgncHJvZHVjdF9yZXZpZXcnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvZHVjdF9pZDogeyBfZXE6IHByb2R1Y3RJZCB9LFxuICAgICAgICAgIHBlcnNvbl9pZDogeyBfZXE6IHBlcnNvbklkIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IGBwcm9kdWN0X3Jldmlld19ib29sX2V4cGAsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIGRhdGEgJiYgZGF0YVswXSAmJiB0aGlzLmJpbmRSZXZpZXdUb01vZGVsKGRhdGFbMF0pXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFJldmlld0J5QXV0aG9yQW5kRW1haWwoYXV0aG9yOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcsIHByb2R1Y3RJZDogbnVtYmVyKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3PiB7XG4gICAgY29uc3QgeyBwcm9kdWN0X3JldmlldzogZGF0YSB9ID0gYXdhaXQgdGhpcy5xdWVyeSgncHJvZHVjdF9yZXZpZXcnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvZHVjdF9pZDogeyBfZXE6IHByb2R1Y3RJZCB9LFxuICAgICAgICAgIGF1dGhvcjogeyBfZXE6IGF1dGhvciB9LFxuICAgICAgICAgIGVtYWlsOiB7IF9lcTogZW1haWwgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogYHByb2R1Y3RfcmV2aWV3X2Jvb2xfZXhwYCxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICByZXR1cm4gZGF0YSAmJiBkYXRhWzBdICYmIHRoaXMuYmluZFJldmlld1RvTW9kZWwoZGF0YVswXSlcbiAgfVxuXG4gIHByaXZhdGUgYmluZFJldmlld1RvTW9kZWwgPSAocGxhaW46IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9kdWN0UmV2aWV3ID0+ICh7XG4gICAgLi4ub21pdChwbGFpbiwgWydwcm9kdWN0X2lkJywgJ2NyZWF0ZWRfYXQnLCAndXBkYXRlZF9hdCcsICdwZXJzb25faWQnLCAnb3JkZXJfaWQnXSksXG4gICAgY3JlYXRlZEF0OiB0eXBlb2YgcGxhaW4uY3JlYXRlZF9hdCA9PT0gJ3N0cmluZycgPyBuZXcgRGF0ZShwbGFpbi5jcmVhdGVkX2F0KSA6IHBsYWluLmNyZWF0ZWRfYXQsXG4gICAgdXBkYXRlZEF0OiB0eXBlb2YgcGxhaW4udXBkYXRlZF9hdCA9PT0gJ3N0cmluZycgPyBuZXcgRGF0ZShwbGFpbi51cGRhdGVkX2F0KSA6IHBsYWluLnVwZGF0ZWRfYXQsXG4gICAgcGVyc29uSWQ6IHBsYWluLnBlcnNvbl9pZCxcbiAgICBvcmRlcklkOiBwbGFpbi5vcmRlcl9pZCxcbiAgfSlcblxuICBwcml2YXRlIGJpbmRSZXZpZXdUb0hhc3VyYSA9IChyZXZpZXc6IFByb2R1Y3RSZXZpZXcpOiBQcm9kdWN0UmV2aWV3RmllbGRzID0+ICh7XG4gICAgLi4ub21pdChyZXZpZXcsIFsncHJvZHVjdElkJywgJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnLCAncGVyc29uSWQnLCAnb3JkZXJJZCddKSxcbiAgICBwZXJzb25faWQ6IHJldmlldy5wZXJzb25JZCxcbiAgICBvcmRlcl9pZDogcmV2aWV3Lm9yZGVySWQsXG4gIH0pXG59XG4iXX0=
1
+ import { __awaiter, __rest } from "tslib";
2
+ import { Shops } from '../../../../domain';
3
+ import { NotFoundError } from '../../../../errors';
4
+ import { Base, isNil, omit } from '../../../../utils';
5
+ import { HasuraGraphQLColumnType, HasuraGraphQLWhere } from '../../enums';
6
+ import { withCrudHasuraGraphQL, withHasuraGraphQL } from '../../mixins';
7
+ import { ProductHasuraGraphQL } from '../../models';
8
+ export class ProductHasuraGraphQLRepository extends withCrudHasuraGraphQL(withHasuraGraphQL(Base)) {
9
+ constructor(endpoint, authOptions) {
10
+ super({
11
+ tableName: 'product',
12
+ model: ProductHasuraGraphQL,
13
+ endpoint,
14
+ authOptions,
15
+ fields: [],
16
+ });
17
+ this.bindReviewToModel = (plain) => (Object.assign(Object.assign({}, omit(plain, ['product_id', 'created_at', 'updated_at', 'person_id', 'order_id'])), { createdAt: typeof plain.created_at === 'string' ? new Date(plain.created_at) : plain.created_at, updatedAt: typeof plain.updated_at === 'string' ? new Date(plain.updated_at) : plain.updated_at, personId: plain.person_id, orderId: plain.order_id }));
18
+ this.bindReviewToHasura = (review) => (Object.assign(Object.assign({}, omit(review, ['productId', 'createdAt', 'updatedAt', 'personId', 'orderId'])), { person_id: review.personId, order_id: review.orderId }));
19
+ const commonFields = [
20
+ { id: { columnName: 'id', to: (value) => +value, from: (value) => value.toString() } },
21
+ { firestoreId: { columnName: 'firestore_id' } },
22
+ { CEST: { columnName: 'cest' } },
23
+ { EAN: { columnName: 'ean' } },
24
+ { NCM: { columnName: 'ncm' } },
25
+ 'brand',
26
+ { costPrice: { columnName: 'cost_price' } },
27
+ {
28
+ description: {
29
+ columnName: 'description',
30
+ from: (description) => Object.values(Shops).reduce((shops, shop) => (Object.assign(Object.assign({}, shops), { [shop]: { description } })), {}),
31
+ to: (value) => Object.values(value).shift().description,
32
+ },
33
+ },
34
+ { hasVariants: { columnName: 'has_variants' } },
35
+ { images: { columnName: 'images', to: (value) => { var _a; return `{"${((_a = value === null || value === void 0 ? void 0 : value.join) === null || _a === void 0 ? void 0 : _a.call(value, `","`)) || ''}"}`; } } },
36
+ { miniatures: { columnName: 'miniatures', to: (value) => { var _a; return `{"${((_a = value === null || value === void 0 ? void 0 : value.join) === null || _a === void 0 ? void 0 : _a.call(value, `","`)) || ''}"}`; } } },
37
+ 'name',
38
+ {
39
+ price: {
40
+ columnName: 'price',
41
+ from: (price, data) => Object.values(Shops).reduce((prices, shop) => (Object.assign(Object.assign({}, prices), { [shop]: {
42
+ price,
43
+ fullPrice: data.full_price,
44
+ subscriberDiscountPercentage: data.subscriber_discount_percentage,
45
+ subscriberPrice: data.subscriber_price,
46
+ } })), {}),
47
+ bindFindFilter: (sentence) => {
48
+ const filters = Object.values(sentence).shift();
49
+ return Object.assign(Object.assign(Object.assign(Object.assign({}, (((filters === null || filters === void 0 ? void 0 : filters.price) || (filters === null || filters === void 0 ? void 0 : filters.price) === 0) && { price: filters.price })), ((filters.fullPrice || filters.fullPrice === 0) && { full_price: filters.fullPrice })), ((filters.subscriberDiscountPercentage || filters.subscriberDiscountPercentage === 0) && {
50
+ subscriber_discount_percentage: filters.subscriberDiscountPercentage,
51
+ })), ((filters.subscriberPrice || filters.subscriberPrice === 0) && {
52
+ subscriber_price: filters.subscriberPrice,
53
+ }));
54
+ },
55
+ bindPersistData: (value) => {
56
+ const priceData = Object.values(value).shift();
57
+ return Object.assign(Object.assign(Object.assign(Object.assign({}, ((priceData === null || priceData === void 0 ? void 0 : priceData.price) >= 0 && { price: priceData.price })), (priceData.fullPrice >= 0 && { full_price: priceData.fullPrice })), (priceData.subscriberDiscountPercentage >= 0 && {
58
+ subscriber_discount_percentage: priceData.subscriberDiscountPercentage,
59
+ })), (priceData.subscriberPrice >= 0 && { subscriber_price: priceData.subscriberPrice }));
60
+ },
61
+ },
62
+ },
63
+ { fullPrice: { columnName: 'full_price' } },
64
+ { subscriberDiscountPercentage: { columnName: 'subscriber_discount_percentage' } },
65
+ { subscriberPrice: { columnName: 'subscriber_price' } },
66
+ 'published',
67
+ { publishedGlam: { columnName: 'published_glam' } },
68
+ 'sku',
69
+ {
70
+ stock: {
71
+ columnName: 'stock',
72
+ from: (quantity) => ({ quantity }),
73
+ to: (value) => (isNil(value === null || value === void 0 ? void 0 : value.quantity) ? value : value === null || value === void 0 ? void 0 : value.quantity),
74
+ },
75
+ },
76
+ 'slug',
77
+ 'type',
78
+ 'video',
79
+ 'weight',
80
+ {
81
+ shopAvailability: {
82
+ columnName: 'shop_availabilities',
83
+ fields: ['shop'],
84
+ from: (shop) => (Array.isArray(shop) ? shop.map((row) => row.shop) : []),
85
+ to: (shops) => shops.map((shop) => ({ shop })),
86
+ },
87
+ },
88
+ { tags: { columnName: 'tags', type: HasuraGraphQLColumnType.Jsonb } },
89
+ { isKit: { columnName: 'is_kit' } },
90
+ { createdAt: { columnName: 'created_at' } },
91
+ { updatedAt: { columnName: 'updated_at' } },
92
+ ];
93
+ this.fields = [
94
+ ...commonFields,
95
+ {
96
+ categories: {
97
+ columnName: 'categories',
98
+ fields: ['category_id'],
99
+ bindPersistData: (value) => ({
100
+ categories: { data: value.map((category) => ({ category_id: +category })) },
101
+ }),
102
+ to: (categories) => categories.map((categoryId) => +categoryId),
103
+ from: (categories) => (categories === null || categories === void 0 ? void 0 : categories.map((category) => { var _a; return (_a = category === null || category === void 0 ? void 0 : category.category_id) === null || _a === void 0 ? void 0 : _a.toString(); })) || [],
104
+ },
105
+ },
106
+ {
107
+ kitProducts: {
108
+ columnName: 'kit_products',
109
+ foreignKeyColumn: { productId: 'id' },
110
+ fields: [
111
+ { productId: { columnName: 'product_id' } },
112
+ { kitProductId: { columnName: 'kit_product_id' } },
113
+ 'quantity',
114
+ { product: { columnName: 'product', foreignKeyColumn: { id: 'product_id' }, fields: commonFields } },
115
+ ],
116
+ },
117
+ },
118
+ ];
119
+ }
120
+ get reviewsFields() {
121
+ return [
122
+ 'id',
123
+ 'shop',
124
+ 'rate',
125
+ 'author',
126
+ 'email',
127
+ 'location',
128
+ 'review',
129
+ 'status',
130
+ 'title',
131
+ 'person_id',
132
+ 'points',
133
+ 'order_id',
134
+ 'created_at',
135
+ 'updated_at',
136
+ ];
137
+ }
138
+ create(data) {
139
+ const _super = Object.create(null, {
140
+ create: { get: () => super.create }
141
+ });
142
+ return __awaiter(this, void 0, void 0, function* () {
143
+ const product = yield _super.create.call(this, omit(data, ['reviews']));
144
+ try {
145
+ product.reviews = yield this.updateReviews(+product.id, data);
146
+ }
147
+ catch (error) {
148
+ yield this.delete({ id: product.id });
149
+ throw error;
150
+ }
151
+ return product;
152
+ });
153
+ }
154
+ get(identifiers) {
155
+ const _super = Object.create(null, {
156
+ get: { get: () => super.get }
157
+ });
158
+ var _a;
159
+ return __awaiter(this, void 0, void 0, function* () {
160
+ const product = Number.isNaN(+identifiers.id)
161
+ ? (_a = (yield this.find({ filters: { firestoreId: identifiers.id } })).data) === null || _a === void 0 ? void 0 : _a[0]
162
+ : yield _super.get.call(this, identifiers);
163
+ product.reviews = yield this.findReviewsByProduct(+product.id);
164
+ return product;
165
+ });
166
+ }
167
+ getBySlug(slug, shop) {
168
+ var _a;
169
+ return __awaiter(this, void 0, void 0, function* () {
170
+ const result = yield this.find({
171
+ filters: {
172
+ slug,
173
+ shopAvailability: [shop],
174
+ },
175
+ });
176
+ const product = (_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a.shift();
177
+ product.reviews = yield this.findReviewsByProduct(+product.id);
178
+ return product;
179
+ });
180
+ }
181
+ update(params) {
182
+ const _super = Object.create(null, {
183
+ update: { get: () => super.update }
184
+ });
185
+ return __awaiter(this, void 0, void 0, function* () {
186
+ const { categories, kitProducts, reviews, id: checkId } = params, data = __rest(params, ["categories", "kitProducts", "reviews", "id"]);
187
+ const plainData = this.paramsToPlain({ id: checkId });
188
+ const id = yield this.getId(plainData.id);
189
+ const product = yield _super.update.call(this, Object.assign({ id }, data));
190
+ product.categories = categories && (yield this.updateCategories(+id, { categories }));
191
+ product.kitProducts = kitProducts && (yield this.updateKitProducts(+id, { kitProducts }));
192
+ product.reviews = reviews && (yield this.updateReviews(+id, { reviews }));
193
+ return product;
194
+ });
195
+ }
196
+ fetchReviews(status) {
197
+ return __awaiter(this, void 0, void 0, function* () {
198
+ const reviews = {
199
+ status: status === 'pending'
200
+ ? { [HasuraGraphQLWhere.ISNULL]: true }
201
+ : { [HasuraGraphQLWhere.EQUALS]: status === 'approved' },
202
+ };
203
+ const { product: data } = yield this.query('product', ['id', 'name', 'sku', { reviews: { columnName: 'reviews', fields: this.reviewsFields } }], {
204
+ where: { value: { reviews }, type: 'product_bool_exp', required: true },
205
+ });
206
+ return data.reduce((reviews, product) => [
207
+ ...reviews,
208
+ ...product.reviews
209
+ .filter((review) => (status === 'pending' && [undefined, null].includes(review.status)) ||
210
+ (status === 'approved' && review.status === true) ||
211
+ (status === 'rejected' && review.status === false))
212
+ .map((review) => (Object.assign(Object.assign({}, this.bindReviewToModel(review)), { productId: product.id, productName: product.name, productSku: product.sku }))),
213
+ ], []);
214
+ });
215
+ }
216
+ updateCategories(productId, { categories }) {
217
+ return __awaiter(this, void 0, void 0, function* () {
218
+ const plainData = this.paramsToPlain({ categories });
219
+ yield this.mutation('delete_category_product', ['affected_rows'], {
220
+ where: {
221
+ type: 'category_product_bool_exp',
222
+ required: true,
223
+ value: { product_id: { _eq: productId } },
224
+ },
225
+ });
226
+ yield this.mutation('insert_category_product', ['affected_rows'], {
227
+ objects: {
228
+ type: '[category_product_insert_input!]',
229
+ required: true,
230
+ value: plainData.categories.map((categoryId) => ({ category_id: categoryId, product_id: productId })),
231
+ },
232
+ });
233
+ return plainData.categories;
234
+ });
235
+ }
236
+ updateKitProducts(productId, { kitProducts }) {
237
+ return __awaiter(this, void 0, void 0, function* () {
238
+ const plainData = this.paramsToPlain({ kitProducts });
239
+ yield this.mutation('delete_product_kit', ['affected_rows'], {
240
+ where: {
241
+ type: 'product_kit_bool_exp',
242
+ required: true,
243
+ value: { product_id: { _eq: productId } },
244
+ },
245
+ });
246
+ yield this.mutation('insert_product_kit', ['affected_rows'], {
247
+ objects: {
248
+ type: '[product_kit_insert_input!]',
249
+ required: true,
250
+ value: plainData.kitProducts.map((kitProduct) => ({
251
+ kit_product_id: kitProduct.productId || kitProduct.product.id,
252
+ product_id: productId,
253
+ quantity: kitProduct.quantity,
254
+ })),
255
+ },
256
+ });
257
+ return plainData.kitProducts;
258
+ });
259
+ }
260
+ updateReviews(productId, { reviews }) {
261
+ return __awaiter(this, void 0, void 0, function* () {
262
+ if (!reviews)
263
+ return [];
264
+ if ('action' in reviews && reviews.action === 'remove') {
265
+ const reviewIds = yield Promise.all(reviews.value.map((reviewData) => __awaiter(this, void 0, void 0, function* () {
266
+ const review = yield this.findReview(reviewData, productId);
267
+ return review === null || review === void 0 ? void 0 : review.id;
268
+ })));
269
+ yield this.mutation('delete_product_review', ['affected_rows'], {
270
+ where: { value: { id: { _in: reviewIds.filter(Boolean) } }, type: 'product_review_bool_exp', required: true },
271
+ });
272
+ return reviews.value.map((review, index) => !reviewIds[index] && review).filter(Boolean);
273
+ }
274
+ const plainData = this.paramsToPlain({ reviews });
275
+ return Promise.all(plainData.reviews.map((reviewData) => __awaiter(this, void 0, void 0, function* () {
276
+ const review = yield this.findReview(reviewData, productId);
277
+ if (review)
278
+ return this.bindReviewToModel((yield this.mutation('update_product_review_by_pk', this.reviewsFields, {
279
+ pk_columns: {
280
+ value: { id: review.id },
281
+ type: 'product_review_pk_columns_input',
282
+ required: true,
283
+ },
284
+ _set: {
285
+ value: omit(this.bindReviewToHasura(reviewData), ['id', 'product_id']),
286
+ type: 'product_review_set_input',
287
+ required: true,
288
+ },
289
+ })).update_product_review_by_pk);
290
+ return this.bindReviewToModel((yield this.mutation('insert_product_review_one', this.reviewsFields, {
291
+ object: {
292
+ value: omit(Object.assign(Object.assign({}, this.bindReviewToHasura(reviewData)), { product_id: productId }), ['id']),
293
+ type: 'product_review_insert_input',
294
+ required: true,
295
+ },
296
+ })).insert_product_review_one);
297
+ })));
298
+ });
299
+ }
300
+ getId(id) {
301
+ var _a, _b;
302
+ return __awaiter(this, void 0, void 0, function* () {
303
+ if (!Number.isNaN(+id))
304
+ return id;
305
+ const { data } = yield this.find({ filters: { firestoreId: id } });
306
+ if ((_a = data === null || data === void 0 ? void 0 : data[0]) === null || _a === void 0 ? void 0 : _a.id)
307
+ return (_b = data === null || data === void 0 ? void 0 : data[0]) === null || _b === void 0 ? void 0 : _b.id;
308
+ throw new NotFoundError(`Product with id ${id} not found`);
309
+ });
310
+ }
311
+ findReviewsByProduct(productId) {
312
+ return __awaiter(this, void 0, void 0, function* () {
313
+ const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
314
+ where: {
315
+ value: {
316
+ product_id: { _eq: productId },
317
+ },
318
+ type: 'product_review_bool_exp',
319
+ required: true,
320
+ },
321
+ });
322
+ return data && data.map((review) => this.bindReviewToModel(review));
323
+ });
324
+ }
325
+ findReview(review, productId) {
326
+ return __awaiter(this, void 0, void 0, function* () {
327
+ if (review.id)
328
+ return review;
329
+ let loadedReview;
330
+ if (review.personId)
331
+ loadedReview = yield this.getReviewByPersonId(review.personId, productId);
332
+ if (!loadedReview && review.author && review.email)
333
+ loadedReview = yield this.getReviewByAuthorAndEmail(review.author, review.email, productId);
334
+ return loadedReview || review;
335
+ });
336
+ }
337
+ getReviewByPersonId(personId, productId) {
338
+ return __awaiter(this, void 0, void 0, function* () {
339
+ const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
340
+ where: {
341
+ value: {
342
+ product_id: { _eq: productId },
343
+ person_id: { _eq: personId },
344
+ },
345
+ type: `product_review_bool_exp`,
346
+ required: true,
347
+ },
348
+ });
349
+ return data && data[0] && this.bindReviewToModel(data[0]);
350
+ });
351
+ }
352
+ getReviewByAuthorAndEmail(author, email, productId) {
353
+ return __awaiter(this, void 0, void 0, function* () {
354
+ const { product_review: data } = yield this.query('product_review', this.reviewsFields, {
355
+ where: {
356
+ value: {
357
+ product_id: { _eq: productId },
358
+ author: { _eq: author },
359
+ email: { _eq: email },
360
+ },
361
+ type: `product_review_bool_exp`,
362
+ required: true,
363
+ },
364
+ });
365
+ return data && data[0] && this.bindReviewToModel(data[0]);
366
+ });
367
+ }
368
+ }
369
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC9zcmMvaW5mcmEvaGFzdXJhLWdyYXBocWwvcmVwb3NpdG9yaWVzL2NhdGFsb2cvcHJvZHVjdC1oYXN1cmEtZ3JhcGhxbC5yZXBvc2l0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBT0wsS0FBSyxFQUdOLE1BQU0sb0JBQW9CLENBQUE7QUFDM0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN6RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBb0JuRCxNQUFNLE9BQU8sOEJBQ1gsU0FBUSxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBdUIsSUFBSSxDQUFDLENBQUM7SUFzQjVFLFlBQVksUUFBZ0IsRUFBRSxXQUFxQztRQUNqRSxLQUFLLENBQUM7WUFDSixTQUFTLEVBQUUsU0FBUztZQUNwQixLQUFLLEVBQUUsb0JBQW9CO1lBQzNCLFFBQVE7WUFDUixXQUFXO1lBQ1gsTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDLENBQUE7UUEyWUksc0JBQWlCLEdBQUcsQ0FBQyxLQUEwQixFQUFpQixFQUFFLENBQUMsaUNBQ3RFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUMsS0FDbkYsU0FBUyxFQUFFLE9BQU8s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QUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdEYsS0FBSyxFQUFFO29CQUNMLEtBQUssRUFBRTt3QkFDTCxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFO3dCQUM5QixNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFO3dCQUN2QixLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO3FCQUN0QjtvQkFDRCxJQUFJLEVBQUUseUJBQXlCO29CQUMvQixRQUFRLEVBQUUsSUFBSTtpQkFDZjthQUNGLENBQUMsQ0FBQTtZQUVGLE9BQU8sSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDM0QsQ0FBQztLQUFBO0NBZUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENyZWF0ZVJlcG9zaXRvcnlQYXJhbXMsXHJcbiAgR2V0UmVwb3NpdG9yeVBhcmFtcyxcclxuICBQcm9kdWN0UmVwb3NpdG9yeSxcclxuICBQcm9kdWN0UmV2aWV3LFxyXG4gIFJldmlld1N0YXR1c1BhcmFtcyxcclxuICBSZXZpZXdXaXRoUHJvZHVjdERhdGEsXHJcbiAgU2hvcHMsXHJcbiAgU2hvcHNQcmljZSxcclxuICBVcGRhdGVSZXBvc2l0b3J5UGFyYW1zXHJcbn0gZnJvbSAnLi4vLi4vLi4vLi4vZG9tYWluJ1xyXG5pbXBvcnQgeyBOb3RGb3VuZEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vZXJyb3JzJ1xyXG5pbXBvcnQgeyBCYXNlLCBpc05pbCwgb21pdCB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJ1xyXG5pbXBvcnQgeyBIYXN1cmFHcmFwaFFMQ29sdW1uVHlwZSwgSGFzdXJhR3JhcGhRTFdoZXJlIH0gZnJvbSAnLi4vLi4vZW51bXMnXHJcbmltcG9ydCB7IHdpdGhDcnVkSGFzdXJhR3JhcGhRTCwgd2l0aEhhc3VyYUdyYXBoUUwgfSBmcm9tICcuLi8uLi9taXhpbnMnXHJcbmltcG9ydCB7IFByb2R1Y3RIYXN1cmFHcmFwaFFMIH0gZnJvbSAnLi4vLi4vbW9kZWxzJ1xyXG5pbXBvcnQgeyBIYXN1cmFHcmFwaFFMQXV0aE9wdGlvbnMsIEhhc3VyYUdyYXBoUUxGaWVsZHMgfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbnR5cGUgUHJvZHVjdFJldmlld0ZpZWxkcyA9IHtcclxuICBpZD86IHN0cmluZ1xyXG4gIHNob3A6IFNob3BzXHJcbiAgcmF0ZTogbnVtYmVyXHJcbiAgYXV0aG9yPzogc3RyaW5nXHJcbiAgZW1haWw/OiBzdHJpbmdcclxuICBsb2NhdGlvbj86IHN0cmluZ1xyXG4gIHJldmlldz86IHN0cmluZ1xyXG4gIHN0YXR1cz86IGJvb2xlYW5cclxuICB0aXRsZT86IHN0cmluZ1xyXG4gIHBlcnNvbl9pZD86IG51bWJlclxyXG4gIHBvaW50cz86IG51bWJlclxyXG4gIG9yZGVyX2lkPzogc3RyaW5nXHJcbiAgY3JlYXRlZF9hdD86IERhdGVcclxuICB1cGRhdGVkX2F0PzogRGF0ZVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUHJvZHVjdEhhc3VyYUdyYXBoUUxSZXBvc2l0b3J5XHJcbiAgZXh0ZW5kcyB3aXRoQ3J1ZEhhc3VyYUdyYXBoUUwod2l0aEhhc3VyYUdyYXBoUUw8UHJvZHVjdEhhc3VyYUdyYXBoUUw+KEJhc2UpKVxyXG4gIGltcGxlbWVudHMgUHJvZHVjdFJlcG9zaXRvcnlcclxue1xyXG4gIHByaXZhdGUgZ2V0IHJldmlld3NGaWVsZHMoKTogQXJyYXk8a2V5b2YgUHJvZHVjdFJldmlld0ZpZWxkcz4ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgJ2lkJyxcclxuICAgICAgJ3Nob3AnLFxyXG4gICAgICAncmF0ZScsXHJcbiAgICAgICdhdXRob3InLFxyXG4gICAgICAnZW1haWwnLFxyXG4gICAgICAnbG9jYXRpb24nLFxyXG4gICAgICAncmV2aWV3JyxcclxuICAgICAgJ3N0YXR1cycsXHJcbiAgICAgICd0aXRsZScsXHJcbiAgICAgICdwZXJzb25faWQnLFxyXG4gICAgICAncG9pbnRzJyxcclxuICAgICAgJ29yZGVyX2lkJyxcclxuICAgICAgJ2NyZWF0ZWRfYXQnLFxyXG4gICAgICAndXBkYXRlZF9hdCcsXHJcbiAgICBdXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihlbmRwb2ludDogc3RyaW5nLCBhdXRoT3B0aW9uczogSGFzdXJhR3JhcGhRTEF1dGhPcHRpb25zKSB7XHJcbiAgICBzdXBlcih7XHJcbiAgICAgIHRhYmxlTmFtZTogJ3Byb2R1Y3QnLFxyXG4gICAgICBtb2RlbDogUHJvZHVjdEhhc3VyYUdyYXBoUUwsXHJcbiAgICAgIGVuZHBvaW50LFxyXG4gICAgICBhdXRoT3B0aW9ucyxcclxuICAgICAgZmllbGRzOiBbXSxcclxuICAgIH0pXHJcblxyXG4gICAgY29uc3QgY29tbW9uRmllbGRzOiBIYXN1cmFHcmFwaFFMRmllbGRzPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiA9IFtcclxuICAgICAgeyBpZDogeyBjb2x1bW5OYW1lOiAnaWQnLCB0bzogKHZhbHVlKSA9PiArdmFsdWUsIGZyb206ICh2YWx1ZSkgPT4gdmFsdWUudG9TdHJpbmcoKSB9IH0sXHJcbiAgICAgIHsgZmlyZXN0b3JlSWQ6IHsgY29sdW1uTmFtZTogJ2ZpcmVzdG9yZV9pZCcgfSB9LFxyXG4gICAgICB7IENFU1Q6IHsgY29sdW1uTmFtZTogJ2Nlc3QnIH0gfSxcclxuICAgICAgeyBFQU46IHsgY29sdW1uTmFtZTogJ2VhbicgfSB9LFxyXG4gICAgICB7IE5DTTogeyBjb2x1bW5OYW1lOiAnbmNtJyB9IH0sXHJcbiAgICAgICdicmFuZCcsXHJcbiAgICAgIHsgY29zdFByaWNlOiB7IGNvbHVtbk5hbWU6ICdjb3N0X3ByaWNlJyB9IH0sXHJcbiAgICAgIHtcclxuICAgICAgICBkZXNjcmlwdGlvbjoge1xyXG4gICAgICAgICAgY29sdW1uTmFtZTogJ2Rlc2NyaXB0aW9uJyxcclxuICAgICAgICAgIGZyb206IChkZXNjcmlwdGlvbikgPT5cclxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhTaG9wcykucmVkdWNlKChzaG9wcywgc2hvcCkgPT4gKHsgLi4uc2hvcHMsIFtzaG9wXTogeyBkZXNjcmlwdGlvbiB9IH0pLCB7fSksXHJcbiAgICAgICAgICB0bzogKHZhbHVlKSA9PiBPYmplY3QudmFsdWVzKHZhbHVlKS5zaGlmdCgpLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHsgaGFzVmFyaWFudHM6IHsgY29sdW1uTmFtZTogJ2hhc192YXJpYW50cycgfSB9LFxyXG4gICAgICB7IGltYWdlczogeyBjb2x1bW5OYW1lOiAnaW1hZ2VzJywgdG86ICh2YWx1ZSkgPT4gYHtcIiR7dmFsdWU/LmpvaW4/LihgXCIsXCJgKSB8fCAnJ31cIn1gIH0gfSxcclxuICAgICAgeyBtaW5pYXR1cmVzOiB7IGNvbHVtbk5hbWU6ICdtaW5pYXR1cmVzJywgdG86ICh2YWx1ZSkgPT4gYHtcIiR7dmFsdWU/LmpvaW4/LihgXCIsXCJgKSB8fCAnJ31cIn1gIH0gfSxcclxuICAgICAgJ25hbWUnLFxyXG4gICAgICB7XHJcbiAgICAgICAgcHJpY2U6IHtcclxuICAgICAgICAgIGNvbHVtbk5hbWU6ICdwcmljZScsXHJcbiAgICAgICAgICBmcm9tOiAocHJpY2UsIGRhdGEpOiBTaG9wc1ByaWNlID0+XHJcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoU2hvcHMpLnJlZHVjZShcclxuICAgICAgICAgICAgICAocHJpY2VzOiBTaG9wc1ByaWNlLCBzaG9wKSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgLi4ucHJpY2VzLFxyXG4gICAgICAgICAgICAgICAgW3Nob3BdOiB7XHJcbiAgICAgICAgICAgICAgICAgIHByaWNlLFxyXG4gICAgICAgICAgICAgICAgICBmdWxsUHJpY2U6IGRhdGEuZnVsbF9wcmljZSxcclxuICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZTogZGF0YS5zdWJzY3JpYmVyX2Rpc2NvdW50X3BlcmNlbnRhZ2UsXHJcbiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJQcmljZTogZGF0YS5zdWJzY3JpYmVyX3ByaWNlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgIGJpbmRGaW5kRmlsdGVyOiAoc2VudGVuY2UpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IE9iamVjdC52YWx1ZXMoc2VudGVuY2UpLnNoaWZ0KClcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4uKChmaWx0ZXJzPy5wcmljZSB8fCBmaWx0ZXJzPy5wcmljZSA9PT0gMCkgJiYgeyBwcmljZTogZmlsdGVycy5wcmljZSB9KSxcclxuICAgICAgICAgICAgICAuLi4oKGZpbHRlcnMuZnVsbFByaWNlIHx8IGZpbHRlcnMuZnVsbFByaWNlID09PSAwKSAmJiB7IGZ1bGxfcHJpY2U6IGZpbHRlcnMuZnVsbFByaWNlIH0pLFxyXG4gICAgICAgICAgICAgIC4uLigoZmlsdGVycy5zdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlIHx8IGZpbHRlcnMuc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZSA9PT0gMCkgJiYge1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlcl9kaXNjb3VudF9wZXJjZW50YWdlOiBmaWx0ZXJzLnN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2UsXHJcbiAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgLi4uKChmaWx0ZXJzLnN1YnNjcmliZXJQcmljZSB8fCBmaWx0ZXJzLnN1YnNjcmliZXJQcmljZSA9PT0gMCkgJiYge1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlcl9wcmljZTogZmlsdGVycy5zdWJzY3JpYmVyUHJpY2UsXHJcbiAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBiaW5kUGVyc2lzdERhdGE6ICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwcmljZURhdGEgPSBPYmplY3QudmFsdWVzKHZhbHVlKS5zaGlmdCgpXHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIC4uLihwcmljZURhdGE/LnByaWNlID49IDAgJiYgeyBwcmljZTogcHJpY2VEYXRhLnByaWNlIH0pLFxyXG4gICAgICAgICAgICAgIC4uLihwcmljZURhdGEuZnVsbFByaWNlID49IDAgJiYgeyBmdWxsX3ByaWNlOiBwcmljZURhdGEuZnVsbFByaWNlIH0pLFxyXG4gICAgICAgICAgICAgIC4uLihwcmljZURhdGEuc3Vic2NyaWJlckRpc2NvdW50UGVyY2VudGFnZSA+PSAwICYmIHtcclxuICAgICAgICAgICAgICAgIHN1YnNjcmliZXJfZGlzY291bnRfcGVyY2VudGFnZTogcHJpY2VEYXRhLnN1YnNjcmliZXJEaXNjb3VudFBlcmNlbnRhZ2UsXHJcbiAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgLi4uKHByaWNlRGF0YS5zdWJzY3JpYmVyUHJpY2UgPj0gMCAmJiB7IHN1YnNjcmliZXJfcHJpY2U6IHByaWNlRGF0YS5zdWJzY3JpYmVyUHJpY2UgfSksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAgeyBmdWxsUHJpY2U6IHsgY29sdW1uTmFtZTogJ2Z1bGxfcHJpY2UnIH0gfSxcclxuICAgICAgeyBzdWJzY3JpYmVyRGlzY291bnRQZXJjZW50YWdlOiB7IGNvbHVtbk5hbWU6ICdzdWJzY3JpYmVyX2Rpc2NvdW50X3BlcmNlbnRhZ2UnIH0gfSxcclxuICAgICAgeyBzdWJzY3JpYmVyUHJpY2U6IHsgY29sdW1uTmFtZTogJ3N1YnNjcmliZXJfcHJpY2UnIH0gfSxcclxuICAgICAgJ3B1Ymxpc2hlZCcsXHJcbiAgICAgIHsgcHVibGlzaGVkR2xhbTogeyBjb2x1bW5OYW1lOiAncHVibGlzaGVkX2dsYW0nIH0gfSxcclxuICAgICAgJ3NrdScsXHJcbiAgICAgIHtcclxuICAgICAgICBzdG9jazoge1xyXG4gICAgICAgICAgY29sdW1uTmFtZTogJ3N0b2NrJyxcclxuICAgICAgICAgIGZyb206IChxdWFudGl0eTogbnVtYmVyKSA9PiAoeyBxdWFudGl0eSB9KSxcclxuICAgICAgICAgIHRvOiAodmFsdWUpID0+IChpc05pbCh2YWx1ZT8ucXVhbnRpdHkpID8gdmFsdWUgOiB2YWx1ZT8ucXVhbnRpdHkpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgICdzbHVnJyxcclxuICAgICAgJ3R5cGUnLFxyXG4gICAgICAndmlkZW8nLFxyXG4gICAgICAnd2VpZ2h0JyxcclxuICAgICAge1xyXG4gICAgICAgIHNob3BBdmFpbGFiaWxpdHk6IHtcclxuICAgICAgICAgIGNvbHVtbk5hbWU6ICdzaG9wX2F2YWlsYWJpbGl0aWVzJyxcclxuICAgICAgICAgIGZpZWxkczogWydzaG9wJ10sXHJcbiAgICAgICAgICBmcm9tOiAoc2hvcCkgPT4gKEFycmF5LmlzQXJyYXkoc2hvcCkgPyBzaG9wLm1hcCgocm93OiB7IHNob3A6IFNob3BzIH0pID0+IHJvdy5zaG9wKSA6IFtdKSxcclxuICAgICAgICAgIHRvOiAoc2hvcHMpID0+IHNob3BzLm1hcCgoc2hvcDogU2hvcHMpID0+ICh7IHNob3AgfSkpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHsgdGFnczogeyBjb2x1bW5OYW1lOiAndGFncycsIHR5cGU6IEhhc3VyYUdyYXBoUUxDb2x1bW5UeXBlLkpzb25iIH0gfSxcclxuICAgICAgeyBpc0tpdDogeyBjb2x1bW5OYW1lOiAnaXNfa2l0JyB9IH0sXHJcbiAgICAgIHsgY3JlYXRlZEF0OiB7IGNvbHVtbk5hbWU6ICdjcmVhdGVkX2F0JyB9IH0sXHJcbiAgICAgIHsgdXBkYXRlZEF0OiB7IGNvbHVtbk5hbWU6ICd1cGRhdGVkX2F0JyB9IH0sXHJcbiAgICBdXHJcblxyXG4gICAgdGhpcy5maWVsZHMgPSBbXHJcbiAgICAgIC4uLmNvbW1vbkZpZWxkcyxcclxuICAgICAge1xyXG4gICAgICAgIGNhdGVnb3JpZXM6IHtcclxuICAgICAgICAgIGNvbHVtbk5hbWU6ICdjYXRlZ29yaWVzJyxcclxuICAgICAgICAgIGZpZWxkczogWydjYXRlZ29yeV9pZCddLFxyXG4gICAgICAgICAgYmluZFBlcnNpc3REYXRhOiAodmFsdWUpID0+ICh7XHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IHsgZGF0YTogdmFsdWUubWFwKChjYXRlZ29yeSkgPT4gKHsgY2F0ZWdvcnlfaWQ6ICtjYXRlZ29yeSB9KSkgfSxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgdG86IChjYXRlZ29yaWVzKSA9PiBjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnlJZCkgPT4gK2NhdGVnb3J5SWQpLFxyXG4gICAgICAgICAgZnJvbTogKGNhdGVnb3JpZXM6IHsgY2F0ZWdvcnlfaWQ6IG51bWJlciB9W10pID0+XHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM/Lm1hcCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5Py5jYXRlZ29yeV9pZD8udG9TdHJpbmcoKSkgfHwgW10sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGtpdFByb2R1Y3RzOiB7XHJcbiAgICAgICAgICBjb2x1bW5OYW1lOiAna2l0X3Byb2R1Y3RzJyxcclxuICAgICAgICAgIGZvcmVpZ25LZXlDb2x1bW46IHsgcHJvZHVjdElkOiAnaWQnIH0sXHJcbiAgICAgICAgICBmaWVsZHM6IFtcclxuICAgICAgICAgICAgeyBwcm9kdWN0SWQ6IHsgY29sdW1uTmFtZTogJ3Byb2R1Y3RfaWQnIH0gfSxcclxuICAgICAgICAgICAgeyBraXRQcm9kdWN0SWQ6IHsgY29sdW1uTmFtZTogJ2tpdF9wcm9kdWN0X2lkJyB9IH0sXHJcbiAgICAgICAgICAgICdxdWFudGl0eScsXHJcbiAgICAgICAgICAgIHsgcHJvZHVjdDogeyBjb2x1bW5OYW1lOiAncHJvZHVjdCcsIGZvcmVpZ25LZXlDb2x1bW46IHsgaWQ6ICdwcm9kdWN0X2lkJyB9LCBmaWVsZHM6IGNvbW1vbkZpZWxkcyB9IH0sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICBdXHJcbiAgfVxyXG5cclxuICBhc3luYyBjcmVhdGUoZGF0YTogQ3JlYXRlUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4pOiBQcm9taXNlPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiB7XHJcbiAgICBjb25zdCBwcm9kdWN0ID0gYXdhaXQgc3VwZXIuY3JlYXRlKG9taXQoZGF0YSwgWydyZXZpZXdzJ10pKVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHByb2R1Y3QucmV2aWV3cyA9IGF3YWl0IHRoaXMudXBkYXRlUmV2aWV3cygrcHJvZHVjdC5pZCwgZGF0YSlcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlKHsgaWQ6IHByb2R1Y3QuaWQgfSlcclxuXHJcbiAgICAgIHRocm93IGVycm9yXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHByb2R1Y3RcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldChpZGVudGlmaWVyczogR2V0UmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4pOiBQcm9taXNlPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiB7XHJcbiAgICBjb25zdCBwcm9kdWN0ID0gTnVtYmVyLmlzTmFOKCtpZGVudGlmaWVycy5pZClcclxuICAgICAgPyAoYXdhaXQgdGhpcy5maW5kKHsgZmlsdGVyczogeyBmaXJlc3RvcmVJZDogaWRlbnRpZmllcnMuaWQgfSB9KSkuZGF0YT8uWzBdXHJcbiAgICAgIDogYXdhaXQgc3VwZXIuZ2V0KGlkZW50aWZpZXJzKVxyXG5cclxuICAgIHByb2R1Y3QucmV2aWV3cyA9IGF3YWl0IHRoaXMuZmluZFJldmlld3NCeVByb2R1Y3QoK3Byb2R1Y3QuaWQpXHJcblxyXG4gICAgcmV0dXJuIHByb2R1Y3RcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldEJ5U2x1ZyhzbHVnOiBzdHJpbmcsIHNob3A6IFNob3BzKTogUHJvbWlzZTxQcm9kdWN0SGFzdXJhR3JhcGhRTD4ge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5maW5kKHtcclxuICAgICAgZmlsdGVyczoge1xyXG4gICAgICAgIHNsdWcsXHJcbiAgICAgICAgc2hvcEF2YWlsYWJpbGl0eTogW3Nob3BdLFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICBjb25zdCBwcm9kdWN0ID0gcmVzdWx0Py5kYXRhPy5zaGlmdCgpXHJcblxyXG4gICAgcHJvZHVjdC5yZXZpZXdzID0gYXdhaXQgdGhpcy5maW5kUmV2aWV3c0J5UHJvZHVjdCgrcHJvZHVjdC5pZClcclxuXHJcbiAgICByZXR1cm4gcHJvZHVjdFxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlKHBhcmFtczogVXBkYXRlUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4pOiBQcm9taXNlPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiB7XHJcbiAgICBjb25zdCB7IGNhdGVnb3JpZXMsIGtpdFByb2R1Y3RzLCByZXZpZXdzLCBpZDogY2hlY2tJZCwgLi4uZGF0YSB9ID0gcGFyYW1zXHJcbiAgICBjb25zdCBwbGFpbkRhdGEgPSB0aGlzLnBhcmFtc1RvUGxhaW4oeyBpZDogY2hlY2tJZCB9KVxyXG4gICAgY29uc3QgaWQgPSBhd2FpdCB0aGlzLmdldElkKHBsYWluRGF0YS5pZClcclxuICAgIGNvbnN0IHByb2R1Y3QgPSBhd2FpdCBzdXBlci51cGRhdGUoeyBpZCwgLi4uZGF0YSB9KVxyXG5cclxuICAgIHByb2R1Y3QuY2F0ZWdvcmllcyA9IGNhdGVnb3JpZXMgJiYgKGF3YWl0IHRoaXMudXBkYXRlQ2F0ZWdvcmllcygraWQsIHsgY2F0ZWdvcmllcyB9KSlcclxuICAgIHByb2R1Y3Qua2l0UHJvZHVjdHMgPSBraXRQcm9kdWN0cyAmJiAoYXdhaXQgdGhpcy51cGRhdGVLaXRQcm9kdWN0cygraWQsIHsga2l0UHJvZHVjdHMgfSkpXHJcbiAgICBwcm9kdWN0LnJldmlld3MgPSByZXZpZXdzICYmIChhd2FpdCB0aGlzLnVwZGF0ZVJldmlld3MoK2lkLCB7IHJldmlld3MgfSkpXHJcblxyXG4gICAgcmV0dXJuIHByb2R1Y3RcclxuICB9XHJcblxyXG4gIGFzeW5jIGZldGNoUmV2aWV3cyhzdGF0dXM6IFJldmlld1N0YXR1c1BhcmFtcyk6IFByb21pc2U8UmV2aWV3V2l0aFByb2R1Y3REYXRhW10+IHtcclxuICAgIGNvbnN0IHJldmlld3MgPSB7XHJcbiAgICAgIHN0YXR1czpcclxuICAgICAgICBzdGF0dXMgPT09ICdwZW5kaW5nJ1xyXG4gICAgICAgICAgPyB7IFtIYXN1cmFHcmFwaFFMV2hlcmUuSVNOVUxMXTogdHJ1ZSB9XHJcbiAgICAgICAgICA6IHsgW0hhc3VyYUdyYXBoUUxXaGVyZS5FUVVBTFNdOiBzdGF0dXMgPT09ICdhcHByb3ZlZCcgfSxcclxuICAgIH1cclxuICAgIGNvbnN0IHsgcHJvZHVjdDogZGF0YSB9ID0gYXdhaXQgdGhpcy5xdWVyeShcclxuICAgICAgJ3Byb2R1Y3QnLFxyXG4gICAgICBbJ2lkJywgJ25hbWUnLCAnc2t1JywgeyByZXZpZXdzOiB7IGNvbHVtbk5hbWU6ICdyZXZpZXdzJywgZmllbGRzOiB0aGlzLnJldmlld3NGaWVsZHMgfSB9XSxcclxuICAgICAge1xyXG4gICAgICAgIHdoZXJlOiB7IHZhbHVlOiB7IHJldmlld3MgfSwgdHlwZTogJ3Byb2R1Y3RfYm9vbF9leHAnLCByZXF1aXJlZDogdHJ1ZSB9LFxyXG4gICAgICB9LFxyXG4gICAgKVxyXG5cclxuICAgIHJldHVybiBkYXRhLnJlZHVjZShcclxuICAgICAgKHJldmlld3MsIHByb2R1Y3QpID0+IFtcclxuICAgICAgICAuLi5yZXZpZXdzLFxyXG4gICAgICAgIC4uLnByb2R1Y3QucmV2aWV3c1xyXG4gICAgICAgICAgLmZpbHRlcihcclxuICAgICAgICAgICAgKHJldmlldykgPT5cclxuICAgICAgICAgICAgICAoc3RhdHVzID09PSAncGVuZGluZycgJiYgW3VuZGVmaW5lZCwgbnVsbF0uaW5jbHVkZXMocmV2aWV3LnN0YXR1cykpIHx8XHJcbiAgICAgICAgICAgICAgKHN0YXR1cyA9PT0gJ2FwcHJvdmVkJyAmJiByZXZpZXcuc3RhdHVzID09PSB0cnVlKSB8fFxyXG4gICAgICAgICAgICAgIChzdGF0dXMgPT09ICdyZWplY3RlZCcgJiYgcmV2aWV3LnN0YXR1cyA9PT0gZmFsc2UpLFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLm1hcCgocmV2aWV3KSA9PiAoe1xyXG4gICAgICAgICAgICAuLi50aGlzLmJpbmRSZXZpZXdUb01vZGVsKHJldmlldyksXHJcbiAgICAgICAgICAgIHByb2R1Y3RJZDogcHJvZHVjdC5pZCxcclxuICAgICAgICAgICAgcHJvZHVjdE5hbWU6IHByb2R1Y3QubmFtZSxcclxuICAgICAgICAgICAgcHJvZHVjdFNrdTogcHJvZHVjdC5za3UsXHJcbiAgICAgICAgICB9KSksXHJcbiAgICAgIF0sXHJcbiAgICAgIFtdIGFzIFJldmlld1dpdGhQcm9kdWN0RGF0YVtdLFxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVDYXRlZ29yaWVzKFxyXG4gICAgcHJvZHVjdElkOiBudW1iZXIsXHJcbiAgICB7IGNhdGVnb3JpZXMgfTogUGljazxVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiwgJ2NhdGVnb3JpZXMnPixcclxuICApOiBQcm9taXNlPFByb2R1Y3RIYXN1cmFHcmFwaFFMWydjYXRlZ29yaWVzJ10+IHtcclxuICAgIGNvbnN0IHBsYWluRGF0YSA9IHRoaXMucGFyYW1zVG9QbGFpbih7IGNhdGVnb3JpZXMgfSlcclxuXHJcbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdkZWxldGVfY2F0ZWdvcnlfcHJvZHVjdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XHJcbiAgICAgIHdoZXJlOiB7XHJcbiAgICAgICAgdHlwZTogJ2NhdGVnb3J5X3Byb2R1Y3RfYm9vbF9leHAnLFxyXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgIHZhbHVlOiB7IHByb2R1Y3RfaWQ6IHsgX2VxOiBwcm9kdWN0SWQgfSB9LFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdpbnNlcnRfY2F0ZWdvcnlfcHJvZHVjdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XHJcbiAgICAgIG9iamVjdHM6IHtcclxuICAgICAgICB0eXBlOiAnW2NhdGVnb3J5X3Byb2R1Y3RfaW5zZXJ0X2lucHV0IV0nLFxyXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgIHZhbHVlOiBwbGFpbkRhdGEuY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5SWQpID0+ICh7IGNhdGVnb3J5X2lkOiBjYXRlZ29yeUlkLCBwcm9kdWN0X2lkOiBwcm9kdWN0SWQgfSkpLFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gcGxhaW5EYXRhLmNhdGVnb3JpZXNcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlS2l0UHJvZHVjdHMoXHJcbiAgICBwcm9kdWN0SWQ6IG51bWJlcixcclxuICAgIHsga2l0UHJvZHVjdHMgfTogUGljazxVcGRhdGVSZXBvc2l0b3J5UGFyYW1zPFByb2R1Y3RIYXN1cmFHcmFwaFFMPiwgJ2tpdFByb2R1Y3RzJz4sXHJcbiAgKTogUHJvbWlzZTxQcm9kdWN0SGFzdXJhR3JhcGhRTFsna2l0UHJvZHVjdHMnXT4ge1xyXG4gICAgY29uc3QgcGxhaW5EYXRhID0gdGhpcy5wYXJhbXNUb1BsYWluKHsga2l0UHJvZHVjdHMgfSlcclxuXHJcbiAgICBhd2FpdCB0aGlzLm11dGF0aW9uKCdkZWxldGVfcHJvZHVjdF9raXQnLCBbJ2FmZmVjdGVkX3Jvd3MnXSwge1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIHR5cGU6ICdwcm9kdWN0X2tpdF9ib29sX2V4cCcsXHJcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgICAgdmFsdWU6IHsgcHJvZHVjdF9pZDogeyBfZXE6IHByb2R1Y3RJZCB9IH0sXHJcbiAgICAgIH0sXHJcbiAgICB9KVxyXG5cclxuICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ2luc2VydF9wcm9kdWN0X2tpdCcsIFsnYWZmZWN0ZWRfcm93cyddLCB7XHJcbiAgICAgIG9iamVjdHM6IHtcclxuICAgICAgICB0eXBlOiAnW3Byb2R1Y3Rfa2l0X2luc2VydF9pbnB1dCFdJyxcclxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgICB2YWx1ZTogcGxhaW5EYXRhLmtpdFByb2R1Y3RzLm1hcCgoa2l0UHJvZHVjdCkgPT4gKHtcclxuICAgICAgICAgIGtpdF9wcm9kdWN0X2lkOiBraXRQcm9kdWN0LnByb2R1Y3RJZCB8fCBraXRQcm9kdWN0LnByb2R1Y3QuaWQsXHJcbiAgICAgICAgICBwcm9kdWN0X2lkOiBwcm9kdWN0SWQsXHJcbiAgICAgICAgICBxdWFudGl0eToga2l0UHJvZHVjdC5xdWFudGl0eSxcclxuICAgICAgICB9KSksXHJcbiAgICAgIH0sXHJcbiAgICB9KVxyXG5cclxuICAgIHJldHVybiBwbGFpbkRhdGEua2l0UHJvZHVjdHNcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlUmV2aWV3cyhcclxuICAgIHByb2R1Y3RJZDogbnVtYmVyLFxyXG4gICAgeyByZXZpZXdzIH06IFBpY2s8VXBkYXRlUmVwb3NpdG9yeVBhcmFtczxQcm9kdWN0SGFzdXJhR3JhcGhRTD4sICdyZXZpZXdzJz4sXHJcbiAgKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3W10+IHtcclxuICAgIGlmICghcmV2aWV3cykgcmV0dXJuIFtdXHJcbiAgICBpZiAoJ2FjdGlvbicgaW4gcmV2aWV3cyAmJiByZXZpZXdzLmFjdGlvbiA9PT0gJ3JlbW92ZScpIHtcclxuICAgICAgY29uc3QgcmV2aWV3SWRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgcmV2aWV3cy52YWx1ZS5tYXAoYXN5bmMgKHJldmlld0RhdGEpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHJldmlldyA9IGF3YWl0IHRoaXMuZmluZFJldmlldyhyZXZpZXdEYXRhLCBwcm9kdWN0SWQpXHJcblxyXG4gICAgICAgICAgcmV0dXJuIHJldmlldz8uaWRcclxuICAgICAgICB9KSxcclxuICAgICAgKVxyXG5cclxuICAgICAgYXdhaXQgdGhpcy5tdXRhdGlvbignZGVsZXRlX3Byb2R1Y3RfcmV2aWV3JywgWydhZmZlY3RlZF9yb3dzJ10sIHtcclxuICAgICAgICB3aGVyZTogeyB2YWx1ZTogeyBpZDogeyBfaW46IHJldmlld0lkcy5maWx0ZXIoQm9vbGVhbikgfSB9LCB0eXBlOiAncHJvZHVjdF9yZXZpZXdfYm9vbF9leHAnLCByZXF1aXJlZDogdHJ1ZSB9LFxyXG4gICAgICB9KVxyXG5cclxuICAgICAgcmV0dXJuIHJldmlld3MudmFsdWUubWFwKChyZXZpZXcsIGluZGV4KSA9PiAhcmV2aWV3SWRzW2luZGV4XSAmJiByZXZpZXcpLmZpbHRlcihCb29sZWFuKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBsYWluRGF0YSA9IHRoaXMucGFyYW1zVG9QbGFpbih7IHJldmlld3MgfSlcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXHJcbiAgICAgIHBsYWluRGF0YS5yZXZpZXdzLm1hcChhc3luYyAocmV2aWV3RGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJldmlldyA9IGF3YWl0IHRoaXMuZmluZFJldmlldyhyZXZpZXdEYXRhLCBwcm9kdWN0SWQpXHJcblxyXG4gICAgICAgIGlmIChyZXZpZXcpXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChcclxuICAgICAgICAgICAgKFxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMubXV0YXRpb24oJ3VwZGF0ZV9wcm9kdWN0X3Jldmlld19ieV9waycsIHRoaXMucmV2aWV3c0ZpZWxkcywge1xyXG4gICAgICAgICAgICAgICAgcGtfY29sdW1uczoge1xyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogeyBpZDogcmV2aWV3LmlkIH0sXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdwcm9kdWN0X3Jldmlld19wa19jb2x1bW5zX2lucHV0JyxcclxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgX3NldDoge1xyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogb21pdCh0aGlzLmJpbmRSZXZpZXdUb0hhc3VyYShyZXZpZXdEYXRhKSwgWydpZCcsICdwcm9kdWN0X2lkJ10pLFxyXG4gICAgICAgICAgICAgICAgICB0eXBlOiAncHJvZHVjdF9yZXZpZXdfc2V0X2lucHV0JyxcclxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICkudXBkYXRlX3Byb2R1Y3RfcmV2aWV3X2J5X3BrLFxyXG4gICAgICAgICAgKVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChcclxuICAgICAgICAgIChcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tdXRhdGlvbignaW5zZXJ0X3Byb2R1Y3RfcmV2aWV3X29uZScsIHRoaXMucmV2aWV3c0ZpZWxkcywge1xyXG4gICAgICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6IG9taXQoeyAuLi50aGlzLmJpbmRSZXZpZXdUb0hhc3VyYShyZXZpZXdEYXRhKSwgcHJvZHVjdF9pZDogcHJvZHVjdElkIH0sIFsnaWQnXSksXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAncHJvZHVjdF9yZXZpZXdfaW5zZXJ0X2lucHV0JyxcclxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApLmluc2VydF9wcm9kdWN0X3Jldmlld19vbmUsXHJcbiAgICAgICAgKVxyXG4gICAgICB9KSxcclxuICAgIClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0SWQoaWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBpZiAoIU51bWJlci5pc05hTigraWQpKSByZXR1cm4gaWRcclxuXHJcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuZmluZCh7IGZpbHRlcnM6IHsgZmlyZXN0b3JlSWQ6IGlkIH0gfSlcclxuXHJcbiAgICBpZiAoZGF0YT8uWzBdPy5pZCkgcmV0dXJuIGRhdGE/LlswXT8uaWRcclxuXHJcbiAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgUHJvZHVjdCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGZpbmRSZXZpZXdzQnlQcm9kdWN0KHByb2R1Y3RJZDogbnVtYmVyKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3W10+IHtcclxuICAgIGNvbnN0IHsgcHJvZHVjdF9yZXZpZXc6IGRhdGEgfSA9IGF3YWl0IHRoaXMucXVlcnkoJ3Byb2R1Y3RfcmV2aWV3JywgdGhpcy5yZXZpZXdzRmllbGRzLCB7XHJcbiAgICAgIHdoZXJlOiB7XHJcbiAgICAgICAgdmFsdWU6IHtcclxuICAgICAgICAgIHByb2R1Y3RfaWQ6IHsgX2VxOiBwcm9kdWN0SWQgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHR5cGU6ICdwcm9kdWN0X3Jldmlld19ib29sX2V4cCcsXHJcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICB9KVxyXG5cclxuICAgIHJldHVybiBkYXRhICYmIGRhdGEubWFwKChyZXZpZXcpID0+IHRoaXMuYmluZFJldmlld1RvTW9kZWwocmV2aWV3KSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZmluZFJldmlldyhyZXZpZXc6IFByb2R1Y3RSZXZpZXcsIHByb2R1Y3RJZDogbnVtYmVyKTogUHJvbWlzZTxQcm9kdWN0UmV2aWV3PiB7XHJcbiAgICBpZiAocmV2aWV3LmlkKSByZXR1cm4gcmV2aWV3XHJcblxyXG4gICAgbGV0IGxvYWRlZFJldmlldzogUHJvZHVjdFJldmlld1xyXG5cclxuICAgIGlmIChyZXZpZXcucGVyc29uSWQpIGxvYWRlZFJldmlldyA9IGF3YWl0IHRoaXMuZ2V0UmV2aWV3QnlQZXJzb25JZChyZXZpZXcucGVyc29uSWQsIHByb2R1Y3RJZClcclxuICAgIGlmICghbG9hZGVkUmV2aWV3ICYmIHJldmlldy5hdXRob3IgJiYgcmV2aWV3LmVtYWlsKVxyXG4gICAgICBsb2FkZWRSZXZpZXcgPSBhd2FpdCB0aGlzLmdldFJldmlld0J5QXV0aG9yQW5kRW1haWwocmV2aWV3LmF1dGhvciwgcmV2aWV3LmVtYWlsLCBwcm9kdWN0SWQpXHJcblxyXG4gICAgcmV0dXJuIGxvYWRlZFJldmlldyB8fCByZXZpZXdcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmV2aWV3QnlQZXJzb25JZChwZXJzb25JZDogbnVtYmVyLCBwcm9kdWN0SWQ6IG51bWJlcik6IFByb21pc2U8UHJvZHVjdFJldmlldz4ge1xyXG4gICAgY29uc3QgeyBwcm9kdWN0X3JldmlldzogZGF0YSB9ID0gYXdhaXQgdGhpcy5xdWVyeSgncHJvZHVjdF9yZXZpZXcnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcclxuICAgICAgd2hlcmU6IHtcclxuICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgcHJvZHVjdF9pZDogeyBfZXE6IHByb2R1Y3RJZCB9LFxyXG4gICAgICAgICAgcGVyc29uX2lkOiB7IF9lcTogcGVyc29uSWQgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHR5cGU6IGBwcm9kdWN0X3Jldmlld19ib29sX2V4cGAsXHJcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICB9KVxyXG5cclxuICAgIHJldHVybiBkYXRhICYmIGRhdGFbMF0gJiYgdGhpcy5iaW5kUmV2aWV3VG9Nb2RlbChkYXRhWzBdKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRSZXZpZXdCeUF1dGhvckFuZEVtYWlsKGF1dGhvcjogc3RyaW5nLCBlbWFpbDogc3RyaW5nLCBwcm9kdWN0SWQ6IG51bWJlcik6IFByb21pc2U8UHJvZHVjdFJldmlldz4ge1xyXG4gICAgY29uc3QgeyBwcm9kdWN0X3JldmlldzogZGF0YSB9ID0gYXdhaXQgdGhpcy5xdWVyeSgncHJvZHVjdF9yZXZpZXcnLCB0aGlzLnJldmlld3NGaWVsZHMsIHtcclxuICAgICAgd2hlcmU6IHtcclxuICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgcHJvZHVjdF9pZDogeyBfZXE6IHByb2R1Y3RJZCB9LFxyXG4gICAgICAgICAgYXV0aG9yOiB7IF9lcTogYXV0aG9yIH0sXHJcbiAgICAgICAgICBlbWFpbDogeyBfZXE6IGVtYWlsIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0eXBlOiBgcHJvZHVjdF9yZXZpZXdfYm9vbF9leHBgLFxyXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gZGF0YSAmJiBkYXRhWzBdICYmIHRoaXMuYmluZFJldmlld1RvTW9kZWwoZGF0YVswXSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmluZFJldmlld1RvTW9kZWwgPSAocGxhaW46IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9kdWN0UmV2aWV3ID0+ICh7XHJcbiAgICAuLi5vbWl0KHBsYWluLCBbJ3Byb2R1Y3RfaWQnLCAnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ3BlcnNvbl9pZCcsICdvcmRlcl9pZCddKSxcclxuICAgIGNyZWF0ZWRBdDogdHlwZW9mIHBsYWluLmNyZWF0ZWRfYXQgPT09ICdzdHJpbmcnID8gbmV3IERhdGUocGxhaW4uY3JlYXRlZF9hdCkgOiBwbGFpbi5jcmVhdGVkX2F0LFxyXG4gICAgdXBkYXRlZEF0OiB0eXBlb2YgcGxhaW4udXBkYXRlZF9hdCA9PT0gJ3N0cmluZycgPyBuZXcgRGF0ZShwbGFpbi51cGRhdGVkX2F0KSA6IHBsYWluLnVwZGF0ZWRfYXQsXHJcbiAgICBwZXJzb25JZDogcGxhaW4ucGVyc29uX2lkLFxyXG4gICAgb3JkZXJJZDogcGxhaW4ub3JkZXJfaWQsXHJcbiAgfSlcclxuXHJcbiAgcHJpdmF0ZSBiaW5kUmV2aWV3VG9IYXN1cmEgPSAocmV2aWV3OiBQcm9kdWN0UmV2aWV3KTogUHJvZHVjdFJldmlld0ZpZWxkcyA9PiAoe1xyXG4gICAgLi4ub21pdChyZXZpZXcsIFsncHJvZHVjdElkJywgJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnLCAncGVyc29uSWQnLCAnb3JkZXJJZCddKSxcclxuICAgIHBlcnNvbl9pZDogcmV2aWV3LnBlcnNvbklkLFxyXG4gICAgb3JkZXJfaWQ6IHJldmlldy5vcmRlcklkLFxyXG4gIH0pXHJcbn1cclxuIl19