@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
@@ -1,9 +1,2 @@
1
- /**
2
- * scheduledPrizeRevealReminder — daily 10am IST (SB8-E).
3
- *
4
- * Notifies users whose prize-draw reveals expire in the next 24 hours and
5
- * haven't been claimed yet. Triggered once a day so users get exactly one
6
- * nudge before the auto-refund kicks in.
7
- */
8
1
  import type { ScheduleHandler } from "../runtime/types";
9
2
  export declare const prizeRevealReminderHandler: ScheduleHandler;
@@ -1,45 +1,2 @@
1
- /**
2
- * scheduledPrizeRevealReminder daily 10am IST (SB8-E).
3
- *
4
- * Notifies users whose prize-draw reveals expire in the next 24 hours and
5
- * haven't been claimed yet. Triggered once a day so users get exactly one
6
- * nudge before the auto-refund kicks in.
7
- */
8
- import { notificationRepository } from "../../../../repositories";
9
- const ORDER_COLLECTION = "orders";
10
- const ONE_DAY_MS = 86400000;
11
- export const prizeRevealReminderHandler = async (ctx) => {
12
- ctx.logger.info("Prize reveal reminder sweep starting");
13
- const cutoff = new Date(ctx.now.getTime() + ONE_DAY_MS);
14
- const snap = await ctx.db
15
- .collection(ORDER_COLLECTION)
16
- .where("paymentStatus", "==", "paid")
17
- .where("status", "in", ["pending", "confirmed", "processing"])
18
- .where("prizeRevealDeadline", "<=", cutoff)
19
- .where("prizeRevealDeadline", ">", ctx.now)
20
- .limit(500)
21
- .get();
22
- let notified = 0;
23
- for (const doc of snap.docs) {
24
- const order = doc.data();
25
- if (!order.userId || order.prizeWon || !order.prizeDrawProductId)
26
- continue;
27
- try {
28
- await notificationRepository.create({
29
- userId: order.userId,
30
- type: "prize_reveal_reminder",
31
- priority: "normal",
32
- title: "Reveal expires within 24h",
33
- message: `Reveal your prize for "${order.productTitle ?? "the draw"}" today — unclaimed reveals are auto-refunded after the deadline.`,
34
- relatedId: doc.id,
35
- relatedType: "order",
36
- actionUrl: `/user/orders/view/${doc.id}`,
37
- });
38
- notified++;
39
- }
40
- catch (err) {
41
- ctx.logger.warn("Reveal reminder notification failed", { err });
42
- }
43
- }
44
- ctx.logger.info("Prize reveal reminder sweep complete", { notified });
45
- };
1
+ import { runPrizeRevealReminder } from "../core/prizeRevealReminder";
2
+ export const prizeRevealReminderHandler = runPrizeRevealReminder;
@@ -1,8 +1,2 @@
1
- /**
2
- * Job handler: 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
1
  import type { ScheduleHandler } from "../runtime/types";
8
2
  export declare const productStatsSyncHandler: ScheduleHandler;
@@ -1,36 +1,2 @@
1
- /**
2
- * Job handler: 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 const productStatsSyncHandler = async (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
- };
1
+ import { runProductStatsSync } from "../core/productStatsSync";
2
+ export const productStatsSyncHandler = runProductStatsSync;
@@ -1,12 +1,4 @@
1
1
  import type { CallableHandler } from "../runtime/types";
2
- export interface PromotionsCallableResult {
3
- promotedProducts: unknown[];
4
- featuredProducts: unknown[];
5
- activeCoupons: unknown[];
6
- }
7
- /**
8
- * Callable handler for promotions data — promoted + featured products and
9
- * active coupons. Wraps the listing query that needs an OR-shaped
10
- * (coupon.startDate IS NULL OR <= now) filter Firestore can't express.
11
- */
2
+ import { type PromotionsCallableResult } from "../core/promotions";
3
+ export type { PromotionsCallableResult };
12
4
  export declare const promotionsHandler: CallableHandler<void, PromotionsCallableResult>;
@@ -1,43 +1,2 @@
1
- import { productRepository, couponsRepository } from "../../../../repositories";
2
- import { ProductStatusValues } from "../../../../features/products/schemas/firestore";
3
- /**
4
- * Callable handler for promotions data — promoted + featured products and
5
- * active coupons. Wraps the listing query that needs an OR-shaped
6
- * (coupon.startDate IS NULL OR <= now) filter Firestore can't express.
7
- */
8
- export const promotionsHandler = async (_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
- };
1
+ import { runPromotions } from "../core/promotions";
2
+ export const promotionsHandler = runPromotions;
@@ -1,30 +1,4 @@
1
- /**
2
- * HTTPS callable handler: aggregate seller (store) analytics for the past
3
- * 6 months. Input: `{ sellerId }` (the Firebase Auth UID); store slug is
4
- * resolved server-side via `storeRepository.findByOwnerId`.
5
- */
6
1
  import type { CallableHandler } 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
- }
2
+ import { type StoreAnalyticsInput, type StoreAnalyticsResult } from "../core/storeAnalytics";
3
+ export type { StoreAnalyticsInput, StoreAnalyticsResult };
30
4
  export declare const storeAnalyticsHandler: CallableHandler<StoreAnalyticsInput, StoreAnalyticsResult>;
@@ -1,109 +1,2 @@
1
- /**
2
- * HTTPS callable handler: aggregate seller (store) analytics for the past
3
- * 6 months. Input: `{ sellerId }` (the Firebase Auth UID); store slug is
4
- * resolved server-side 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 const storeAnalyticsHandler = async (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
- };
1
+ import { runStoreAnalytics, } from "../core/storeAnalytics";
2
+ export const storeAnalyticsHandler = runStoreAnalytics;
@@ -1,30 +1,3 @@
1
- /**
2
- * triggerEventRaffle — HTTP callable (SB9-D).
3
- *
4
- * Selects a raffle winner for an event using `crypto.randomInt()`. Pool logic
5
- * keys off the event's `raffleType`:
6
- * - "top_n_scorers" → sort entries by `points DESC` take top N
7
- * - "top_n_participants" → sort entries by `createdAt ASC` take first N
8
- * - "open_raffle" → all CONFIRMED entries are eligible
9
- *
10
- * On success the function stamps the winner fields onto the event doc and
11
- * sets the GitHub permalink for proof-of-fairness.
12
- */
13
1
  import type { CallableHandler } from "../runtime/types";
14
- interface TriggerEventRaffleInput {
15
- eventId: string;
16
- /** Optional override; otherwise read from event.raffleType. */
17
- raffleType?: "top_n_scorers" | "top_n_participants" | "open_raffle";
18
- /** Optional N override; otherwise read from event.raffleTopN. */
19
- topN?: number;
20
- }
21
- interface TriggerEventRaffleResult {
22
- eventId: string;
23
- raffleWinnerUserId?: string;
24
- raffleWinnerDisplayName?: string;
25
- raffleEntryCount: number;
26
- alreadyTriggered?: boolean;
27
- reason?: string;
28
- }
2
+ import { type TriggerEventRaffleInput, type TriggerEventRaffleResult } from "../core/triggerEventRaffle";
29
3
  export declare const triggerEventRaffleHandler: CallableHandler<TriggerEventRaffleInput, TriggerEventRaffleResult>;
30
- export {};
@@ -1,94 +1,2 @@
1
- /**
2
- * triggerEventRaffle HTTP callable (SB9-D).
3
- *
4
- * Selects a raffle winner for an event using `crypto.randomInt()`. Pool logic
5
- * keys off the event's `raffleType`:
6
- * - "top_n_scorers" → sort entries by `points DESC` take top N
7
- * - "top_n_participants" → sort entries by `createdAt ASC` take first N
8
- * - "open_raffle" → all CONFIRMED entries are eligible
9
- *
10
- * On success the function stamps the winner fields onto the event doc and
11
- * sets the GitHub permalink for proof-of-fairness.
12
- */
13
- import crypto from "node:crypto";
14
- const EVENTS_COLLECTION = "events";
15
- const EVENT_ENTRIES_COLLECTION = "eventEntries";
16
- export const triggerEventRaffleHandler = async (input, ctx) => {
17
- const eventRef = ctx.db.collection(EVENTS_COLLECTION).doc(input.eventId);
18
- const eventSnap = await eventRef.get();
19
- if (!eventSnap.exists) {
20
- return {
21
- eventId: input.eventId,
22
- raffleEntryCount: 0,
23
- reason: "event_not_found",
24
- };
25
- }
26
- const event = eventSnap.data();
27
- if (event.raffleWinnerUserId) {
28
- return {
29
- eventId: input.eventId,
30
- raffleEntryCount: 0,
31
- alreadyTriggered: true,
32
- raffleWinnerUserId: event.raffleWinnerUserId,
33
- };
34
- }
35
- const raffleType = input.raffleType ?? event.raffleType ?? "open_raffle";
36
- const topN = input.topN ?? event.raffleTopN ?? 0;
37
- const entriesSnap = await ctx.db
38
- .collection(EVENT_ENTRIES_COLLECTION)
39
- .where("eventId", "==", input.eventId)
40
- .where("status", "==", "CONFIRMED")
41
- .get();
42
- let pool = entriesSnap.docs.map((d) => ({
43
- id: d.id,
44
- data: d.data(),
45
- }));
46
- if (raffleType === "top_n_scorers" && topN > 0) {
47
- pool = pool
48
- .sort((a, b) => (b.data.points ?? 0) - (a.data.points ?? 0))
49
- .slice(0, topN);
50
- }
51
- else if (raffleType === "top_n_participants" && topN > 0) {
52
- pool = pool
53
- .sort((a, b) => {
54
- const aT = a.data.createdAt instanceof Date
55
- ? a.data.createdAt.getTime()
56
- : (a.data.createdAt?.toDate?.()?.getTime() ?? 0);
57
- const bT = b.data.createdAt instanceof Date
58
- ? b.data.createdAt.getTime()
59
- : (b.data.createdAt?.toDate?.()?.getTime() ?? 0);
60
- return aT - bT;
61
- })
62
- .slice(0, topN);
63
- }
64
- if (pool.length === 0) {
65
- return {
66
- eventId: input.eventId,
67
- raffleEntryCount: 0,
68
- reason: "no_eligible_entries",
69
- };
70
- }
71
- const winnerIdx = crypto.randomInt(0, pool.length);
72
- const winner = pool[winnerIdx];
73
- await eventRef.update({
74
- raffleWinnerUserId: winner.data.userId,
75
- raffleWinnerDisplayName: winner.data.userDisplayName ?? "",
76
- raffleWinnerEntryId: winner.id,
77
- raffleTriggeredAt: ctx.now,
78
- raffleEntryCount: entriesSnap.size,
79
- raffleGithubFunctionUrl: `${ctx.env("PROOF_OF_FAIRNESS_BASE_URL") ?? ""}/raffles/${input.eventId}.json`,
80
- updatedAt: ctx.now,
81
- });
82
- ctx.logger.info("Event raffle triggered", {
83
- eventId: input.eventId,
84
- raffleType,
85
- poolSize: pool.length,
86
- winnerId: winner.id,
87
- });
88
- return {
89
- eventId: input.eventId,
90
- raffleWinnerUserId: winner.data.userId,
91
- raffleWinnerDisplayName: winner.data.userDisplayName,
92
- raffleEntryCount: entriesSnap.size,
93
- };
94
- };
1
+ import { runTriggerEventRaffle, } from "../core/triggerEventRaffle";
2
+ export const triggerEventRaffleHandler = runTriggerEventRaffle;
@@ -1,8 +1,2 @@
1
- /**
2
- * Job handler: weekly Saturday sweep — converts delivered Shiprocket orders
3
- * with `payoutStatus=eligible` into pending payout documents grouped by seller.
4
- * Net amount = gross − 5% platform fee. Idempotent: orders already requested
5
- * are filtered out by the repository.
6
- */
7
1
  import type { ScheduleHandler } from "../runtime/types";
8
2
  export declare const weeklyPayoutEligibilityHandler: ScheduleHandler;
@@ -1,87 +1,2 @@
1
- /**
2
- * Job handler: weekly Saturday sweep — converts delivered Shiprocket orders
3
- * with `payoutStatus=eligible` into pending payout documents grouped by seller.
4
- * Net amount = gross − 5% platform fee. Idempotent: orders already requested
5
- * are filtered out by the repository.
6
- */
7
- import { storeRepository, userRepository, orderRepository, payoutRepository, } from "../../../../repositories";
8
- import { BATCH_LIMIT } from "./messages";
9
- import { getDefaultCurrency } from "../../../../core";
10
- const PLATFORM_COMMISSION_RATE = 0.05;
11
- export const weeklyPayoutEligibilityHandler = async (ctx) => {
12
- ctx.logger.info("Starting weekly payout eligibility sweep");
13
- const eligible = await orderRepository.getEligibleShiprocket();
14
- if (eligible.length === 0) {
15
- ctx.logger.info("No eligible Shiprocket-delivered orders found");
16
- return;
17
- }
18
- ctx.logger.info(`Found ${eligible.length} eligible order(s) — grouping by seller`);
19
- const byStore = new Map();
20
- for (const entry of eligible) {
21
- const storeId = entry.data.storeId;
22
- if (!storeId) {
23
- ctx.logger.warn(`Order ${entry.id} has no storeId — skipping`);
24
- continue;
25
- }
26
- if (!byStore.has(storeId))
27
- byStore.set(storeId, []);
28
- byStore.get(storeId).push(entry);
29
- }
30
- let payoutsCreated = 0;
31
- let ordersProcessed = 0;
32
- const defaultCurrency = getDefaultCurrency();
33
- for (const [storeId, orders] of byStore.entries()) {
34
- const store = await storeRepository.findBySlug(storeId);
35
- const seller = store ? await userRepository.findById(store.ownerId) : null;
36
- if (!store || !seller) {
37
- ctx.logger.warn(`Store/seller ${storeId} not found — skipping ${orders.length} order(s)`);
38
- continue;
39
- }
40
- const grossAmount = orders.reduce((sum, o) => sum + (o.data.totalPrice ?? 0), 0);
41
- const platformFee = Math.round(grossAmount * PLATFORM_COMMISSION_RATE * 100) / 100;
42
- const netAmount = Math.round((grossAmount - platformFee) * 100) / 100;
43
- const payoutInput = {
44
- storeId,
45
- sellerName: (seller.displayName ?? seller.email ?? store.ownerId),
46
- sellerEmail: (seller.email ?? ""),
47
- orderIds: orders.map((o) => o.id),
48
- amount: netAmount,
49
- grossAmount,
50
- platformFee,
51
- platformFeeRate: PLATFORM_COMMISSION_RATE,
52
- currency: defaultCurrency,
53
- status: "pending",
54
- paymentMethod: seller.payoutDetails?.method === "upi" ? "upi" : "bank_transfer",
55
- upiId: seller.payoutDetails?.method === "upi" ? seller.payoutDetails.upiId : undefined,
56
- bankAccount: seller.payoutDetails?.method === "bank_transfer" && seller.payoutDetails.bankAccount
57
- ? {
58
- accountHolderName: seller.payoutDetails.bankAccount.accountHolderName,
59
- accountNumberMasked: seller.payoutDetails.bankAccount.accountNumberMasked,
60
- ifscCode: seller.payoutDetails.bankAccount.ifscCode,
61
- bankName: seller.payoutDetails.bankAccount.bankName,
62
- }
63
- : undefined,
64
- notes: `Automated weekly payout — ${orders.length} Shiprocket delivered order(s)`,
65
- requestedAt: new Date(),
66
- };
67
- const { id: payoutId } = await payoutRepository.create(payoutInput);
68
- for (let i = 0; i < orders.length; i += BATCH_LIMIT) {
69
- const slice = orders.slice(i, i + BATCH_LIMIT);
70
- const batch = ctx.db.batch();
71
- for (const entry of slice) {
72
- orderRepository.markPayoutRequested(batch, entry.ref, payoutId);
73
- }
74
- await batch.commit();
75
- }
76
- payoutsCreated++;
77
- ordersProcessed += orders.length;
78
- ctx.logger.info(`Payout created for store ${storeId}`, {
79
- payoutId,
80
- orderCount: orders.length,
81
- netAmount,
82
- grossAmount,
83
- platformFee,
84
- });
85
- }
86
- ctx.logger.info("Weekly payout eligibility sweep complete", { payoutsCreated, ordersProcessed });
87
- };
1
+ import { runWeeklyPayoutEligibility } from "../core/weeklyPayoutEligibility";
2
+ export const weeklyPayoutEligibilityHandler = runWeeklyPayoutEligibility;
@@ -1,4 +1,5 @@
1
1
  export * from "./handlers/index";
2
+ export * from "./core/index";
2
3
  export * from "./runtime/types";
3
4
  export { bindSchedule, bindDocumentWritten, bindDocumentCreated, bindDocumentUpdated, bindCallable, bindHttps, bindToFirebase, } from "./runtime/adapters/firebase";
4
5
  export type { BindHttpsOptions } from "./runtime/adapters/firebase";
@@ -1,3 +1,4 @@
1
1
  export * from "./handlers/index";
2
+ export * from "./core/index";
2
3
  export * from "./runtime/types";
3
4
  export { bindSchedule, bindDocumentWritten, bindDocumentCreated, bindDocumentUpdated, bindCallable, bindHttps, bindToFirebase, } from "./runtime/adapters/firebase";
@@ -13,6 +13,13 @@
13
13
  import { onSchedule } from "firebase-functions/v2/scheduler";
14
14
  import { onDocumentWritten, onDocumentCreated, onDocumentUpdated, } from "firebase-functions/v2/firestore";
15
15
  import { onCall, onRequest, } from "firebase-functions/v2/https";
16
+ // Note: we intentionally pass secret NAMES (as strings) — not `defineSecret`
17
+ // Param refs — to `onRequest({ secrets: [...] })`. firebase-functions v2
18
+ // accepts both forms; the string form skips the firebase-tools Param-value
19
+ // preflight that requires either an interactive prompt or a
20
+ // functions/.env.<project> file (which would defeat the purpose of using
21
+ // Secret Manager for the value). At runtime the SDK resolves the secret name
22
+ // from Cloud Secret Manager directly and injects it into process.env.
16
23
  import { getAdminDb } from "../../../../../providers/db-firebase";
17
24
  import { serverLogger } from "../../../../../monitoring";
18
25
  function buildContext(job) {
@@ -120,6 +127,20 @@ export function bindCallable(job, handler, options) {
120
127
  */
121
128
  export function bindHttps(job, handler, options) {
122
129
  const { secretEnvVar, methods = ["POST"], ...httpsOptions } = options;
130
+ // Firebase Functions v2 requires secrets to be DECLARED via `secrets: [...]`
131
+ // in the `onRequest` options for the runtime to inject them into
132
+ // `process.env`. Just *reading* `process.env[secretEnvVar]` returns
133
+ // undefined unless the secret is bound here. Declare it via `defineSecret`
134
+ // so the deploy step provisions the binding (and developers see the secret
135
+ // listed in `firebase deploy` output).
136
+ if (secretEnvVar) {
137
+ const existing = Array.isArray(httpsOptions.secrets)
138
+ ? httpsOptions.secrets
139
+ : [];
140
+ if (!existing.includes(secretEnvVar)) {
141
+ httpsOptions.secrets = [...existing, secretEnvVar];
142
+ }
143
+ }
123
144
  return onRequest(httpsOptions, async (req, res) => {
124
145
  const ctx = buildContext(job);
125
146
  if (secretEnvVar) {