@mohasinac/appkit 2.6.3 → 2.6.4

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 (606) hide show
  1. package/dist/_internal/server/features/account/data.js +2 -2
  2. package/dist/_internal/server/features/bundles/data.d.ts +26 -6
  3. package/dist/_internal/server/features/bundles/data.js +41 -6
  4. package/dist/_internal/server/features/bundles/index.d.ts +3 -2
  5. package/dist/_internal/server/features/bundles/index.js +4 -2
  6. package/dist/_internal/server/features/bundles/metadata.d.ts +20 -0
  7. package/dist/_internal/server/features/bundles/metadata.js +46 -0
  8. package/dist/_internal/server/features/bundles/og.d.ts +38 -0
  9. package/dist/_internal/server/features/bundles/og.js +122 -0
  10. package/dist/_internal/server/features/checkout/actions.js +192 -133
  11. package/dist/_internal/server/features/checkout/bundle-expansion.d.ts +57 -0
  12. package/dist/_internal/server/features/checkout/bundle-expansion.js +70 -0
  13. package/dist/_internal/server/features/checkout/prize-bundle-gates.d.ts +5 -15
  14. package/dist/_internal/server/features/checkout/prize-bundle-gates.js +5 -21
  15. package/dist/_internal/server/features/media/contextGuards.js +15 -1
  16. package/dist/_internal/server/features/payouts/actions.d.ts +19 -0
  17. package/dist/_internal/server/features/payouts/actions.js +38 -0
  18. package/dist/_internal/server/features/products/data.js +1 -2
  19. package/dist/_internal/server/features/raffle/actions.d.ts +11 -0
  20. package/dist/_internal/server/features/raffle/actions.js +31 -0
  21. package/dist/_internal/server/features/refunds/actions.d.ts +31 -0
  22. package/dist/_internal/server/features/refunds/actions.js +77 -0
  23. package/dist/_internal/server/jobs/core/adminAnalytics.d.ts +28 -0
  24. package/dist/_internal/server/jobs/core/adminAnalytics.js +98 -0
  25. package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +19 -0
  26. package/dist/_internal/server/jobs/core/assignSpinPrize.js +81 -0
  27. package/dist/_internal/server/jobs/core/auctionSettlement.d.ts +2 -0
  28. package/dist/_internal/server/jobs/core/auctionSettlement.js +70 -0
  29. package/dist/_internal/server/jobs/core/autoPayoutEligibility.d.ts +2 -0
  30. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +109 -0
  31. package/dist/_internal/server/jobs/core/bundleStockSync.d.ts +10 -0
  32. package/dist/_internal/server/jobs/core/bundleStockSync.js +71 -0
  33. package/dist/_internal/server/jobs/core/cartPrune.d.ts +2 -0
  34. package/dist/_internal/server/jobs/core/cartPrune.js +13 -0
  35. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.d.ts +2 -0
  36. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +45 -0
  37. package/dist/_internal/server/jobs/core/countersReconcile.d.ts +2 -0
  38. package/dist/_internal/server/jobs/core/countersReconcile.js +107 -0
  39. package/dist/_internal/server/jobs/core/couponExpiry.d.ts +2 -0
  40. package/dist/_internal/server/jobs/core/couponExpiry.js +13 -0
  41. package/dist/_internal/server/jobs/core/dailyDataCleanup.d.ts +2 -0
  42. package/dist/_internal/server/jobs/core/dailyDataCleanup.js +20 -0
  43. package/dist/_internal/server/jobs/core/index.d.ts +44 -0
  44. package/dist/_internal/server/jobs/core/index.js +47 -0
  45. package/dist/_internal/server/jobs/core/listingProcessor.d.ts +30 -0
  46. package/dist/_internal/server/jobs/core/listingProcessor.js +138 -0
  47. package/dist/_internal/server/jobs/core/mediaTmpCleanup.d.ts +14 -0
  48. package/dist/_internal/server/jobs/core/mediaTmpCleanup.js +68 -0
  49. package/dist/_internal/server/jobs/core/notificationPrune.d.ts +2 -0
  50. package/dist/_internal/server/jobs/core/notificationPrune.js +13 -0
  51. package/dist/_internal/server/jobs/core/offerExpiry.d.ts +2 -0
  52. package/dist/_internal/server/jobs/core/offerExpiry.js +50 -0
  53. package/dist/_internal/server/jobs/core/onBidPlaced.d.ts +15 -0
  54. package/dist/_internal/server/jobs/core/onBidPlaced.js +59 -0
  55. package/dist/_internal/server/jobs/core/onCategoryWrite.d.ts +14 -0
  56. package/dist/_internal/server/jobs/core/onCategoryWrite.js +134 -0
  57. package/dist/_internal/server/jobs/core/onOrderCreate.d.ts +18 -0
  58. package/dist/_internal/server/jobs/core/onOrderCreate.js +78 -0
  59. package/dist/_internal/server/jobs/core/onOrderStatusChange.d.ts +19 -0
  60. package/dist/_internal/server/jobs/core/onOrderStatusChange.js +139 -0
  61. package/dist/_internal/server/jobs/core/onProductStockChange.d.ts +23 -0
  62. package/dist/_internal/server/jobs/core/onProductStockChange.js +130 -0
  63. package/dist/_internal/server/jobs/core/onProductWrite.d.ts +12 -0
  64. package/dist/_internal/server/jobs/core/onProductWrite.js +94 -0
  65. package/dist/_internal/server/jobs/core/onReviewWrite.d.ts +7 -0
  66. package/dist/_internal/server/jobs/core/onReviewWrite.js +49 -0
  67. package/dist/_internal/server/jobs/core/onStoreWrite.d.ts +12 -0
  68. package/dist/_internal/server/jobs/core/onStoreWrite.js +7 -0
  69. package/dist/_internal/server/jobs/core/payoutBatch.d.ts +8 -0
  70. package/dist/_internal/server/jobs/core/payoutBatch.js +102 -0
  71. package/dist/_internal/server/jobs/core/pendingOrderTimeout.d.ts +2 -0
  72. package/dist/_internal/server/jobs/core/pendingOrderTimeout.js +27 -0
  73. package/dist/_internal/server/jobs/core/positionsReconcile.d.ts +7 -0
  74. package/dist/_internal/server/jobs/core/positionsReconcile.js +87 -0
  75. package/dist/_internal/server/jobs/core/prizeRevealClose.d.ts +2 -0
  76. package/dist/_internal/server/jobs/core/prizeRevealClose.js +22 -0
  77. package/dist/_internal/server/jobs/core/prizeRevealExpiry.d.ts +2 -0
  78. package/dist/_internal/server/jobs/core/prizeRevealExpiry.js +50 -0
  79. package/dist/_internal/server/jobs/core/prizeRevealOpen.d.ts +2 -0
  80. package/dist/_internal/server/jobs/core/prizeRevealOpen.js +56 -0
  81. package/dist/_internal/server/jobs/core/prizeRevealReminder.d.ts +2 -0
  82. package/dist/_internal/server/jobs/core/prizeRevealReminder.js +38 -0
  83. package/dist/_internal/server/jobs/core/productStatsSync.d.ts +8 -0
  84. package/dist/_internal/server/jobs/core/productStatsSync.js +36 -0
  85. package/dist/_internal/server/jobs/core/promotions.d.ts +12 -0
  86. package/dist/_internal/server/jobs/core/promotions.js +43 -0
  87. package/dist/_internal/server/jobs/core/storeAnalytics.d.ts +30 -0
  88. package/dist/_internal/server/jobs/core/storeAnalytics.js +109 -0
  89. package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +19 -0
  90. package/dist/_internal/server/jobs/core/triggerEventRaffle.js +86 -0
  91. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.d.ts +6 -0
  92. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +85 -0
  93. package/dist/_internal/server/jobs/handlers/adminAnalytics.d.ts +2 -26
  94. package/dist/_internal/server/jobs/handlers/adminAnalytics.js +2 -98
  95. package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +1 -22
  96. package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +2 -86
  97. package/dist/_internal/server/jobs/handlers/auctionSettlement.js +2 -70
  98. package/dist/_internal/server/jobs/handlers/autoPayoutEligibility.js +2 -110
  99. package/dist/_internal/server/jobs/handlers/bundleStockSync.d.ts +0 -16
  100. package/dist/_internal/server/jobs/handlers/bundleStockSync.js +2 -80
  101. package/dist/_internal/server/jobs/handlers/cartPrune.js +2 -13
  102. package/dist/_internal/server/jobs/handlers/cleanupRtdbEvents.js +2 -45
  103. package/dist/_internal/server/jobs/handlers/countersReconcile.js +2 -109
  104. package/dist/_internal/server/jobs/handlers/couponExpiry.js +2 -13
  105. package/dist/_internal/server/jobs/handlers/dailyDataCleanup.js +2 -20
  106. package/dist/_internal/server/jobs/handlers/listingProcessor.d.ts +3 -28
  107. package/dist/_internal/server/jobs/handlers/listingProcessor.js +3 -138
  108. package/dist/_internal/server/jobs/handlers/mediaTmpCleanup.d.ts +0 -12
  109. package/dist/_internal/server/jobs/handlers/mediaTmpCleanup.js +2 -69
  110. package/dist/_internal/server/jobs/handlers/notificationPrune.js +2 -13
  111. package/dist/_internal/server/jobs/handlers/offerExpiry.js +2 -50
  112. package/dist/_internal/server/jobs/handlers/onBidPlaced.d.ts +1 -10
  113. package/dist/_internal/server/jobs/handlers/onBidPlaced.js +2 -56
  114. package/dist/_internal/server/jobs/handlers/onCategoryWrite.d.ts +1 -8
  115. package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +6 -134
  116. package/dist/_internal/server/jobs/handlers/onOrderCreate.d.ts +1 -12
  117. package/dist/_internal/server/jobs/handlers/onOrderCreate.js +2 -76
  118. package/dist/_internal/server/jobs/handlers/onOrderStatusChange.d.ts +1 -12
  119. package/dist/_internal/server/jobs/handlers/onOrderStatusChange.js +2 -139
  120. package/dist/_internal/server/jobs/handlers/onProductStockChange.d.ts +0 -13
  121. package/dist/_internal/server/jobs/handlers/onProductStockChange.js +7 -134
  122. package/dist/_internal/server/jobs/handlers/onProductWrite.d.ts +1 -6
  123. package/dist/_internal/server/jobs/handlers/onProductWrite.js +6 -106
  124. package/dist/_internal/server/jobs/handlers/onReviewWrite.js +2 -49
  125. package/dist/_internal/server/jobs/handlers/onStoreWrite.d.ts +1 -8
  126. package/dist/_internal/server/jobs/handlers/onStoreWrite.js +7 -8
  127. package/dist/_internal/server/jobs/handlers/payoutBatch.d.ts +0 -9
  128. package/dist/_internal/server/jobs/handlers/payoutBatch.js +2 -104
  129. package/dist/_internal/server/jobs/handlers/pendingOrderTimeout.d.ts +0 -6
  130. package/dist/_internal/server/jobs/handlers/pendingOrderTimeout.js +2 -33
  131. package/dist/_internal/server/jobs/handlers/positionsReconcile.d.ts +0 -5
  132. package/dist/_internal/server/jobs/handlers/positionsReconcile.js +2 -87
  133. package/dist/_internal/server/jobs/handlers/prizeRevealClose.d.ts +0 -7
  134. package/dist/_internal/server/jobs/handlers/prizeRevealClose.js +2 -29
  135. package/dist/_internal/server/jobs/handlers/prizeRevealExpiry.d.ts +0 -8
  136. package/dist/_internal/server/jobs/handlers/prizeRevealExpiry.js +2 -58
  137. package/dist/_internal/server/jobs/handlers/prizeRevealOpen.d.ts +0 -8
  138. package/dist/_internal/server/jobs/handlers/prizeRevealOpen.js +2 -65
  139. package/dist/_internal/server/jobs/handlers/prizeRevealReminder.d.ts +0 -7
  140. package/dist/_internal/server/jobs/handlers/prizeRevealReminder.js +2 -45
  141. package/dist/_internal/server/jobs/handlers/productStatsSync.d.ts +0 -6
  142. package/dist/_internal/server/jobs/handlers/productStatsSync.js +2 -36
  143. package/dist/_internal/server/jobs/handlers/promotions.d.ts +2 -10
  144. package/dist/_internal/server/jobs/handlers/promotions.js +2 -43
  145. package/dist/_internal/server/jobs/handlers/storeAnalytics.d.ts +2 -28
  146. package/dist/_internal/server/jobs/handlers/storeAnalytics.js +2 -109
  147. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +1 -28
  148. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +2 -94
  149. package/dist/_internal/server/jobs/handlers/weeklyPayoutEligibility.d.ts +0 -6
  150. package/dist/_internal/server/jobs/handlers/weeklyPayoutEligibility.js +2 -87
  151. package/dist/_internal/server/jobs/index.d.ts +1 -0
  152. package/dist/_internal/server/jobs/index.js +1 -0
  153. package/dist/_internal/server/jobs/runtime/adapters/firebase.js +21 -0
  154. package/dist/_internal/shared/actions/action-registry.d.ts +84 -0
  155. package/dist/_internal/shared/actions/action-registry.js +160 -0
  156. package/dist/_internal/shared/checkout/rules/_defaults.d.ts +3 -0
  157. package/dist/_internal/shared/checkout/rules/_defaults.js +22 -0
  158. package/dist/_internal/shared/checkout/rules/_limits.d.ts +19 -0
  159. package/dist/_internal/shared/checkout/rules/_limits.js +19 -0
  160. package/dist/_internal/shared/checkout/rules/_registry.d.ts +44 -0
  161. package/dist/_internal/shared/checkout/rules/_registry.js +87 -0
  162. package/dist/_internal/shared/checkout/rules/auction.rule.d.ts +2 -0
  163. package/dist/_internal/shared/checkout/rules/auction.rule.js +10 -0
  164. package/dist/_internal/shared/checkout/rules/bundle.rule.d.ts +11 -0
  165. package/dist/_internal/shared/checkout/rules/bundle.rule.js +6 -0
  166. package/dist/_internal/shared/checkout/rules/classified.rule.d.ts +9 -0
  167. package/dist/_internal/shared/checkout/rules/classified.rule.js +9 -0
  168. package/dist/_internal/shared/checkout/rules/digital-code.rule.d.ts +8 -0
  169. package/dist/_internal/shared/checkout/rules/digital-code.rule.js +6 -0
  170. package/dist/_internal/shared/checkout/rules/index.d.ts +12 -0
  171. package/dist/_internal/shared/checkout/rules/index.js +12 -0
  172. package/dist/_internal/shared/checkout/rules/live.rule.d.ts +10 -0
  173. package/dist/_internal/shared/checkout/rules/live.rule.js +6 -0
  174. package/dist/_internal/shared/checkout/rules/offer.rule.d.ts +2 -0
  175. package/dist/_internal/shared/checkout/rules/offer.rule.js +9 -0
  176. package/dist/_internal/shared/checkout/rules/preorder.rule.d.ts +2 -0
  177. package/dist/_internal/shared/checkout/rules/preorder.rule.js +28 -0
  178. package/dist/_internal/shared/checkout/rules/prize-draw.rule.d.ts +2 -0
  179. package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +65 -0
  180. package/dist/_internal/shared/checkout/rules/standard.rule.d.ts +2 -0
  181. package/dist/_internal/shared/checkout/rules/standard.rule.js +5 -0
  182. package/dist/_internal/shared/checkout/rules/types.d.ts +125 -0
  183. package/dist/_internal/shared/checkout/rules/types.js +13 -0
  184. package/dist/_internal/shared/features/cart/schema.d.ts +6 -6
  185. package/dist/_internal/shared/features/categories/bundle-copy.d.ts +123 -0
  186. package/dist/_internal/shared/features/categories/bundle-copy.js +134 -0
  187. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +318 -0
  188. package/dist/_internal/shared/features/categories/bundle-schemas.js +55 -0
  189. package/dist/_internal/shared/features/orders/refund-copy.d.ts +36 -0
  190. package/dist/_internal/shared/features/orders/refund-copy.js +40 -0
  191. package/dist/_internal/shared/features/orders/schema.d.ts +4 -4
  192. package/dist/_internal/shared/features/products/schema.d.ts +8 -8
  193. package/dist/_internal/shared/listing-types/_registry.d.ts +27 -0
  194. package/dist/_internal/shared/listing-types/_registry.js +8 -0
  195. package/dist/_internal/shared/listing-types/action-tracker.d.ts +41 -0
  196. package/dist/_internal/shared/listing-types/action-tracker.js +70 -0
  197. package/dist/_internal/shared/listing-types/capabilities.js +25 -0
  198. package/dist/_internal/shared/listing-types/cart-shipping.d.ts +37 -0
  199. package/dist/_internal/shared/listing-types/cart-shipping.js +46 -0
  200. package/dist/_internal/shared/listing-types/classified/config.d.ts +7 -0
  201. package/dist/_internal/shared/listing-types/classified/config.js +8 -0
  202. package/dist/_internal/shared/listing-types/classified/ctas.d.ts +1 -0
  203. package/dist/_internal/shared/listing-types/classified/ctas.js +3 -0
  204. package/dist/_internal/shared/listing-types/classified/og.d.ts +1 -0
  205. package/dist/_internal/shared/listing-types/classified/og.js +1 -0
  206. package/dist/_internal/shared/listing-types/classified/schema.d.ts +1 -0
  207. package/dist/_internal/shared/listing-types/classified/schema.js +1 -0
  208. package/dist/_internal/shared/listing-types/classified/seed-factory.d.ts +1 -0
  209. package/dist/_internal/shared/listing-types/classified/seed-factory.js +1 -0
  210. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +7 -0
  211. package/dist/_internal/shared/listing-types/digital-code/config.js +8 -0
  212. package/dist/_internal/shared/listing-types/digital-code/ctas.d.ts +1 -0
  213. package/dist/_internal/shared/listing-types/digital-code/ctas.js +3 -0
  214. package/dist/_internal/shared/listing-types/digital-code/og.d.ts +1 -0
  215. package/dist/_internal/shared/listing-types/digital-code/og.js +1 -0
  216. package/dist/_internal/shared/listing-types/digital-code/schema.d.ts +1 -0
  217. package/dist/_internal/shared/listing-types/digital-code/schema.js +1 -0
  218. package/dist/_internal/shared/listing-types/digital-code/seed-factory.d.ts +1 -0
  219. package/dist/_internal/shared/listing-types/digital-code/seed-factory.js +1 -0
  220. package/dist/_internal/shared/listing-types/feature-flags.d.ts +34 -0
  221. package/dist/_internal/shared/listing-types/feature-flags.js +45 -0
  222. package/dist/_internal/shared/listing-types/live/config.d.ts +7 -0
  223. package/dist/_internal/shared/listing-types/live/config.js +8 -0
  224. package/dist/_internal/shared/listing-types/live/ctas.d.ts +1 -0
  225. package/dist/_internal/shared/listing-types/live/ctas.js +3 -0
  226. package/dist/_internal/shared/listing-types/live/og.d.ts +1 -0
  227. package/dist/_internal/shared/listing-types/live/og.js +1 -0
  228. package/dist/_internal/shared/listing-types/live/schema.d.ts +1 -0
  229. package/dist/_internal/shared/listing-types/live/schema.js +1 -0
  230. package/dist/_internal/shared/listing-types/live/seed-factory.d.ts +1 -0
  231. package/dist/_internal/shared/listing-types/live/seed-factory.js +1 -0
  232. package/dist/_internal/shared/media/limits.js +8 -0
  233. package/dist/client.d.ts +6 -1
  234. package/dist/client.js +14 -1
  235. package/dist/configs/next.js +7 -0
  236. package/dist/constants/api-endpoints.d.ts +6 -0
  237. package/dist/constants/api-endpoints.js +4 -0
  238. package/dist/core/hooks/useSyncManager.js +13 -1
  239. package/dist/core/unit-of-work.d.ts +1 -1
  240. package/dist/core/unit-of-work.js +2 -2
  241. package/dist/features/account/actions/address-actions.d.ts +1 -1
  242. package/dist/features/account/actions/address-actions.js +15 -7
  243. package/dist/features/account/schemas/firestore.d.ts +8 -43
  244. package/dist/features/account/schemas/firestore.js +8 -54
  245. package/dist/features/account/schemas/index.d.ts +6 -6
  246. package/dist/features/account/server.d.ts +1 -1
  247. package/dist/features/account/server.js +3 -1
  248. package/dist/features/addresses/index.d.ts +2 -0
  249. package/dist/features/addresses/index.js +2 -0
  250. package/dist/features/addresses/repository/addresses.repository.d.ts +29 -0
  251. package/dist/features/addresses/repository/addresses.repository.js +157 -0
  252. package/dist/features/addresses/schemas/firestore.d.ts +53 -0
  253. package/dist/features/addresses/schemas/firestore.js +68 -0
  254. package/dist/features/{bundles → addresses}/schemas/index.d.ts +0 -1
  255. package/dist/features/{bundles → addresses}/schemas/index.js +0 -1
  256. package/dist/features/addresses/server.d.ts +2 -0
  257. package/dist/features/addresses/server.js +2 -0
  258. package/dist/features/admin/components/AdminAllEventEntriesView.js +4 -3
  259. package/dist/features/admin/components/AdminBidsView.js +4 -3
  260. package/dist/features/admin/components/AdminBlogView.js +8 -3
  261. package/dist/features/admin/components/AdminBundleEditorView.d.ts +9 -0
  262. package/dist/features/admin/components/AdminBundleEditorView.js +209 -0
  263. package/dist/features/admin/components/AdminBundlesView.d.ts +9 -0
  264. package/dist/features/admin/components/AdminBundlesView.js +59 -0
  265. package/dist/features/admin/components/AdminCartsView.js +13 -3
  266. package/dist/features/admin/components/AdminContactView.js +4 -3
  267. package/dist/features/admin/components/AdminCouponsView.js +32 -13
  268. package/dist/features/admin/components/AdminNewsletterView.js +4 -3
  269. package/dist/features/admin/components/AdminOrdersView.js +15 -7
  270. package/dist/features/admin/components/AdminPayoutsView.js +4 -3
  271. package/dist/features/admin/components/AdminProductsView.js +6 -5
  272. package/dist/features/admin/components/AdminReviewsView.js +5 -4
  273. package/dist/features/admin/components/AdminStoresView.js +4 -3
  274. package/dist/features/admin/components/AdminUsersView.js +15 -5
  275. package/dist/features/admin/components/AdminWishlistsView.js +10 -1
  276. package/dist/features/admin/components/DataTable.d.ts +5 -1
  277. package/dist/features/admin/components/DataTable.js +24 -20
  278. package/dist/features/admin/components/index.d.ts +4 -0
  279. package/dist/features/admin/components/index.js +3 -0
  280. package/dist/features/admin/constants/filter-tabs.d.ts +401 -0
  281. package/dist/features/admin/constants/filter-tabs.js +200 -0
  282. package/dist/features/admin/hooks/useAdminListingData.d.ts +1 -0
  283. package/dist/features/admin/hooks/useAdminListingData.js +1 -0
  284. package/dist/features/admin/schemas/firestore.d.ts +15 -0
  285. package/dist/features/admin/schemas/firestore.js +18 -0
  286. package/dist/features/admin/types/product.types.d.ts +2 -2
  287. package/dist/features/auctions/components/AuctionCard.d.ts +4 -1
  288. package/dist/features/auctions/components/AuctionCard.js +5 -3
  289. package/dist/features/auctions/components/AuctionDetailPageView.js +1 -1
  290. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +2 -2
  291. package/dist/features/auctions/components/PlaceBidFormClient.js +12 -2
  292. package/dist/features/auctions/schemas/index.d.ts +2 -2
  293. package/dist/features/auth/index.d.ts +1 -0
  294. package/dist/features/auth/index.js +1 -0
  295. package/dist/features/auth/role-predicates.d.ts +16 -0
  296. package/dist/features/auth/role-predicates.js +15 -0
  297. package/dist/features/blog/components/BlogFeaturedCard.d.ts +4 -1
  298. package/dist/features/blog/components/BlogFeaturedCard.js +5 -3
  299. package/dist/features/cart/actions/cart-actions.d.ts +1 -0
  300. package/dist/features/cart/actions/cart-actions.js +16 -0
  301. package/dist/features/cart/components/CartView.d.ts +19 -1
  302. package/dist/features/cart/components/CartView.js +2 -2
  303. package/dist/features/cart/components/ShippingPicker.d.ts +13 -0
  304. package/dist/features/cart/components/ShippingPicker.js +48 -0
  305. package/dist/features/cart/components/index.d.ts +3 -1
  306. package/dist/features/cart/components/index.js +1 -0
  307. package/dist/features/cart/hooks/useCartCount.js +7 -1
  308. package/dist/features/cart/repository/cart.repository.d.ts +1 -0
  309. package/dist/features/cart/repository/cart.repository.js +35 -0
  310. package/dist/features/cart/schemas/firestore.d.ts +27 -2
  311. package/dist/features/categories/components/BundleAddToCartCta.d.ts +16 -0
  312. package/dist/features/categories/components/BundleAddToCartCta.js +54 -0
  313. package/dist/features/categories/components/BundleBuyNowCta.d.ts +8 -0
  314. package/dist/features/categories/components/BundleBuyNowCta.js +37 -0
  315. package/dist/features/categories/components/BundleDetailView.d.ts +22 -0
  316. package/dist/features/categories/components/BundleDetailView.js +31 -0
  317. package/dist/features/categories/components/BundleDynamicRuleEditor.d.ts +18 -0
  318. package/dist/features/categories/components/BundleDynamicRuleEditor.js +60 -0
  319. package/dist/features/categories/components/BundleItemsPicker.d.ts +26 -0
  320. package/dist/features/categories/components/BundleItemsPicker.js +135 -0
  321. package/dist/features/categories/components/BundlesListView.d.ts +13 -0
  322. package/dist/features/categories/components/BundlesListView.js +27 -0
  323. package/dist/features/categories/components/index.d.ts +12 -0
  324. package/dist/features/categories/components/index.js +9 -0
  325. package/dist/features/checkout/actions/checkout-actions.js +10 -3
  326. package/dist/features/events/components/AdminEventEditorView.js +108 -2
  327. package/dist/features/events/components/AdminEventsView.js +16 -4
  328. package/dist/features/events/components/EventCard.d.ts +4 -1
  329. package/dist/features/events/components/EventCard.js +7 -3
  330. package/dist/features/events/components/EventRaffleWinnerView.d.ts +21 -0
  331. package/dist/features/events/components/EventRaffleWinnerView.js +18 -0
  332. package/dist/features/events/components/SpinWheelView.d.ts +27 -0
  333. package/dist/features/events/components/SpinWheelView.js +64 -0
  334. package/dist/features/events/components/index.d.ts +4 -0
  335. package/dist/features/events/components/index.js +2 -0
  336. package/dist/features/events/schemas/firestore.d.ts +27 -1
  337. package/dist/features/events/schemas/firestore.js +7 -0
  338. package/dist/features/events/types/index.d.ts +27 -1
  339. package/dist/features/homepage/components/FeaturedBundlesSection.d.ts +16 -0
  340. package/dist/features/homepage/components/FeaturedBundlesSection.js +24 -0
  341. package/dist/features/homepage/components/MarketplaceHomepageView.js +4 -1
  342. package/dist/features/homepage/components/WhatsAppCommunitySection.js +2 -2
  343. package/dist/features/homepage/lib/section-renderer.d.ts +2 -0
  344. package/dist/features/homepage/lib/section-renderer.js +5 -5
  345. package/dist/features/layout/NavbarLayout.d.ts +3 -1
  346. package/dist/features/layout/NavbarLayout.js +32 -3
  347. package/dist/features/layout/TitleBarLayout.d.ts +6 -3
  348. package/dist/features/layout/TitleBarLayout.js +22 -7
  349. package/dist/features/media/upload/MediaUploadField.d.ts +15 -1
  350. package/dist/features/media/upload/MediaUploadField.js +22 -1
  351. package/dist/features/orders/components/MarketplaceOrderCard.js +4 -2
  352. package/dist/features/orders/components/OrderSiblingPayments.d.ts +8 -0
  353. package/dist/features/orders/components/OrderSiblingPayments.js +16 -0
  354. package/dist/features/orders/components/RefundHistoryTable.d.ts +6 -0
  355. package/dist/features/orders/components/RefundHistoryTable.js +23 -0
  356. package/dist/features/orders/components/RefundRequestView.d.ts +8 -0
  357. package/dist/features/orders/components/RefundRequestView.js +42 -0
  358. package/dist/features/orders/components/index.d.ts +6 -0
  359. package/dist/features/orders/components/index.js +3 -0
  360. package/dist/features/orders/index.d.ts +1 -0
  361. package/dist/features/orders/index.js +2 -0
  362. package/dist/features/orders/repository/orders.repository.d.ts +20 -1
  363. package/dist/features/orders/repository/orders.repository.js +30 -1
  364. package/dist/features/orders/schemas/firestore.d.ts +63 -13
  365. package/dist/features/orders/schemas/firestore.js +5 -5
  366. package/dist/features/orders/schemas/index.d.ts +4 -4
  367. package/dist/features/orders/types/index.d.ts +12 -2
  368. package/dist/features/orders/utils/bundle-grouping.d.ts +48 -0
  369. package/dist/features/orders/utils/bundle-grouping.js +54 -0
  370. package/dist/features/orders/utils/order-splitter.d.ts +9 -10
  371. package/dist/features/orders/utils/order-splitter.js +24 -30
  372. package/dist/features/payments/repository/payout.repository.d.ts +17 -1
  373. package/dist/features/payments/repository/payout.repository.js +47 -0
  374. package/dist/features/payments/schemas/firestore.d.ts +26 -0
  375. package/dist/features/pre-orders/components/PreorderCard.d.ts +4 -1
  376. package/dist/features/pre-orders/components/PreorderCard.js +8 -6
  377. package/dist/features/products/actions/product-actions.d.ts +1 -1
  378. package/dist/features/products/actions/product-actions.js +1 -1
  379. package/dist/features/products/components/CompareOverlay.d.ts +2 -2
  380. package/dist/features/products/components/CompareOverlay.js +4 -4
  381. package/dist/features/products/components/InteractiveProductCard.js +7 -12
  382. package/dist/features/products/components/NonRefundableConsentModal.d.ts +1 -1
  383. package/dist/features/products/components/NonRefundableConsentModal.js +0 -10
  384. package/dist/features/products/components/ProductGrid.js +28 -12
  385. package/dist/features/products/components/ShowGroupSection.js +3 -3
  386. package/dist/features/products/components/SublistingCarouselSection.js +2 -2
  387. package/dist/features/products/components/index.d.ts +0 -4
  388. package/dist/features/products/components/index.js +5 -2
  389. package/dist/features/products/index.d.ts +1 -1
  390. package/dist/features/products/index.js +3 -1
  391. package/dist/features/products/repository/products.repository.js +4 -0
  392. package/dist/features/products/schemas/catalog-product.d.ts +70 -0
  393. package/dist/features/products/schemas/catalog-product.js +50 -0
  394. package/dist/features/products/schemas/firestore.d.ts +110 -2
  395. package/dist/features/products/schemas/firestore.js +30 -0
  396. package/dist/features/products/schemas/index.d.ts +8 -8
  397. package/dist/features/products/types/index.d.ts +1 -1
  398. package/dist/features/products/utils/listing-type.d.ts +9 -0
  399. package/dist/features/products/utils/listing-type.js +4 -0
  400. package/dist/features/promotions/actions/coupon-actions.d.ts +2 -2
  401. package/dist/features/promotions/actions/coupon-actions.js +1 -1
  402. package/dist/features/promotions/components/CouponCard.d.ts +28 -10
  403. package/dist/features/promotions/components/CouponCard.js +116 -14
  404. package/dist/features/promotions/hooks/useCouponValidate.d.ts +1 -1
  405. package/dist/features/promotions/repository/coupons.repository.d.ts +1 -1
  406. package/dist/features/reviews/schemas/index.d.ts +2 -2
  407. package/dist/features/search/schemas/index.d.ts +2 -2
  408. package/dist/features/search/types/index.d.ts +2 -2
  409. package/dist/features/seller/components/SellerAuctionsView.js +4 -5
  410. package/dist/features/seller/components/SellerBidsView.js +5 -13
  411. package/dist/features/seller/components/SellerCouponsView.js +31 -67
  412. package/dist/features/seller/components/SellerOffersView.js +4 -5
  413. package/dist/features/seller/components/SellerOrdersView.js +4 -5
  414. package/dist/features/seller/components/SellerPayoutsView.js +4 -5
  415. package/dist/features/seller/components/SellerProductsView.js +4 -8
  416. package/dist/features/seller/schemas/index.d.ts +2 -2
  417. package/dist/features/stores/actions/store-address-actions.d.ts +10 -6
  418. package/dist/features/stores/actions/store-address-actions.js +8 -7
  419. package/dist/features/stores/components/InteractiveStoreCard.js +3 -10
  420. package/dist/features/stores/components/StoreDetailLayoutView.js +20 -5
  421. package/dist/features/stores/schemas/firestore.d.ts +45 -38
  422. package/dist/features/stores/schemas/firestore.js +2 -49
  423. package/dist/features/stores/server.d.ts +0 -1
  424. package/dist/features/stores/server.js +2 -1
  425. package/dist/features/wishlist/hooks/useWishlistCount.d.ts +7 -9
  426. package/dist/features/wishlist/hooks/useWishlistCount.js +67 -86
  427. package/dist/features/wishlist/types/index.d.ts +1 -1
  428. package/dist/index.d.ts +50 -9
  429. package/dist/index.js +57 -11
  430. package/dist/next/routing/route-map.d.ts +6 -0
  431. package/dist/next/routing/route-map.js +4 -0
  432. package/dist/providers/db-firebase/admin.d.ts +6 -2
  433. package/dist/providers/db-firebase/admin.js +23 -0
  434. package/dist/repositories/index.d.ts +1 -2
  435. package/dist/repositories/index.js +5 -2
  436. package/dist/security/authorization.d.ts +2 -1
  437. package/dist/security/authorization.js +3 -2
  438. package/dist/seed/actions/demo-seed-actions.d.ts +1 -1
  439. package/dist/seed/bids-seed-data.d.ts +2 -2
  440. package/dist/seed/bids-seed-data.js +77 -2
  441. package/dist/seed/cart-seed-data.d.ts +10 -10
  442. package/dist/seed/cart-seed-data.js +15 -15
  443. package/dist/seed/events-seed-data.js +77 -0
  444. package/dist/seed/manifest.js +16 -8
  445. package/dist/seed/orders-seed-data.js +41 -2
  446. package/dist/seed/payouts-seed-data.js +18 -2
  447. package/dist/seed/stores-seed-data.js +55 -0
  448. package/dist/server-entry.d.ts +1 -0
  449. package/dist/server-entry.js +2 -0
  450. package/dist/server.d.ts +4 -0
  451. package/dist/server.js +8 -0
  452. package/dist/tailwind-utilities.css +1 -1
  453. package/dist/ui/components/FilterChipGroup.d.ts +39 -0
  454. package/dist/ui/components/FilterChipGroup.js +15 -0
  455. package/dist/ui/components/HorizontalScroller.js +32 -7
  456. package/dist/ui/components/HorizontalScroller.style.css +6 -0
  457. package/dist/ui/components/SiteLogo.js +1 -1
  458. package/dist/ui/index.d.ts +2 -0
  459. package/dist/ui/index.js +2 -0
  460. package/dist/utils/id-generators.d.ts +11 -0
  461. package/dist/utils/id-generators.js +16 -0
  462. package/package.json +1 -1
  463. package/dist/_internal/shared/features/bundles/config.d.ts +0 -6
  464. package/dist/_internal/shared/features/bundles/config.js +0 -6
  465. package/dist/_internal/shared/schema-versions.d.ts +0 -76
  466. package/dist/_internal/shared/schema-versions.js +0 -82
  467. package/dist/features/account/migrations.d.ts +0 -2
  468. package/dist/features/account/migrations.js +0 -10
  469. package/dist/features/admin/migrations.d.ts +0 -2
  470. package/dist/features/admin/migrations.js +0 -10
  471. package/dist/features/auctions/migrations.d.ts +0 -2
  472. package/dist/features/auctions/migrations.js +0 -10
  473. package/dist/features/auth/migrations.d.ts +0 -2
  474. package/dist/features/auth/migrations.js +0 -10
  475. package/dist/features/blog/migrations.d.ts +0 -2
  476. package/dist/features/blog/migrations.js +0 -10
  477. package/dist/features/brands/actions/brand-actions.d.ts +0 -2
  478. package/dist/features/brands/actions/brand-actions.js +0 -5
  479. package/dist/features/brands/index.d.ts +0 -3
  480. package/dist/features/brands/index.js +0 -3
  481. package/dist/features/brands/migrations.d.ts +0 -2
  482. package/dist/features/brands/migrations.js +0 -10
  483. package/dist/features/brands/repository/brands.repository.d.ts +0 -13
  484. package/dist/features/brands/repository/brands.repository.js +0 -60
  485. package/dist/features/brands/schemas/index.d.ts +0 -33
  486. package/dist/features/brands/schemas/index.js +0 -15
  487. package/dist/features/brands/server.d.ts +0 -7
  488. package/dist/features/brands/server.js +0 -7
  489. package/dist/features/bundles/components/AdminBundleEditorView.d.ts +0 -8
  490. package/dist/features/bundles/components/AdminBundleEditorView.js +0 -7
  491. package/dist/features/bundles/components/BundleDetailPageView.d.ts +0 -9
  492. package/dist/features/bundles/components/BundleDetailPageView.js +0 -45
  493. package/dist/features/bundles/components/BundleForm.d.ts +0 -12
  494. package/dist/features/bundles/components/BundleForm.js +0 -126
  495. package/dist/features/bundles/components/BundleItemsPicker.d.ts +0 -9
  496. package/dist/features/bundles/components/BundleItemsPicker.js +0 -77
  497. package/dist/features/bundles/components/BundlesByCategoryListing.d.ts +0 -6
  498. package/dist/features/bundles/components/BundlesByCategoryListing.js +0 -50
  499. package/dist/features/bundles/components/BundlesListingView.d.ts +0 -17
  500. package/dist/features/bundles/components/BundlesListingView.js +0 -50
  501. package/dist/features/bundles/components/FeaturedBundlesSection.d.ts +0 -5
  502. package/dist/features/bundles/components/FeaturedBundlesSection.js +0 -55
  503. package/dist/features/bundles/components/SellerBundleCreateView.d.ts +0 -8
  504. package/dist/features/bundles/components/SellerBundleCreateView.js +0 -7
  505. package/dist/features/bundles/components/SellerBundleEditView.d.ts +0 -9
  506. package/dist/features/bundles/components/SellerBundleEditView.js +0 -7
  507. package/dist/features/bundles/components/index.d.ts +0 -18
  508. package/dist/features/bundles/components/index.js +0 -9
  509. package/dist/features/bundles/constants/index.d.ts +0 -32
  510. package/dist/features/bundles/constants/index.js +0 -35
  511. package/dist/features/bundles/index.d.ts +0 -2
  512. package/dist/features/bundles/index.js +0 -2
  513. package/dist/features/bundles/migrations.d.ts +0 -2
  514. package/dist/features/bundles/migrations.js +0 -10
  515. package/dist/features/bundles/repository/bundles.repository.d.ts +0 -36
  516. package/dist/features/bundles/repository/bundles.repository.js +0 -148
  517. package/dist/features/bundles/repository/index.d.ts +0 -1
  518. package/dist/features/bundles/repository/index.js +0 -1
  519. package/dist/features/bundles/schemas/firestore.d.ts +0 -88
  520. package/dist/features/bundles/schemas/firestore.js +0 -29
  521. package/dist/features/bundles/schemas/zod.d.ts +0 -377
  522. package/dist/features/bundles/schemas/zod.js +0 -71
  523. package/dist/features/cart/migrations.d.ts +0 -2
  524. package/dist/features/cart/migrations.js +0 -10
  525. package/dist/features/categories/migrations.d.ts +0 -2
  526. package/dist/features/categories/migrations.js +0 -10
  527. package/dist/features/events/migrations.d.ts +0 -2
  528. package/dist/features/events/migrations.js +0 -10
  529. package/dist/features/faq/migrations.d.ts +0 -2
  530. package/dist/features/faq/migrations.js +0 -10
  531. package/dist/features/grouped/migrations.d.ts +0 -2
  532. package/dist/features/grouped/migrations.js +0 -10
  533. package/dist/features/history/migrations.d.ts +0 -2
  534. package/dist/features/history/migrations.js +0 -10
  535. package/dist/features/messages/migrations.d.ts +0 -2
  536. package/dist/features/messages/migrations.js +0 -10
  537. package/dist/features/orders/migrations.d.ts +0 -2
  538. package/dist/features/orders/migrations.js +0 -10
  539. package/dist/features/payments/migrations.d.ts +0 -2
  540. package/dist/features/payments/migrations.js +0 -10
  541. package/dist/features/products/migrations.d.ts +0 -2
  542. package/dist/features/products/migrations.js +0 -10
  543. package/dist/features/products/repository/sublisting-categories.repository.d.ts +0 -16
  544. package/dist/features/products/repository/sublisting-categories.repository.js +0 -126
  545. package/dist/features/products/schemas/sublisting-categories.d.ts +0 -45
  546. package/dist/features/products/schemas/sublisting-categories.js +0 -16
  547. package/dist/features/promotions/migrations.d.ts +0 -2
  548. package/dist/features/promotions/migrations.js +0 -10
  549. package/dist/features/reviews/migrations.d.ts +0 -2
  550. package/dist/features/reviews/migrations.js +0 -10
  551. package/dist/features/scams/migrations.d.ts +0 -2
  552. package/dist/features/scams/migrations.js +0 -10
  553. package/dist/features/seller/migrations.d.ts +0 -2
  554. package/dist/features/seller/migrations.js +0 -10
  555. package/dist/features/stores/migrations.d.ts +0 -2
  556. package/dist/features/stores/migrations.js +0 -10
  557. package/dist/features/sublisting/migrations.d.ts +0 -2
  558. package/dist/features/sublisting/migrations.js +0 -10
  559. package/dist/features/sublisting/schemas/firestore.d.ts +0 -32
  560. package/dist/features/sublisting/schemas/firestore.js +0 -19
  561. package/dist/features/support/migrations.d.ts +0 -2
  562. package/dist/features/support/migrations.js +0 -10
  563. package/dist/features/wishlist/migrations.d.ts +0 -2
  564. package/dist/features/wishlist/migrations.js +0 -10
  565. package/dist/seed/_bundle-constants.d.ts +0 -14
  566. package/dist/seed/_bundle-constants.js +0 -14
  567. package/dist/seed/anime-figures-seed-data.d.ts +0 -8
  568. package/dist/seed/anime-figures-seed-data.js +0 -1033
  569. package/dist/seed/beyblade-seed-data.d.ts +0 -7
  570. package/dist/seed/beyblade-seed-data.js +0 -1129
  571. package/dist/seed/brands-seed-data.d.ts +0 -7
  572. package/dist/seed/brands-seed-data.js +0 -410
  573. package/dist/seed/bundles-seed-data.d.ts +0 -13
  574. package/dist/seed/bundles-seed-data.js +0 -229
  575. package/dist/seed/cosplay-accessories-seed-data.d.ts +0 -8
  576. package/dist/seed/cosplay-accessories-seed-data.js +0 -647
  577. package/dist/seed/hot-wheels-seed-data.d.ts +0 -7
  578. package/dist/seed/hot-wheels-seed-data.js +0 -1612
  579. package/dist/seed/letitrip-official-seed-data.d.ts +0 -8
  580. package/dist/seed/letitrip-official-seed-data.js +0 -399
  581. package/dist/seed/pokemon-carousel-slides-seed-data.d.ts +0 -8
  582. package/dist/seed/pokemon-carousel-slides-seed-data.js +0 -322
  583. package/dist/seed/pokemon-categories-seed-data.d.ts +0 -24
  584. package/dist/seed/pokemon-categories-seed-data.js +0 -547
  585. package/dist/seed/pokemon-coupons-seed-data.d.ts +0 -6
  586. package/dist/seed/pokemon-coupons-seed-data.js +0 -465
  587. package/dist/seed/pokemon-homepage-sections-seed-data.d.ts +0 -7
  588. package/dist/seed/pokemon-homepage-sections-seed-data.js +0 -241
  589. package/dist/seed/pokemon-products-seed-data.d.ts +0 -9
  590. package/dist/seed/pokemon-products-seed-data.js +0 -1791
  591. package/dist/seed/pokemon-seed-bundle.d.ts +0 -47
  592. package/dist/seed/pokemon-seed-bundle.js +0 -71
  593. package/dist/seed/pokemon-stores-seed-data.d.ts +0 -6
  594. package/dist/seed/pokemon-stores-seed-data.js +0 -179
  595. package/dist/seed/pokemon-users-seed-data.d.ts +0 -6
  596. package/dist/seed/pokemon-users-seed-data.js +0 -521
  597. package/dist/seed/products-seed-data.d.ts +0 -6
  598. package/dist/seed/products-seed-data.js +0 -2530
  599. package/dist/seed/retro-gaming-seed-data.d.ts +0 -8
  600. package/dist/seed/retro-gaming-seed-data.js +0 -801
  601. package/dist/seed/server.d.ts +0 -2
  602. package/dist/seed/server.js +0 -7
  603. package/dist/seed/sublisting-categories-seed-data.d.ts +0 -7
  604. package/dist/seed/sublisting-categories-seed-data.js +0 -159
  605. package/dist/seed/transformers-seed-data.d.ts +0 -7
  606. package/dist/seed/transformers-seed-data.js +0 -530
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Core: rebuild `position` + `subtreeSize` for every category via
3
+ * DFS pre-order from the roots. Heals drift left by the trigger's
4
+ * `positionDirty` flag and any failed real-time updates.
5
+ */
6
+ import { BATCH_LIMIT } from "../handlers/messages";
7
+ const CATEGORIES = "categories";
8
+ function dfsAssign(nodeId, childMap, counter, result) {
9
+ const position = counter;
10
+ counter++;
11
+ const children = (childMap.get(nodeId) ?? []).sort((a, b) => a.order - b.order);
12
+ for (const child of children) {
13
+ counter = dfsAssign(child.id, childMap, counter, result);
14
+ }
15
+ const subtreeSize = counter - position;
16
+ result.set(nodeId, { position, subtreeSize });
17
+ return counter;
18
+ }
19
+ export async function runPositionsReconcile(ctx) {
20
+ const snap = await ctx.db.collection(CATEGORIES).get();
21
+ const nodes = snap.docs.map((doc) => {
22
+ const d = doc.data();
23
+ const parentIds = d.parentIds ?? [];
24
+ return {
25
+ id: doc.id,
26
+ parentId: parentIds.length > 0 ? parentIds[parentIds.length - 1] : null,
27
+ order: d.order ?? 0,
28
+ position: d.position ?? 0,
29
+ subtreeSize: d.subtreeSize ?? 1,
30
+ positionDirty: d.positionDirty ?? false,
31
+ };
32
+ });
33
+ if (nodes.length === 0) {
34
+ ctx.logger.info("No categories — nothing to reconcile");
35
+ return;
36
+ }
37
+ const childMap = new Map();
38
+ const roots = [];
39
+ for (const node of nodes) {
40
+ if (node.parentId === null) {
41
+ roots.push(node);
42
+ }
43
+ else {
44
+ const siblings = childMap.get(node.parentId) ?? [];
45
+ siblings.push(node);
46
+ childMap.set(node.parentId, siblings);
47
+ }
48
+ }
49
+ const computed = new Map();
50
+ let counter = 1;
51
+ for (const root of roots.sort((a, b) => a.order - b.order)) {
52
+ counter = dfsAssign(root.id, childMap, counter, computed);
53
+ }
54
+ const orphans = nodes.filter((n) => !computed.has(n.id));
55
+ for (const orphan of orphans) {
56
+ counter = dfsAssign(orphan.id, childMap, counter, computed);
57
+ }
58
+ const nodeMap = new Map(nodes.map((n) => [n.id, n]));
59
+ const toUpdate = [];
60
+ for (const [id, { position, subtreeSize }] of computed) {
61
+ const current = nodeMap.get(id);
62
+ if (!current || current.position !== position || current.subtreeSize !== subtreeSize || current.positionDirty) {
63
+ toUpdate.push({ id, position, subtreeSize });
64
+ }
65
+ }
66
+ if (toUpdate.length === 0) {
67
+ ctx.logger.info("Positions already correct", { scanned: nodes.length });
68
+ return;
69
+ }
70
+ for (let i = 0; i < toUpdate.length; i += BATCH_LIMIT) {
71
+ const batch = ctx.db.batch();
72
+ for (const { id, position, subtreeSize } of toUpdate.slice(i, i + BATCH_LIMIT)) {
73
+ batch.update(ctx.db.collection(CATEGORIES).doc(id), {
74
+ position,
75
+ subtreeSize,
76
+ positionDirty: false,
77
+ updatedAt: new Date(),
78
+ });
79
+ }
80
+ await batch.commit();
81
+ }
82
+ ctx.logger.info("Positions reconciled", {
83
+ scanned: nodes.length,
84
+ updated: toUpdate.length,
85
+ orphans: orphans.length,
86
+ });
87
+ }
@@ -0,0 +1,2 @@
1
+ import type { JobContext } from "../runtime/types";
2
+ export declare function runPrizeRevealClose(ctx: JobContext): Promise<void>;
@@ -0,0 +1,22 @@
1
+ const PRODUCT_COLLECTION = "products";
2
+ export async function runPrizeRevealClose(ctx) {
3
+ ctx.logger.info("Prize reveal close sweep starting");
4
+ const snap = await ctx.db
5
+ .collection(PRODUCT_COLLECTION)
6
+ .where("listingType", "==", "prize-draw")
7
+ .where("prizeRevealStatus", "==", "open")
8
+ .where("prizeRevealWindowEnd", "<=", ctx.now)
9
+ .limit(100)
10
+ .get();
11
+ if (snap.empty) {
12
+ ctx.logger.info("No prize draws to close");
13
+ return;
14
+ }
15
+ const batch = ctx.db.batch();
16
+ snap.docs.forEach((doc) => batch.update(doc.ref, {
17
+ prizeRevealStatus: "closed",
18
+ updatedAt: ctx.now,
19
+ }));
20
+ await batch.commit();
21
+ ctx.logger.info("Closed prize draws", { count: snap.size });
22
+ }
@@ -0,0 +1,2 @@
1
+ import type { JobContext } from "../runtime/types";
2
+ export declare function runPrizeRevealExpiry(ctx: JobContext): Promise<void>;
@@ -0,0 +1,50 @@
1
+ import { notificationRepository } from "../../../../repositories";
2
+ const ORDER_COLLECTION = "orders";
3
+ export async function runPrizeRevealExpiry(ctx) {
4
+ ctx.logger.info("Prize reveal expiry sweep starting");
5
+ const snap = await ctx.db
6
+ .collection(ORDER_COLLECTION)
7
+ .where("paymentStatus", "==", "paid")
8
+ .where("status", "in", ["pending", "confirmed", "processing"])
9
+ .where("prizeRevealDeadline", "<", ctx.now)
10
+ .limit(200)
11
+ .get();
12
+ if (snap.empty) {
13
+ ctx.logger.info("No prize-draw orders past deadline");
14
+ return;
15
+ }
16
+ let refunded = 0;
17
+ for (const doc of snap.docs) {
18
+ const order = doc.data();
19
+ if (order.prizeWon)
20
+ continue;
21
+ if (!order.prizeDrawProductId)
22
+ continue;
23
+ await doc.ref.update({
24
+ status: "refunded",
25
+ paymentStatus: "refunded",
26
+ isNonRefundable: false,
27
+ prizeRevealExpired: true,
28
+ updatedAt: ctx.now,
29
+ });
30
+ if (order.userId) {
31
+ try {
32
+ await notificationRepository.create({
33
+ userId: order.userId,
34
+ type: "prize_reveal_expired",
35
+ priority: "high",
36
+ title: "Reveal deadline passed — refunded",
37
+ message: `Your entry for "${order.productTitle ?? "the draw"}" expired without a reveal. We've refunded the order.`,
38
+ relatedId: doc.id,
39
+ relatedType: "order",
40
+ actionUrl: `/user/orders/view/${doc.id}`,
41
+ });
42
+ }
43
+ catch (err) {
44
+ ctx.logger.warn("Reveal-expired notification failed", { err });
45
+ }
46
+ }
47
+ refunded++;
48
+ }
49
+ ctx.logger.info("Prize reveal expiry sweep complete", { refunded });
50
+ }
@@ -0,0 +1,2 @@
1
+ import type { JobContext } from "../runtime/types";
2
+ export declare function runPrizeRevealOpen(ctx: JobContext): Promise<void>;
@@ -0,0 +1,56 @@
1
+ import { notificationRepository } from "../../../../repositories";
2
+ const PRODUCT_COLLECTION = "products";
3
+ const ORDER_COLLECTION = "orders";
4
+ export async function runPrizeRevealOpen(ctx) {
5
+ ctx.logger.info("Prize reveal open sweep starting");
6
+ const snap = await ctx.db
7
+ .collection(PRODUCT_COLLECTION)
8
+ .where("listingType", "==", "prize-draw")
9
+ .where("prizeRevealStatus", "==", "pending")
10
+ .where("prizeRevealWindowStart", "<=", ctx.now)
11
+ .limit(100)
12
+ .get();
13
+ if (snap.empty) {
14
+ ctx.logger.info("No prize draws to open");
15
+ return;
16
+ }
17
+ for (const doc of snap.docs) {
18
+ const product = doc.data();
19
+ await doc.ref.update({
20
+ prizeRevealStatus: "open",
21
+ updatedAt: ctx.now,
22
+ });
23
+ const orders = await ctx.db
24
+ .collection(ORDER_COLLECTION)
25
+ .where("prizeDrawProductId", "==", doc.id)
26
+ .where("paymentStatus", "==", "paid")
27
+ .where("status", "in", ["pending", "confirmed", "processing"])
28
+ .get();
29
+ let notified = 0;
30
+ for (const orderDoc of orders.docs) {
31
+ const order = orderDoc.data();
32
+ if (!order.userId || order.prizeWon)
33
+ continue;
34
+ try {
35
+ await notificationRepository.create({
36
+ userId: order.userId,
37
+ type: "prize_reveal_ready",
38
+ priority: "high",
39
+ title: "Your reveal is ready!",
40
+ message: `Reveal your prize for "${product.title ?? "draw"}". You have ${product.prizeRevealDeadlineDays ?? 3} days to claim it.`,
41
+ relatedId: orderDoc.id,
42
+ relatedType: "order",
43
+ actionUrl: `/user/orders/view/${orderDoc.id}`,
44
+ });
45
+ notified++;
46
+ }
47
+ catch (err) {
48
+ ctx.logger.warn("Reveal-ready notification failed", { err });
49
+ }
50
+ }
51
+ ctx.logger.info("Opened prize draw", {
52
+ productId: doc.id,
53
+ buyersNotified: notified,
54
+ });
55
+ }
56
+ }
@@ -0,0 +1,2 @@
1
+ import type { JobContext } from "../runtime/types";
2
+ export declare function runPrizeRevealReminder(ctx: JobContext): Promise<void>;
@@ -0,0 +1,38 @@
1
+ import { notificationRepository } from "../../../../repositories";
2
+ const ORDER_COLLECTION = "orders";
3
+ const ONE_DAY_MS = 86400000;
4
+ export async function runPrizeRevealReminder(ctx) {
5
+ ctx.logger.info("Prize reveal reminder sweep starting");
6
+ const cutoff = new Date(ctx.now.getTime() + ONE_DAY_MS);
7
+ const snap = await ctx.db
8
+ .collection(ORDER_COLLECTION)
9
+ .where("paymentStatus", "==", "paid")
10
+ .where("status", "in", ["pending", "confirmed", "processing"])
11
+ .where("prizeRevealDeadline", "<=", cutoff)
12
+ .where("prizeRevealDeadline", ">", ctx.now)
13
+ .limit(500)
14
+ .get();
15
+ let notified = 0;
16
+ for (const doc of snap.docs) {
17
+ const order = doc.data();
18
+ if (!order.userId || order.prizeWon || !order.prizeDrawProductId)
19
+ continue;
20
+ try {
21
+ await notificationRepository.create({
22
+ userId: order.userId,
23
+ type: "prize_reveal_reminder",
24
+ priority: "normal",
25
+ title: "Reveal expires within 24h",
26
+ message: `Reveal your prize for "${order.productTitle ?? "the draw"}" today — unclaimed reveals are auto-refunded after the deadline.`,
27
+ relatedId: doc.id,
28
+ relatedType: "order",
29
+ actionUrl: `/user/orders/view/${doc.id}`,
30
+ });
31
+ notified++;
32
+ }
33
+ catch (err) {
34
+ ctx.logger.warn("Reveal reminder notification failed", { err });
35
+ }
36
+ }
37
+ ctx.logger.info("Prize reveal reminder sweep complete", { notified });
38
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Core: recompute avgRating + reviewCount on every published product
3
+ * from approved reviews. Heals drift from partial writes / moderation changes.
4
+ *
5
+ * Concurrency capped at 5 to avoid Firestore read-rate spikes.
6
+ */
7
+ import type { JobContext } from "../runtime/types";
8
+ export declare function runProductStatsSync(ctx: JobContext): Promise<void>;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Core: recompute avgRating + reviewCount on every published product
3
+ * from approved reviews. Heals drift from partial writes / moderation changes.
4
+ *
5
+ * Concurrency capped at 5 to avoid Firestore read-rate spikes.
6
+ */
7
+ import { productRepository, reviewRepository } from "../../../../repositories";
8
+ const CONCURRENCY = 5;
9
+ async function syncOne(productId) {
10
+ const { count, avgRating } = await reviewRepository.getApprovedRatingAggregate(productId);
11
+ await productRepository.update(productId, { avgRating, reviewCount: count });
12
+ }
13
+ export async function runProductStatsSync(ctx) {
14
+ ctx.logger.info("Starting product stats sync");
15
+ const productIds = await productRepository.getPublishedIds();
16
+ if (productIds.length === 0) {
17
+ ctx.logger.info("No published products found");
18
+ return;
19
+ }
20
+ ctx.logger.info(`Syncing stats for ${productIds.length} product(s)`);
21
+ let succeeded = 0;
22
+ let failed = 0;
23
+ for (let i = 0; i < productIds.length; i += CONCURRENCY) {
24
+ const slice = productIds.slice(i, i + CONCURRENCY);
25
+ const results = await Promise.allSettled(slice.map(syncOne));
26
+ for (const r of results) {
27
+ if (r.status === "fulfilled")
28
+ succeeded++;
29
+ else {
30
+ failed++;
31
+ ctx.logger.error("Failed to sync product stats", r.reason);
32
+ }
33
+ }
34
+ }
35
+ ctx.logger.info("Product stats sync complete", { succeeded, failed });
36
+ }
@@ -0,0 +1,12 @@
1
+ import type { JobContext } from "../runtime/types";
2
+ export interface PromotionsCallableResult {
3
+ promotedProducts: unknown[];
4
+ featuredProducts: unknown[];
5
+ activeCoupons: unknown[];
6
+ }
7
+ /**
8
+ * Promotions data — promoted + featured products and active coupons.
9
+ * Wraps the listing query that needs an OR-shaped
10
+ * (coupon.startDate IS NULL OR <= now) filter Firestore can't express.
11
+ */
12
+ export declare function runPromotions(_input: void, ctx: JobContext): Promise<PromotionsCallableResult>;
@@ -0,0 +1,43 @@
1
+ import { productRepository, couponsRepository } from "../../../../repositories";
2
+ import { ProductStatusValues } from "../../../../features/products/schemas/firestore";
3
+ /**
4
+ * Promotions data — promoted + featured products and active coupons.
5
+ * Wraps the listing query that needs an OR-shaped
6
+ * (coupon.startDate IS NULL OR <= now) filter Firestore can't express.
7
+ */
8
+ export async function runPromotions(_input, ctx) {
9
+ ctx.logger.info("Promotions data requested");
10
+ const now = new Date();
11
+ const nowIso = now.toISOString();
12
+ const [promotedResult, featuredResult, activeCouponsResult] = await Promise.all([
13
+ productRepository.list({
14
+ filters: `status==${ProductStatusValues.PUBLISHED},isPromoted==true`,
15
+ sorts: "-createdAt",
16
+ page: "1",
17
+ pageSize: "12",
18
+ }, { status: ProductStatusValues.PUBLISHED }),
19
+ productRepository.list({
20
+ filters: `status==${ProductStatusValues.PUBLISHED},featured==true`,
21
+ sorts: "-createdAt",
22
+ page: "1",
23
+ pageSize: "8",
24
+ }, { status: ProductStatusValues.PUBLISHED }),
25
+ couponsRepository.list({
26
+ filters: `validity.isActive==true,validity.endDate>=${nowIso}`,
27
+ sorts: "validity.endDate",
28
+ page: "1",
29
+ pageSize: "50",
30
+ }),
31
+ ]);
32
+ const activeCoupons = activeCouponsResult.items.filter((c) => !c.validity?.startDate || new Date(c.validity.startDate) <= now);
33
+ ctx.logger.info("Promotions loaded", {
34
+ promoted: promotedResult.items.length,
35
+ featured: featuredResult.items.length,
36
+ coupons: activeCoupons.length,
37
+ });
38
+ return {
39
+ promotedProducts: promotedResult.items,
40
+ featuredProducts: featuredResult.items,
41
+ activeCoupons,
42
+ };
43
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Core: aggregate seller (store) analytics for the past 6 months. Input:
3
+ * `{ sellerId }` (the Firebase Auth UID); store slug is resolved server-side
4
+ * via `storeRepository.findByOwnerId`.
5
+ */
6
+ import type { JobContext } from "../runtime/types";
7
+ export interface StoreAnalyticsInput {
8
+ sellerId: string;
9
+ }
10
+ export interface StoreAnalyticsResult {
11
+ summary: {
12
+ totalOrders: number;
13
+ totalRevenue: number;
14
+ totalProducts: number;
15
+ publishedProducts: number;
16
+ };
17
+ revenueByMonth: Array<{
18
+ month: string;
19
+ orders: number;
20
+ revenue: number;
21
+ }>;
22
+ topProducts: Array<{
23
+ productId: string;
24
+ title: string;
25
+ revenue: number;
26
+ orders: number;
27
+ mainImage: string;
28
+ }>;
29
+ }
30
+ export declare function runStoreAnalytics(input: StoreAnalyticsInput, ctx: JobContext): Promise<StoreAnalyticsResult>;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Core: aggregate seller (store) analytics for the past 6 months. Input:
3
+ * `{ sellerId }` (the Firebase Auth UID); store slug is resolved server-side
4
+ * via `storeRepository.findByOwnerId`.
5
+ */
6
+ import { orderRepository, productRepository, storeRepository, } from "../../../../repositories";
7
+ import { formatMonthYear } from "../../../../utils/date.formatter";
8
+ import { ProductStatusValues } from "../../../../features/products/schemas/firestore";
9
+ class StoreAnalyticsError extends Error {
10
+ constructor(status, message) {
11
+ super(message);
12
+ this.name = "StoreAnalyticsError";
13
+ this.httpStatus = status;
14
+ }
15
+ }
16
+ function normalizeDate(raw) {
17
+ return raw instanceof Date ? raw : new Date(raw);
18
+ }
19
+ async function loadStore6MonthOrders(storeId) {
20
+ const now = new Date();
21
+ const isoStart = new Date(now.getFullYear(), now.getMonth() - 5, 1).toISOString();
22
+ const out = [];
23
+ let page = 1;
24
+ let hasMore = true;
25
+ while (hasMore && page <= 5) {
26
+ const result = await orderRepository.listAll({
27
+ filters: `storeId==${storeId},createdAt>=${isoStart}`,
28
+ sorts: "-createdAt",
29
+ page: String(page),
30
+ pageSize: "300",
31
+ });
32
+ out.push(...result.items);
33
+ hasMore = result.hasMore;
34
+ page += 1;
35
+ }
36
+ return out;
37
+ }
38
+ export async function runStoreAnalytics(input, ctx) {
39
+ const sellerId = input?.sellerId;
40
+ if (!sellerId || typeof sellerId !== "string") {
41
+ throw new StoreAnalyticsError(400, "sellerId is required");
42
+ }
43
+ ctx.logger.info("Store analytics requested", { sellerId });
44
+ const store = await storeRepository.findByOwnerId(sellerId);
45
+ if (!store)
46
+ throw new StoreAnalyticsError(404, "Store not found for this seller");
47
+ const storeId = store.id;
48
+ const [past6, totalProductsResult, publishedProductsResult] = await Promise.all([
49
+ loadStore6MonthOrders(storeId),
50
+ productRepository.list({ page: "1", pageSize: "1" }, { storeId }),
51
+ productRepository.list({
52
+ filters: `status==${ProductStatusValues.PUBLISHED}`,
53
+ page: "1",
54
+ pageSize: "1",
55
+ }, { storeId, status: ProductStatusValues.PUBLISHED }),
56
+ ]);
57
+ const productIds = Array.from(new Set(past6.map((o) => o.productId)));
58
+ const products = await Promise.all(productIds.map((id) => productRepository.findById(id)));
59
+ const productMap = new Map(products.filter(Boolean).map((p) => [p.id, p]));
60
+ const totalOrders = past6.length;
61
+ const totalRevenue = past6.reduce((sum, o) => sum + (o.totalPrice ?? 0), 0);
62
+ const now = new Date();
63
+ const monthMap = new Map();
64
+ for (let i = 5; i >= 0; i--) {
65
+ const d = new Date(now.getFullYear(), now.getMonth() - i, 1);
66
+ const key = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}`;
67
+ monthMap.set(key, { month: formatMonthYear(d), orders: 0, revenue: 0 });
68
+ }
69
+ for (const order of past6) {
70
+ const d = normalizeDate(order.createdAt);
71
+ const key = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}`;
72
+ const entry = monthMap.get(key);
73
+ if (entry) {
74
+ entry.orders += 1;
75
+ entry.revenue += order.totalPrice ?? 0;
76
+ }
77
+ }
78
+ const revenueByProduct = new Map();
79
+ for (const order of past6) {
80
+ const existing = revenueByProduct.get(order.productId);
81
+ if (existing) {
82
+ existing.revenue += order.totalPrice ?? 0;
83
+ existing.orders += 1;
84
+ }
85
+ else {
86
+ const product = productMap.get(order.productId);
87
+ revenueByProduct.set(order.productId, {
88
+ productId: order.productId,
89
+ title: order.productTitle,
90
+ revenue: order.totalPrice ?? 0,
91
+ orders: 1,
92
+ mainImage: product?.mainImage ?? "",
93
+ });
94
+ }
95
+ }
96
+ const topProducts = Array.from(revenueByProduct.values())
97
+ .sort((a, b) => b.revenue - a.revenue)
98
+ .slice(0, 5);
99
+ return {
100
+ summary: {
101
+ totalOrders,
102
+ totalRevenue,
103
+ totalProducts: totalProductsResult.total,
104
+ publishedProducts: publishedProductsResult.total,
105
+ },
106
+ revenueByMonth: Array.from(monthMap.values()),
107
+ topProducts,
108
+ };
109
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Core: select a raffle winner for an event using `crypto.randomInt()`. Pool
3
+ * logic keys off the event's `raffleType`.
4
+ */
5
+ import type { JobContext } from "../runtime/types";
6
+ export interface TriggerEventRaffleInput {
7
+ eventId: string;
8
+ raffleType?: "top_n_scorers" | "top_n_participants" | "open_raffle";
9
+ topN?: number;
10
+ }
11
+ export interface TriggerEventRaffleResult {
12
+ eventId: string;
13
+ raffleWinnerUserId?: string;
14
+ raffleWinnerDisplayName?: string;
15
+ raffleEntryCount: number;
16
+ alreadyTriggered?: boolean;
17
+ reason?: string;
18
+ }
19
+ export declare function runTriggerEventRaffle(input: TriggerEventRaffleInput, ctx: JobContext): Promise<TriggerEventRaffleResult>;
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Core: select a raffle winner for an event using `crypto.randomInt()`. Pool
3
+ * logic keys off the event's `raffleType`.
4
+ */
5
+ import crypto from "node:crypto";
6
+ const EVENTS_COLLECTION = "events";
7
+ const EVENT_ENTRIES_COLLECTION = "eventEntries";
8
+ export async function runTriggerEventRaffle(input, ctx) {
9
+ const eventRef = ctx.db.collection(EVENTS_COLLECTION).doc(input.eventId);
10
+ const eventSnap = await eventRef.get();
11
+ if (!eventSnap.exists) {
12
+ return {
13
+ eventId: input.eventId,
14
+ raffleEntryCount: 0,
15
+ reason: "event_not_found",
16
+ };
17
+ }
18
+ const event = eventSnap.data();
19
+ if (event.raffleWinnerUserId) {
20
+ return {
21
+ eventId: input.eventId,
22
+ raffleEntryCount: 0,
23
+ alreadyTriggered: true,
24
+ raffleWinnerUserId: event.raffleWinnerUserId,
25
+ };
26
+ }
27
+ const raffleType = input.raffleType ?? event.raffleType ?? "open_raffle";
28
+ const topN = input.topN ?? event.raffleTopN ?? 0;
29
+ const entriesSnap = await ctx.db
30
+ .collection(EVENT_ENTRIES_COLLECTION)
31
+ .where("eventId", "==", input.eventId)
32
+ .where("status", "==", "CONFIRMED")
33
+ .get();
34
+ let pool = entriesSnap.docs.map((d) => ({
35
+ id: d.id,
36
+ data: d.data(),
37
+ }));
38
+ if (raffleType === "top_n_scorers" && topN > 0) {
39
+ pool = pool
40
+ .sort((a, b) => (b.data.points ?? 0) - (a.data.points ?? 0))
41
+ .slice(0, topN);
42
+ }
43
+ else if (raffleType === "top_n_participants" && topN > 0) {
44
+ pool = pool
45
+ .sort((a, b) => {
46
+ const aT = a.data.createdAt instanceof Date
47
+ ? a.data.createdAt.getTime()
48
+ : (a.data.createdAt?.toDate?.()?.getTime() ?? 0);
49
+ const bT = b.data.createdAt instanceof Date
50
+ ? b.data.createdAt.getTime()
51
+ : (b.data.createdAt?.toDate?.()?.getTime() ?? 0);
52
+ return aT - bT;
53
+ })
54
+ .slice(0, topN);
55
+ }
56
+ if (pool.length === 0) {
57
+ return {
58
+ eventId: input.eventId,
59
+ raffleEntryCount: 0,
60
+ reason: "no_eligible_entries",
61
+ };
62
+ }
63
+ const winnerIdx = crypto.randomInt(0, pool.length);
64
+ const winner = pool[winnerIdx];
65
+ await eventRef.update({
66
+ raffleWinnerUserId: winner.data.userId,
67
+ raffleWinnerDisplayName: winner.data.userDisplayName ?? "",
68
+ raffleWinnerEntryId: winner.id,
69
+ raffleTriggeredAt: ctx.now,
70
+ raffleEntryCount: entriesSnap.size,
71
+ raffleGithubFunctionUrl: `${ctx.env("PROOF_OF_FAIRNESS_BASE_URL") ?? ""}/raffles/${input.eventId}.json`,
72
+ updatedAt: ctx.now,
73
+ });
74
+ ctx.logger.info("Event raffle triggered", {
75
+ eventId: input.eventId,
76
+ raffleType,
77
+ poolSize: pool.length,
78
+ winnerId: winner.id,
79
+ });
80
+ return {
81
+ eventId: input.eventId,
82
+ raffleWinnerUserId: winner.data.userId,
83
+ raffleWinnerDisplayName: winner.data.userDisplayName,
84
+ raffleEntryCount: entriesSnap.size,
85
+ };
86
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Core: weekly Saturday sweep — converts delivered Shiprocket orders
3
+ * with `payoutStatus=eligible` into pending payout documents grouped by seller.
4
+ */
5
+ import type { JobContext } from "../runtime/types";
6
+ export declare function runWeeklyPayoutEligibility(ctx: JobContext): Promise<void>;