@mohasinac/appkit 3.8.2 → 3.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (508) hide show
  1. package/dist/_internal/client/features/live/LiveItemDetailView.js +2 -2
  2. package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +4 -4
  3. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +8 -8
  4. package/dist/_internal/client/features/lottery/LotteryAdminSlotView.d.ts +1 -1
  5. package/dist/_internal/client/features/lottery/LotteryAdminSlotView.js +2 -2
  6. package/dist/_internal/server/features/bundles/actions.js +2 -2
  7. package/dist/_internal/server/features/bundles/og.d.ts +1 -1
  8. package/dist/_internal/server/features/bundles/og.js +4 -5
  9. package/dist/_internal/server/features/checkout/actions.js +57 -21
  10. package/dist/_internal/server/features/checkout/stock-restore.d.ts +19 -0
  11. package/dist/_internal/server/features/checkout/stock-restore.js +80 -0
  12. package/dist/_internal/server/features/checkout/upi-resolution.d.ts +11 -0
  13. package/dist/_internal/server/features/checkout/upi-resolution.js +28 -0
  14. package/dist/_internal/server/features/classified/og.js +1 -1
  15. package/dist/_internal/server/features/digital-code/og.js +1 -1
  16. package/dist/_internal/server/features/item-requests/og.d.ts +2 -2
  17. package/dist/_internal/server/features/item-requests/og.js +4 -5
  18. package/dist/_internal/server/features/live/og.js +1 -1
  19. package/dist/_internal/server/features/lottery/adapters.d.ts +2 -2
  20. package/dist/_internal/server/features/lottery/adapters.js +1 -1
  21. package/dist/_internal/server/features/orders/actions.d.ts +28 -0
  22. package/dist/_internal/server/features/orders/actions.js +239 -4
  23. package/dist/_internal/server/features/orders/adapters.js +3 -0
  24. package/dist/_internal/server/features/payments/data.js +3 -2
  25. package/dist/_internal/server/features/payouts/actions.d.ts +2 -2
  26. package/dist/_internal/server/features/payouts/actions.js +4 -3
  27. package/dist/_internal/server/features/pre-orders/service.d.ts +1 -1
  28. package/dist/_internal/server/features/pre-orders/service.js +3 -2
  29. package/dist/_internal/server/features/prize-draws/og.js +5 -5
  30. package/dist/_internal/server/features/products/og.js +1 -1
  31. package/dist/_internal/server/features/promotions/service.js +3 -1
  32. package/dist/_internal/server/features/refunds/actions.d.ts +2 -2
  33. package/dist/_internal/server/features/refunds/actions.js +7 -6
  34. package/dist/_internal/server/functions/firestore.js +1 -1
  35. package/dist/_internal/server/functions/scheduled.d.ts +4 -1
  36. package/dist/_internal/server/functions/scheduled.js +26 -2
  37. package/dist/_internal/server/jobs/core/emiInstallmentReminder.js +1 -1
  38. package/dist/_internal/server/jobs/core/hardBanCascade.d.ts +4 -0
  39. package/dist/_internal/server/jobs/core/hardBanCascade.js +15 -4
  40. package/dist/_internal/server/jobs/core/hardBanReinstatement.d.ts +16 -0
  41. package/dist/_internal/server/jobs/core/hardBanReinstatement.js +63 -0
  42. package/dist/_internal/server/jobs/core/jobRunners.js +3 -1
  43. package/dist/_internal/server/jobs/core/onScamReportCreate.js +1 -1
  44. package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.d.ts +10 -0
  45. package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.js +60 -0
  46. package/dist/_internal/server/jobs/core/paymentWindowTimeout.d.ts +15 -0
  47. package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +59 -0
  48. package/dist/_internal/server/jobs/core/pendingOrderTimeout.d.ts +7 -0
  49. package/dist/_internal/server/jobs/core/pendingOrderTimeout.js +32 -6
  50. package/dist/_internal/server/jobs/handlers/hardBanReinstatement.d.ts +2 -0
  51. package/dist/_internal/server/jobs/handlers/hardBanReinstatement.js +2 -0
  52. package/dist/_internal/server/jobs/handlers/index.d.ts +3 -0
  53. package/dist/_internal/server/jobs/handlers/index.js +3 -0
  54. package/dist/_internal/server/jobs/handlers/messages.d.ts +4 -0
  55. package/dist/_internal/server/jobs/handlers/messages.js +4 -0
  56. package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.d.ts +3 -3
  57. package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.js +12 -12
  58. package/dist/_internal/server/jobs/handlers/onShipmentItemWrite.d.ts +1 -1
  59. package/dist/_internal/server/jobs/handlers/onShipmentItemWrite.js +5 -5
  60. package/dist/_internal/server/jobs/handlers/paymentReviewAutoApprove.d.ts +2 -0
  61. package/dist/_internal/server/jobs/handlers/paymentReviewAutoApprove.js +2 -0
  62. package/dist/_internal/server/jobs/handlers/paymentWindowTimeout.d.ts +2 -0
  63. package/dist/_internal/server/jobs/handlers/paymentWindowTimeout.js +2 -0
  64. package/dist/_internal/shared/actions/action-registry.js +27 -0
  65. package/dist/_internal/shared/checkout/order-math.js +3 -2
  66. package/dist/_internal/shared/checkout/rules/_defaults.js +1 -0
  67. package/dist/_internal/shared/checkout/rules/preorder.rule.js +7 -0
  68. package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +7 -0
  69. package/dist/_internal/shared/checkout/rules/types.d.ts +11 -0
  70. package/dist/_internal/shared/features/auctions/errors.js +1 -1
  71. package/dist/_internal/shared/features/categories/bundle-copy.d.ts +0 -1
  72. package/dist/_internal/shared/features/categories/bundle-copy.js +0 -1
  73. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +6 -6
  74. package/dist/_internal/shared/features/categories/bundle-schemas.js +2 -2
  75. package/dist/_internal/shared/features/checkout/config.d.ts +3 -3
  76. package/dist/_internal/shared/features/checkout/config.js +3 -3
  77. package/dist/_internal/shared/features/emi/schedule.d.ts +6 -6
  78. package/dist/_internal/shared/features/emi/schedule.js +10 -9
  79. package/dist/_internal/shared/features/promotions/errors.js +1 -1
  80. package/dist/_internal/shared/fees/calculator.d.ts +5 -5
  81. package/dist/_internal/shared/fees/calculator.js +19 -19
  82. package/dist/client.d.ts +1 -1
  83. package/dist/client.js +1 -1
  84. package/dist/constants/api-endpoints.d.ts +9 -0
  85. package/dist/constants/api-endpoints.js +3 -0
  86. package/dist/constants/field-names.d.ts +4 -0
  87. package/dist/constants/field-names.js +4 -0
  88. package/dist/features/admin/components/AdminArtView.js +2 -2
  89. package/dist/features/admin/components/AdminBidsView.js +2 -2
  90. package/dist/features/admin/components/AdminBundleEditorView.d.ts +1 -1
  91. package/dist/features/admin/components/AdminBundleEditorView.js +8 -8
  92. package/dist/features/admin/components/AdminBundlesView.js +6 -6
  93. package/dist/features/admin/components/AdminClassifiedView.js +2 -2
  94. package/dist/features/admin/components/AdminDigitalCodesView.js +2 -2
  95. package/dist/features/admin/components/AdminLiveView.js +2 -2
  96. package/dist/features/admin/components/AdminOrderEditorView.d.ts +6 -1
  97. package/dist/features/admin/components/AdminOrderEditorView.js +45 -5
  98. package/dist/features/admin/components/AdminOrdersView.js +8 -3
  99. package/dist/features/admin/components/AdminPayoutsView.js +2 -2
  100. package/dist/features/admin/components/AdminPrizeDrawsView.js +2 -2
  101. package/dist/features/admin/components/AdminReturnRequestsView.js +2 -2
  102. package/dist/features/admin/components/AdminSectionsView.js +4 -4
  103. package/dist/features/admin/components/AdminSiteSettingsView.js +11 -11
  104. package/dist/features/admin/components/AdminStickersView.js +2 -2
  105. package/dist/features/admin/components/AdminSupportTicketDetailView.js +1 -1
  106. package/dist/features/admin/components/sections/adminSectionsBuildParse.js +13 -5
  107. package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +4 -0
  108. package/dist/features/admin/components/sections/adminSectionsTypes.js +9 -5
  109. package/dist/features/admin/hooks/useAdminListingData.d.ts +1 -1
  110. package/dist/features/admin/hooks/useAdminListingData.js +3 -2
  111. package/dist/features/admin/schemas/firestore.d.ts +9 -7
  112. package/dist/features/admin/schemas/firestore.js +4 -3
  113. package/dist/features/auctions/components/AuctionBidsTable.js +3 -3
  114. package/dist/features/auth/checkout-value-otp.d.ts +46 -0
  115. package/dist/features/auth/checkout-value-otp.js +73 -0
  116. package/dist/features/auth/repository/user.repository.d.ts +6 -0
  117. package/dist/features/auth/repository/user.repository.js +19 -0
  118. package/dist/features/auth/schemas/firestore.d.ts +10 -0
  119. package/dist/features/auth/schemas/firestore.js +2 -0
  120. package/dist/features/cart/actions/cart-actions.d.ts +1 -1
  121. package/dist/features/cart/actions/cart-actions.js +4 -4
  122. package/dist/features/cart/components/CartView.d.ts +2 -2
  123. package/dist/features/cart/components/ShippingPicker.d.ts +4 -4
  124. package/dist/features/cart/components/ShippingPicker.js +11 -11
  125. package/dist/features/cart/repository/cart.repository.d.ts +1 -1
  126. package/dist/features/cart/repository/cart.repository.js +2 -2
  127. package/dist/features/cart/schemas/firestore.d.ts +2 -2
  128. package/dist/features/catalogue/components/CatalogueItemEditorView.js +3 -3
  129. package/dist/features/catalogue/components/PublicCatalogueView.js +2 -2
  130. package/dist/features/catalogue/schemas/validation.js +1 -1
  131. package/dist/features/categories/components/BundleCollage.js +2 -2
  132. package/dist/features/categories/components/BundleDetailView.js +2 -2
  133. package/dist/features/categories/components/BundleItemsPicker.d.ts +1 -1
  134. package/dist/features/categories/components/BundleItemsPicker.js +2 -2
  135. package/dist/features/categories/components/CategoryBundlesListing.js +2 -2
  136. package/dist/features/categories/schemas/firestore.d.ts +1 -1
  137. package/dist/features/categories/schemas/index.d.ts +3 -3
  138. package/dist/features/categories/schemas/index.js +2 -2
  139. package/dist/features/checkout/actions/checkout-value-otp-actions.d.ts +16 -0
  140. package/dist/features/checkout/actions/checkout-value-otp-actions.js +83 -0
  141. package/dist/features/checkout/actions/index.d.ts +1 -0
  142. package/dist/features/checkout/actions/index.js +1 -0
  143. package/dist/features/checkout/schemas/firestore.d.ts +1 -1
  144. package/dist/features/classified/components/index.d.ts +0 -4
  145. package/dist/features/classified/components/index.js +0 -2
  146. package/dist/features/digital-codes/components/index.d.ts +0 -4
  147. package/dist/features/digital-codes/components/index.js +0 -2
  148. package/dist/features/events/schemas/index.d.ts +1 -1
  149. package/dist/features/events/schemas/index.js +1 -1
  150. package/dist/features/homepage/components/BrandsSection.d.ts +4 -1
  151. package/dist/features/homepage/components/BrandsSection.js +2 -2
  152. package/dist/features/homepage/components/CustomCardsSection.js +3 -3
  153. package/dist/features/homepage/components/CustomerReviewsSection.d.ts +4 -1
  154. package/dist/features/homepage/components/CustomerReviewsSection.js +2 -2
  155. package/dist/features/homepage/components/EventsSection.d.ts +4 -1
  156. package/dist/features/homepage/components/EventsSection.js +2 -2
  157. package/dist/features/homepage/components/FeaturedAuctionsSection.d.ts +2 -1
  158. package/dist/features/homepage/components/FeaturedAuctionsSection.js +2 -2
  159. package/dist/features/homepage/components/FeaturedBundlesSection.js +2 -2
  160. package/dist/features/homepage/components/FeaturedPreOrdersSection.d.ts +2 -1
  161. package/dist/features/homepage/components/FeaturedPreOrdersSection.js +2 -2
  162. package/dist/features/homepage/components/FeaturedProductsSection.d.ts +2 -1
  163. package/dist/features/homepage/components/FeaturedProductsSection.js +2 -2
  164. package/dist/features/homepage/components/FeaturedStoresSection.d.ts +4 -1
  165. package/dist/features/homepage/components/FeaturedStoresSection.js +2 -2
  166. package/dist/features/homepage/components/HomepageCustomerReviewsSection.d.ts +4 -1
  167. package/dist/features/homepage/components/HomepageCustomerReviewsSection.js +2 -2
  168. package/dist/features/homepage/components/SectionCarousel.d.ts +3 -1
  169. package/dist/features/homepage/components/SectionCarousel.js +2 -2
  170. package/dist/features/homepage/components/ShopByCategorySection.d.ts +4 -1
  171. package/dist/features/homepage/components/ShopByCategorySection.js +2 -2
  172. package/dist/features/homepage/lib/section-renderer.js +9 -9
  173. package/dist/features/homepage/schemas/firestore.d.ts +8 -0
  174. package/dist/features/live/components/index.d.ts +0 -4
  175. package/dist/features/live/components/index.js +0 -2
  176. package/dist/features/lottery/types/index.d.ts +3 -3
  177. package/dist/features/lottery/types/index.js +5 -5
  178. package/dist/features/orders/components/OrderPaymentSummary.js +2 -2
  179. package/dist/features/orders/components/OrderSiblingPayments.js +1 -1
  180. package/dist/features/orders/components/RefundHistoryTable.js +1 -1
  181. package/dist/features/orders/components/RefundRequestView.js +1 -1
  182. package/dist/features/orders/constants/payment-window.d.ts +10 -0
  183. package/dist/features/orders/constants/payment-window.js +10 -0
  184. package/dist/features/orders/repository/orders.repository.d.ts +25 -0
  185. package/dist/features/orders/repository/orders.repository.js +50 -1
  186. package/dist/features/orders/schemas/firestore.d.ts +50 -2
  187. package/dist/features/orders/schemas/index.d.ts +24 -24
  188. package/dist/features/orders/schemas/index.js +20 -20
  189. package/dist/features/orders/types/index.d.ts +4 -0
  190. package/dist/features/orders/utils/bundle-grouping.d.ts +1 -1
  191. package/dist/features/orders/utils/bundle-grouping.js +1 -1
  192. package/dist/features/payments/schemas/index.d.ts +10 -10
  193. package/dist/features/payments/schemas/index.js +9 -9
  194. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +2 -2
  195. package/dist/features/products/components/ArtStickersListView.d.ts +7 -0
  196. package/dist/features/products/components/ArtStickersListView.js +57 -0
  197. package/dist/features/products/components/GroupSettingsPanel.js +1 -1
  198. package/dist/features/products/components/MakeOfferButton.js +3 -3
  199. package/dist/features/products/components/MarketplaceBundleCard.d.ts +1 -1
  200. package/dist/features/products/components/MarketplaceBundleCard.js +2 -2
  201. package/dist/features/products/components/PrizeDrawCollage.js +2 -2
  202. package/dist/features/products/components/PrizeDrawItemsEditor.js +2 -2
  203. package/dist/features/products/components/PrizeRevealModal.js +1 -1
  204. package/dist/features/products/components/ProductDetailPageView.js +2 -9
  205. package/dist/features/products/components/ProductForm.js +2 -2
  206. package/dist/features/products/components/ProductGrid.js +2 -2
  207. package/dist/features/products/components/ProductsIndexListing.d.ts +13 -1
  208. package/dist/features/products/components/ProductsIndexListing.js +7 -5
  209. package/dist/features/products/components/ProductsIndexPageView.js +6 -1
  210. package/dist/features/products/constants/listing-tabs.d.ts +42 -17
  211. package/dist/features/products/constants/listing-tabs.js +25 -6
  212. package/dist/features/products/schemas/catalog-product.d.ts +5 -5
  213. package/dist/features/products/schemas/catalog-product.js +1 -1
  214. package/dist/features/products/schemas/firestore.d.ts +5 -5
  215. package/dist/features/products/schemas/firestore.js +2 -2
  216. package/dist/features/products/types/index.d.ts +5 -2
  217. package/dist/features/promotions/components/CouponCard.js +2 -2
  218. package/dist/features/promotions/schemas/firestore.d.ts +2 -0
  219. package/dist/features/promotions/schemas/firestore.js +1 -0
  220. package/dist/features/promotions/schemas/index.d.ts +14 -14
  221. package/dist/features/promotions/schemas/index.js +6 -6
  222. package/dist/features/scams/components/ScamProfileView.js +3 -7
  223. package/dist/features/scams/components/ScamRegistryView.js +2 -6
  224. package/dist/features/scams/schemas/firestore.d.ts +1 -1
  225. package/dist/features/search/components/Search.d.ts +1 -1
  226. package/dist/features/seller/actions/offer-actions.js +1 -1
  227. package/dist/features/seller/components/PrintCenterView.js +2 -2
  228. package/dist/features/seller/components/QuickProductForm.js +5 -5
  229. package/dist/features/seller/components/SellerArtView.js +2 -2
  230. package/dist/features/seller/components/SellerAuctionsView.js +2 -2
  231. package/dist/features/seller/components/SellerBidsView.js +2 -2
  232. package/dist/features/seller/components/SellerBundlesView.js +6 -6
  233. package/dist/features/seller/components/SellerClassifiedView.js +2 -2
  234. package/dist/features/seller/components/SellerDigitalCodesView.js +2 -2
  235. package/dist/features/seller/components/SellerLiveView.js +2 -2
  236. package/dist/features/seller/components/SellerOffersView.js +2 -2
  237. package/dist/features/seller/components/SellerOrdersView.js +3 -3
  238. package/dist/features/seller/components/SellerPayoutRequestView.js +2 -2
  239. package/dist/features/seller/components/SellerPayoutSettingsView.js +2 -2
  240. package/dist/features/seller/components/SellerPayoutsView.js +2 -2
  241. package/dist/features/seller/components/SellerPreOrdersView.js +2 -2
  242. package/dist/features/seller/components/SellerPrizeDrawsView.js +2 -2
  243. package/dist/features/seller/components/SellerProductShell.js +8 -8
  244. package/dist/features/seller/components/SellerProductsView.js +1 -1
  245. package/dist/features/seller/components/SellerShippingView.js +6 -6
  246. package/dist/features/seller/components/SellerStickersView.js +2 -2
  247. package/dist/features/seller/hooks/useSellerListingData.d.ts +1 -1
  248. package/dist/features/seller/hooks/useSellerListingData.js +3 -2
  249. package/dist/features/shipments/components/AdminShipmentEditorView.js +10 -10
  250. package/dist/features/shipments/components/AdminShipmentLotItemsView.js +4 -4
  251. package/dist/features/shipments/components/AdminShipmentProjectionsView.js +5 -5
  252. package/dist/features/shipments/components/AdminShipmentsView.js +4 -4
  253. package/dist/features/shipments/repository/shipment-lots.repository.d.ts +2 -2
  254. package/dist/features/shipments/repository/shipment-lots.repository.js +8 -8
  255. package/dist/features/shipments/schemas/firestore.d.ts +21 -21
  256. package/dist/features/shipments/schemas/firestore.js +9 -9
  257. package/dist/features/shipments/schemas/validation.d.ts +30 -30
  258. package/dist/features/shipments/schemas/validation.js +6 -6
  259. package/dist/features/shipments/utils/cost-allocation.d.ts +5 -5
  260. package/dist/features/shipments/utils/cost-allocation.js +39 -38
  261. package/dist/features/store-extensions/schemas/firestore.d.ts +5 -5
  262. package/dist/features/stores/components/StoreDetailLayoutView.js +9 -13
  263. package/dist/features/stores/schemas/firestore.d.ts +7 -7
  264. package/dist/features/stores/schemas/index.d.ts +84 -84
  265. package/dist/features/stores/schemas/index.js +5 -5
  266. package/dist/features/tester/seed-data/categories-tester-seed-data.js +1 -1
  267. package/dist/features/tester/seed-data/products-tester-seed-data.js +6 -6
  268. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +9 -2
  269. package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +8 -1
  270. package/dist/features/whatsapp-bot/helpers/whatsapp.js +13 -2
  271. package/dist/features/whatsapp-bot/types/index.d.ts +9 -1
  272. package/dist/index.d.ts +3 -7
  273. package/dist/index.js +7 -5
  274. package/dist/next/routing/route-map.d.ts +2 -0
  275. package/dist/next/routing/route-map.js +6 -0
  276. package/dist/schemas/firestore-helpers.d.ts +2 -2
  277. package/dist/schemas/firestore-helpers.js +2 -2
  278. package/dist/schemas/registry.d.ts +73 -73
  279. package/dist/seed/bids-seed-data.js +6 -6
  280. package/dist/seed/blog-posts-seed-data.js +1 -0
  281. package/dist/seed/cart-seed-data.js +13 -13
  282. package/dist/seed/catalogue-seed-data.js +6 -6
  283. package/dist/seed/categories-seed-data.js +5 -5
  284. package/dist/seed/claimed-coupons-seed-data.js +3 -3
  285. package/dist/seed/coupons-seed-data.js +20 -20
  286. package/dist/seed/events-seed-data.js +27 -27
  287. package/dist/seed/factories/bid.factory.js +1 -1
  288. package/dist/seed/faq-seed-data.js +20 -1
  289. package/dist/seed/grouped-listings-seed-data.d.ts +2 -2
  290. package/dist/seed/grouped-listings-seed-data.js +3 -3
  291. package/dist/seed/homepage-sections-seed-data.js +10 -0
  292. package/dist/seed/offers-seed-data.js +19 -19
  293. package/dist/seed/orders-seed-data.js +29 -29
  294. package/dist/seed/payouts-seed-data.js +7 -7
  295. package/dist/seed/products-auctions-seed-data.js +6 -6
  296. package/dist/seed/products-preorders-seed-data.d.ts +2 -2
  297. package/dist/seed/products-preorders-seed-data.js +1 -1
  298. package/dist/seed/products-standard-seed-data.js +8 -8
  299. package/dist/seed/scammers-seed-data.js +2 -2
  300. package/dist/seed/shipments-seed-data.js +29 -29
  301. package/dist/seed/site-settings-seed-data.js +3 -2
  302. package/dist/seed/store-extensions-seed-data.js +8 -8
  303. package/dist/seed/stores-seed-data.js +37 -8
  304. package/dist/seed/users-seed-data.js +38 -1
  305. package/dist/server-entry.d.ts +1 -3
  306. package/dist/server-entry.js +1 -3
  307. package/dist/server.d.ts +2 -1
  308. package/dist/server.js +3 -1
  309. package/dist/ui/components/HorizontalScroller.js +3 -0
  310. package/dist/ui/components/PriceDisplay.js +3 -12
  311. package/dist/utils/number.formatter.d.ts +2 -7
  312. package/dist/utils/number.formatter.js +3 -8
  313. package/package.json +1 -1
  314. package/scripts/seed-cli.mjs +8 -3
  315. package/dist/_internal/client/scaffolds/DashboardScaffold.d.ts +0 -34
  316. package/dist/_internal/client/scaffolds/DashboardScaffold.js +0 -26
  317. package/dist/_internal/client/theme/__tests__/ThemeProvider.test.d.ts +0 -1
  318. package/dist/_internal/client/theme/__tests__/ThemeProvider.test.js +0 -109
  319. package/dist/_internal/server/features/auctions/__tests__/service.test.d.ts +0 -1
  320. package/dist/_internal/server/features/auctions/__tests__/service.test.js +0 -140
  321. package/dist/_internal/server/features/checkout/__tests__/actions.test.d.ts +0 -1
  322. package/dist/_internal/server/features/checkout/__tests__/actions.test.js +0 -600
  323. package/dist/_internal/server/features/refunds/__tests__/actions.test.d.ts +0 -1
  324. package/dist/_internal/server/features/refunds/__tests__/actions.test.js +0 -263
  325. package/dist/_internal/server/jobs/core/__tests__/auctionSettlement.test.d.ts +0 -1
  326. package/dist/_internal/server/jobs/core/__tests__/auctionSettlement.test.js +0 -249
  327. package/dist/_internal/server/jobs/core/__tests__/couponExpiry.test.d.ts +0 -1
  328. package/dist/_internal/server/jobs/core/__tests__/couponExpiry.test.js +0 -65
  329. package/dist/_internal/server/jobs/core/__tests__/listingProcessor.test.d.ts +0 -1
  330. package/dist/_internal/server/jobs/core/__tests__/listingProcessor.test.js +0 -163
  331. package/dist/_internal/server/jobs/core/__tests__/mediaTmpCleanup.test.d.ts +0 -1
  332. package/dist/_internal/server/jobs/core/__tests__/mediaTmpCleanup.test.js +0 -115
  333. package/dist/_internal/server/jobs/core/__tests__/onBidPlaced.test.d.ts +0 -1
  334. package/dist/_internal/server/jobs/core/__tests__/onBidPlaced.test.js +0 -201
  335. package/dist/_internal/server/jobs/core/__tests__/onOrderCreate.test.d.ts +0 -1
  336. package/dist/_internal/server/jobs/core/__tests__/onOrderCreate.test.js +0 -169
  337. package/dist/_internal/server/jobs/core/__tests__/onOrderStatusChange.test.d.ts +0 -1
  338. package/dist/_internal/server/jobs/core/__tests__/onOrderStatusChange.test.js +0 -148
  339. package/dist/_internal/server/jobs/core/__tests__/onProductStockChange.test.d.ts +0 -1
  340. package/dist/_internal/server/jobs/core/__tests__/onProductStockChange.test.js +0 -210
  341. package/dist/_internal/server/jobs/core/__tests__/onReviewWrite.test.d.ts +0 -1
  342. package/dist/_internal/server/jobs/core/__tests__/onReviewWrite.test.js +0 -190
  343. package/dist/_internal/server/jobs/core/__tests__/onUserBanChange.test.d.ts +0 -1
  344. package/dist/_internal/server/jobs/core/__tests__/onUserBanChange.test.js +0 -161
  345. package/dist/_internal/server/jobs/core/__tests__/payoutBatch.test.d.ts +0 -1
  346. package/dist/_internal/server/jobs/core/__tests__/payoutBatch.test.js +0 -302
  347. package/dist/_internal/server/jobs/core/__tests__/pendingOrderTimeout.test.d.ts +0 -1
  348. package/dist/_internal/server/jobs/core/__tests__/pendingOrderTimeout.test.js +0 -96
  349. package/dist/_internal/server/jobs/core/__tests__/triggerEventRaffle.test.d.ts +0 -1
  350. package/dist/_internal/server/jobs/core/__tests__/triggerEventRaffle.test.js +0 -252
  351. package/dist/_internal/server/jobs/core/__tests__/wrapJobHandler.test.d.ts +0 -1
  352. package/dist/_internal/server/jobs/core/__tests__/wrapJobHandler.test.js +0 -129
  353. package/dist/_internal/server/jobs/core/onCatalogueSubmittedForApproval.d.ts +0 -15
  354. package/dist/_internal/server/jobs/core/onCatalogueSubmittedForApproval.js +0 -38
  355. package/dist/_internal/server/providers/index.d.ts +0 -11
  356. package/dist/_internal/server/providers/index.js +0 -11
  357. package/dist/_internal/server/providers/payment/razorpay-mock.d.ts +0 -52
  358. package/dist/_internal/server/providers/payment/razorpay-mock.js +0 -118
  359. package/dist/_internal/server/providers/resolve.d.ts +0 -36
  360. package/dist/_internal/server/providers/resolve.js +0 -31
  361. package/dist/_internal/server/providers/shipping/shiprocket-mock.d.ts +0 -29
  362. package/dist/_internal/server/providers/shipping/shiprocket-mock.js +0 -152
  363. package/dist/_internal/shared/types/__tests__/action-result.test.d.ts +0 -1
  364. package/dist/_internal/shared/types/__tests__/action-result.test.js +0 -65
  365. package/dist/errors/__tests__/error-mapping.test.d.ts +0 -1
  366. package/dist/errors/__tests__/error-mapping.test.js +0 -122
  367. package/dist/errors/__tests__/safe-read.test.d.ts +0 -1
  368. package/dist/errors/__tests__/safe-read.test.js +0 -39
  369. package/dist/features/addresses/repository/__tests__/addresses.repository.test.d.ts +0 -1
  370. package/dist/features/addresses/repository/__tests__/addresses.repository.test.js +0 -386
  371. package/dist/features/admin/components/AdminListingScaffold.d.ts +0 -41
  372. package/dist/features/admin/components/AdminListingScaffold.js +0 -68
  373. package/dist/features/admin/components/QuickActionsPanel.d.ts +0 -15
  374. package/dist/features/admin/components/QuickActionsPanel.js +0 -5
  375. package/dist/features/admin/repository/__tests__/notification.repository.test.d.ts +0 -1
  376. package/dist/features/admin/repository/__tests__/notification.repository.test.js +0 -356
  377. package/dist/features/admin/repository/__tests__/site-settings.repository.test.d.ts +0 -1
  378. package/dist/features/admin/repository/__tests__/site-settings.repository.test.js +0 -298
  379. package/dist/features/auctions/repository/__tests__/bid.repository.test.d.ts +0 -1
  380. package/dist/features/auctions/repository/__tests__/bid.repository.test.js +0 -290
  381. package/dist/features/auctions/repository/auctions.repository.d.ts +0 -12
  382. package/dist/features/auctions/repository/auctions.repository.js +0 -42
  383. package/dist/features/auth/repository/__tests__/session.repository.test.d.ts +0 -1
  384. package/dist/features/auth/repository/__tests__/session.repository.test.js +0 -310
  385. package/dist/features/auth/repository/__tests__/session.test.d.ts +0 -1
  386. package/dist/features/auth/repository/__tests__/session.test.js +0 -146
  387. package/dist/features/auth/repository/__tests__/sms-counter.repository.test.d.ts +0 -1
  388. package/dist/features/auth/repository/__tests__/sms-counter.repository.test.js +0 -171
  389. package/dist/features/auth/repository/__tests__/sms-counter.test.d.ts +0 -1
  390. package/dist/features/auth/repository/__tests__/sms-counter.test.js +0 -88
  391. package/dist/features/auth/repository/__tests__/token.repository.test.d.ts +0 -1
  392. package/dist/features/auth/repository/__tests__/token.repository.test.js +0 -260
  393. package/dist/features/auth/repository/__tests__/token.test.d.ts +0 -1
  394. package/dist/features/auth/repository/__tests__/token.test.js +0 -140
  395. package/dist/features/auth/repository/__tests__/user.repository.test.d.ts +0 -1
  396. package/dist/features/auth/repository/__tests__/user.repository.test.js +0 -352
  397. package/dist/features/auth/repository/__tests__/user.test.d.ts +0 -1
  398. package/dist/features/auth/repository/__tests__/user.test.js +0 -226
  399. package/dist/features/before-after/repository/before-after.repository.d.ts +0 -13
  400. package/dist/features/before-after/repository/before-after.repository.js +0 -36
  401. package/dist/features/before-after/server.d.ts +0 -6
  402. package/dist/features/before-after/server.js +0 -6
  403. package/dist/features/cart/repository/__tests__/cart.repository.test.d.ts +0 -1
  404. package/dist/features/cart/repository/__tests__/cart.repository.test.js +0 -371
  405. package/dist/features/categories/repository/__tests__/categories.repository.test.d.ts +0 -1
  406. package/dist/features/categories/repository/__tests__/categories.repository.test.js +0 -813
  407. package/dist/features/collections/repository/collections.repository.d.ts +0 -8
  408. package/dist/features/collections/repository/collections.repository.js +0 -16
  409. package/dist/features/collections/server.d.ts +0 -6
  410. package/dist/features/collections/server.js +0 -6
  411. package/dist/features/events/repository/__tests__/event.repository.test.d.ts +0 -1
  412. package/dist/features/events/repository/__tests__/event.repository.test.js +0 -299
  413. package/dist/features/faq/repository/__tests__/faqs.repository.test.d.ts +0 -1
  414. package/dist/features/faq/repository/__tests__/faqs.repository.test.js +0 -311
  415. package/dist/features/forms/Form.d.ts +0 -25
  416. package/dist/features/forms/Form.js +0 -37
  417. package/dist/features/history/repository/__tests__/user-history.repository.test.d.ts +0 -1
  418. package/dist/features/history/repository/__tests__/user-history.repository.test.js +0 -180
  419. package/dist/features/homepage/repository/__tests__/carousel.repository.test.d.ts +0 -1
  420. package/dist/features/homepage/repository/__tests__/carousel.repository.test.js +0 -182
  421. package/dist/features/homepage/repository/__tests__/homepage-sections.repository.test.d.ts +0 -1
  422. package/dist/features/homepage/repository/__tests__/homepage-sections.repository.test.js +0 -185
  423. package/dist/features/layout/ListingLayout.d.ts +0 -34
  424. package/dist/features/layout/ListingLayout.js +0 -103
  425. package/dist/features/messages/repository/__tests__/conversations.repository.test.d.ts +0 -1
  426. package/dist/features/messages/repository/__tests__/conversations.repository.test.js +0 -257
  427. package/dist/features/orders/repository/__tests__/orders.repository.test.d.ts +0 -1
  428. package/dist/features/orders/repository/__tests__/orders.repository.test.js +0 -211
  429. package/dist/features/payments/repository/__tests__/payout.repository.test.d.ts +0 -1
  430. package/dist/features/payments/repository/__tests__/payout.repository.test.js +0 -292
  431. package/dist/features/pre-orders/repository/preorders.repository.d.ts +0 -8
  432. package/dist/features/pre-orders/repository/preorders.repository.js +0 -25
  433. package/dist/features/products/repository/__tests__/product-features.repository.test.d.ts +0 -1
  434. package/dist/features/products/repository/__tests__/product-features.repository.test.js +0 -329
  435. package/dist/features/products/repository/__tests__/products.repository.test.d.ts +0 -1
  436. package/dist/features/products/repository/__tests__/products.repository.test.js +0 -607
  437. package/dist/features/promotions/repository/__tests__/claimed-coupons.repository.test.d.ts +0 -1
  438. package/dist/features/promotions/repository/__tests__/claimed-coupons.repository.test.js +0 -219
  439. package/dist/features/promotions/repository/__tests__/coupons.repository.test.d.ts +0 -1
  440. package/dist/features/promotions/repository/__tests__/coupons.repository.test.js +0 -480
  441. package/dist/features/promotions/repository/promotions.repository.d.ts +0 -14
  442. package/dist/features/promotions/repository/promotions.repository.js +0 -43
  443. package/dist/features/reviews/repository/__tests__/reviews.repository.test.d.ts +0 -1
  444. package/dist/features/reviews/repository/__tests__/reviews.repository.test.js +0 -327
  445. package/dist/features/scams/repository/__tests__/scammer.repository.test.d.ts +0 -1
  446. package/dist/features/scams/repository/__tests__/scammer.repository.test.js +0 -385
  447. package/dist/features/search/repository/__tests__/search.repository.test.d.ts +0 -1
  448. package/dist/features/search/repository/__tests__/search.repository.test.js +0 -369
  449. package/dist/features/seller/components/SellerStatCard.d.ts +0 -14
  450. package/dist/features/seller/components/SellerStatCard.js +0 -6
  451. package/dist/features/seller/components/seller-products-styles.d.ts +0 -7
  452. package/dist/features/seller/components/seller-products-styles.js +0 -14
  453. package/dist/features/seller/repository/__tests__/offer.repository.test.d.ts +0 -1
  454. package/dist/features/seller/repository/__tests__/offer.repository.test.js +0 -458
  455. package/dist/features/seller/repository/seller.repository.d.ts +0 -22
  456. package/dist/features/seller/repository/seller.repository.js +0 -72
  457. package/dist/features/site-settings/components/__tests__/ThemeManagerView.test.d.ts +0 -1
  458. package/dist/features/site-settings/components/__tests__/ThemeManagerView.test.js +0 -37
  459. package/dist/features/stores/repository/__tests__/store.repository.test.d.ts +0 -1
  460. package/dist/features/stores/repository/__tests__/store.repository.test.js +0 -261
  461. package/dist/features/stores/repository/stores.repository.d.ts +0 -11
  462. package/dist/features/stores/repository/stores.repository.js +0 -37
  463. package/dist/features/support/repository/__tests__/support.repository.test.d.ts +0 -1
  464. package/dist/features/support/repository/__tests__/support.repository.test.js +0 -312
  465. package/dist/features/wishlist/repository/__tests__/user-wishlist.repository.test.d.ts +0 -1
  466. package/dist/features/wishlist/repository/__tests__/user-wishlist.repository.test.js +0 -139
  467. package/dist/features/wishlist/repository/wishlist.repository.d.ts +0 -13
  468. package/dist/features/wishlist/repository/wishlist.repository.js +0 -31
  469. package/dist/providers/db-firebase/__tests__/filter-aliases.test.d.ts +0 -1
  470. package/dist/providers/db-firebase/__tests__/filter-aliases.test.js +0 -93
  471. package/dist/providers/shipping-shiprocket/index.d.ts +0 -297
  472. package/dist/providers/shipping-shiprocket/index.js +0 -194
  473. package/dist/providers/shipping-shiprocket/shiprocket-provider.d.ts +0 -45
  474. package/dist/providers/shipping-shiprocket/shiprocket-provider.js +0 -168
  475. package/dist/react/contexts/ThemeContext.d.ts +0 -13
  476. package/dist/react/contexts/ThemeContext.js +0 -64
  477. package/dist/schemas/webhooks/shiprocket.d.ts +0 -30
  478. package/dist/schemas/webhooks/shiprocket.js +0 -22
  479. package/dist/seed/actions/demo-seed-actions.d.ts +0 -42
  480. package/dist/seed/actions/demo-seed-actions.js +0 -36
  481. package/dist/seed/actions/index.d.ts +0 -1
  482. package/dist/seed/actions/index.js +0 -1
  483. package/dist/seed/sub-listings-seed-data.d.ts +0 -123
  484. package/dist/seed/sub-listings-seed-data.js +0 -447
  485. package/dist/seed/tester-checklist-seed-data.d.ts +0 -2
  486. package/dist/seed/tester-checklist-seed-data.js +0 -248
  487. package/dist/ui/components/DashboardStatsCard.d.ts +0 -15
  488. package/dist/ui/components/DashboardStatsCard.js +0 -27
  489. package/dist/ui/components/DashboardStatsCard.style.css +0 -68
  490. package/dist/ui/components/DynamicSelect.d.ts +0 -23
  491. package/dist/ui/components/DynamicSelect.js +0 -77
  492. package/dist/ui/components/DynamicSelect.style.css +0 -101
  493. package/dist/ui/components/InlineCreateSelect.d.ts +0 -48
  494. package/dist/ui/components/InlineCreateSelect.js +0 -75
  495. package/dist/ui/components/ListingViewShell.d.ts +0 -37
  496. package/dist/ui/components/ListingViewShell.js +0 -9
  497. package/dist/ui/components/PaginatedMultiSelect.d.ts +0 -28
  498. package/dist/ui/components/PaginatedMultiSelect.js +0 -141
  499. package/dist/ui/components/PaginatedMultiSelect.style.css +0 -272
  500. package/dist/ui/components/SectionTabs.d.ts +0 -19
  501. package/dist/ui/components/SectionTabs.js +0 -66
  502. package/dist/ui/components/SectionTabs.style.css +0 -164
  503. package/dist/ui/components/__tests__/BulkActionBar.test.d.ts +0 -1
  504. package/dist/ui/components/__tests__/BulkActionBar.test.js +0 -96
  505. package/dist/ui/components/__tests__/ListingToolbar.test.d.ts +0 -1
  506. package/dist/ui/components/__tests__/ListingToolbar.test.js +0 -125
  507. package/dist/ui/components/__tests__/new-primitives.test.d.ts +0 -1
  508. package/dist/ui/components/__tests__/new-primitives.test.js +0 -187
@@ -1,292 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import { makeMockDb, makeSnap } from "../../../../../tests/helpers/mock-firestore";
3
- const { db, mockDocRef, mockCollection, mockQuery, mockTxn } = makeMockDb();
4
- vi.mock("../../../../providers/db-firebase/admin", () => ({
5
- getAdminDb: () => db,
6
- }));
7
- vi.mock("../../../../providers/db-firebase", async (importOriginal) => {
8
- const actual = await importOriginal();
9
- return {
10
- ...actual,
11
- prepareForFirestore: (d) => d,
12
- };
13
- });
14
- vi.mock("../../../../security", () => ({
15
- encryptPiiFields: (d) => d,
16
- decryptPiiFields: (d) => d,
17
- addPiiIndices: (d) => d,
18
- encryptPayoutBankAccount: (d) => d,
19
- decryptPayoutBankAccount: (d) => d,
20
- PAYOUT_PII_FIELDS: ["sellerName", "sellerEmail"],
21
- PAYOUT_PII_INDEX_MAP: {},
22
- }));
23
- vi.mock("../../../../errors/normalize", () => ({
24
- normalizeError: vi.fn(),
25
- }));
26
- import { PayoutRepository } from "../payout.repository";
27
- const repo = new PayoutRepository();
28
- function makePayoutDoc(overrides = {}) {
29
- return {
30
- id: "payout-misty-20260101-a1b2c3",
31
- storeId: "store-pokemon-palace",
32
- sellerName: "Misty Singh",
33
- sellerEmail: "misty@pokemon.com",
34
- amount: 50000, // paise
35
- netAmount: 50000,
36
- status: "pending",
37
- orderIds: ["order-1-20260101-abc", "order-2-20260101-def"],
38
- requestedAt: new Date(),
39
- createdAt: new Date(),
40
- updatedAt: new Date(),
41
- refundDeductions: [],
42
- ...overrides,
43
- };
44
- }
45
- beforeEach(() => {
46
- vi.clearAllMocks();
47
- db.collection.mockReturnValue(mockCollection);
48
- mockCollection.doc.mockReturnValue(mockDocRef);
49
- mockCollection.where.mockReturnValue(mockQuery);
50
- mockQuery.where.mockReturnValue(mockQuery);
51
- mockQuery.orderBy.mockReturnValue(mockQuery);
52
- mockQuery.limit.mockReturnValue(mockQuery);
53
- mockQuery.get.mockResolvedValue({ docs: [], empty: true, size: 0 });
54
- mockDocRef.get.mockResolvedValue(makeSnap(null));
55
- mockDocRef.set.mockResolvedValue(undefined);
56
- mockDocRef.update.mockResolvedValue(undefined);
57
- db.runTransaction.mockImplementation(async (fn) => fn(mockTxn));
58
- mockTxn.get.mockResolvedValue(makeSnap(null));
59
- mockTxn.update.mockReturnValue(undefined);
60
- });
61
- // ---------------------------------------------------------------------------
62
- // create
63
- // ---------------------------------------------------------------------------
64
- describe("PayoutRepository.create", () => {
65
- it("creates payout with status: pending", async () => {
66
- const result = await repo.create({
67
- storeId: "store-1",
68
- sellerName: "Arun",
69
- sellerEmail: "arun@test.com",
70
- amount: 10000,
71
- orderIds: [],
72
- paymentMethod: "upi",
73
- });
74
- expect(result.status).toBe("pending");
75
- });
76
- it("persists the payout to Firestore", async () => {
77
- await repo.create({
78
- storeId: "store-1",
79
- sellerName: "Arun",
80
- sellerEmail: "arun@test.com",
81
- amount: 10000,
82
- orderIds: [],
83
- paymentMethod: "upi",
84
- });
85
- expect(mockDocRef.set).toHaveBeenCalledOnce();
86
- });
87
- it("sets requestedAt timestamp", async () => {
88
- const result = await repo.create({
89
- storeId: "store-1",
90
- sellerName: "Arun",
91
- sellerEmail: "arun@test.com",
92
- amount: 10000,
93
- orderIds: [],
94
- paymentMethod: "upi",
95
- });
96
- expect(result.requestedAt).toBeInstanceOf(Date);
97
- });
98
- });
99
- // ---------------------------------------------------------------------------
100
- // markProcessing
101
- // ---------------------------------------------------------------------------
102
- describe("PayoutRepository.markProcessing", () => {
103
- it("sets status: processing on the provided ref", async () => {
104
- await repo.markProcessing(mockDocRef);
105
- expect(mockDocRef.update).toHaveBeenCalledWith(expect.objectContaining({ status: "processing" }));
106
- });
107
- it("sets processedAt timestamp", async () => {
108
- await repo.markProcessing(mockDocRef);
109
- expect(mockDocRef.update).toHaveBeenCalledWith(expect.objectContaining({ processedAt: expect.any(Date) }));
110
- });
111
- });
112
- // ---------------------------------------------------------------------------
113
- // recordSuccess
114
- // ---------------------------------------------------------------------------
115
- describe("PayoutRepository.recordSuccess", () => {
116
- it("stores razorpayPayoutId on the payout", async () => {
117
- await repo.recordSuccess(mockDocRef, "razorpay-payout-123", "processed");
118
- expect(mockDocRef.update).toHaveBeenCalledWith(expect.objectContaining({ razorpayPayoutId: "razorpay-payout-123" }));
119
- });
120
- it("stores razorpayStatus on the payout", async () => {
121
- await repo.recordSuccess(mockDocRef, "payout-abc", "processed");
122
- expect(mockDocRef.update).toHaveBeenCalledWith(expect.objectContaining({ razorpayStatus: "processed" }));
123
- });
124
- it("sets updatedAt timestamp", async () => {
125
- await repo.recordSuccess(mockDocRef, "payout-abc", "processed");
126
- expect(mockDocRef.update).toHaveBeenCalledWith(expect.objectContaining({ updatedAt: expect.any(Date) }));
127
- });
128
- });
129
- // ---------------------------------------------------------------------------
130
- // recordFailure
131
- // ---------------------------------------------------------------------------
132
- describe("PayoutRepository.recordFailure", () => {
133
- it("isFinal=true → sets status: failed", async () => {
134
- await repo.recordFailure(mockDocRef, 3, "Insufficient funds", true);
135
- expect(mockDocRef.update).toHaveBeenCalledWith(expect.objectContaining({ status: "failed" }));
136
- });
137
- it("isFinal=false → keeps status: pending (retry)", async () => {
138
- await repo.recordFailure(mockDocRef, 1, "Timeout", false);
139
- expect(mockDocRef.update).toHaveBeenCalledWith(expect.objectContaining({ status: "pending" }));
140
- });
141
- it("stores failureCount", async () => {
142
- await repo.recordFailure(mockDocRef, 2, "Network error", false);
143
- expect(mockDocRef.update).toHaveBeenCalledWith(expect.objectContaining({ failureCount: 2 }));
144
- });
145
- it("stores lastFailureReason", async () => {
146
- await repo.recordFailure(mockDocRef, 1, "Account blocked", false);
147
- expect(mockDocRef.update).toHaveBeenCalledWith(expect.objectContaining({ lastFailureReason: "Account blocked" }));
148
- });
149
- });
150
- // ---------------------------------------------------------------------------
151
- // applyRefundDeduction
152
- // ---------------------------------------------------------------------------
153
- describe("PayoutRepository.applyRefundDeduction", () => {
154
- it("throws when payout not found in transaction", async () => {
155
- mockTxn.get.mockResolvedValue(makeSnap(null));
156
- await expect(repo.applyRefundDeduction("payout-ghost", {
157
- orderId: "order-1",
158
- deductedAmount: 100,
159
- })).rejects.toThrow(/not found/i);
160
- });
161
- it("throws when payout status is not pending", async () => {
162
- const payout = makePayoutDoc({ status: "completed" });
163
- mockTxn.get.mockResolvedValue({ exists: true, id: payout.id, data: () => payout });
164
- await expect(repo.applyRefundDeduction("payout-1", {
165
- orderId: "order-1",
166
- deductedAmount: 100,
167
- })).rejects.toThrow(/status/i);
168
- });
169
- it("computes netAmount = amount - totalDeducted", async () => {
170
- const payout = makePayoutDoc({ amount: 50000, refundDeductions: [] });
171
- mockTxn.get.mockResolvedValue({ exists: true, id: payout.id, data: () => payout });
172
- const result = await repo.applyRefundDeduction("payout-1", {
173
- orderId: "order-1",
174
- deductedAmount: 10000,
175
- });
176
- expect(result.netAmount).toBe(40000);
177
- });
178
- it("netAmount is floored at 0 when deduction exceeds amount", async () => {
179
- const payout = makePayoutDoc({ amount: 5000, refundDeductions: [] });
180
- mockTxn.get.mockResolvedValue({ exists: true, id: payout.id, data: () => payout });
181
- const result = await repo.applyRefundDeduction("payout-1", {
182
- orderId: "order-1",
183
- deductedAmount: 10000, // more than amount
184
- });
185
- expect(result.netAmount).toBe(0);
186
- });
187
- it("accumulates multiple deductions correctly", async () => {
188
- const existing = [{ orderId: "order-old", deductedAmount: 5000, appliedAt: new Date() }];
189
- const payout = makePayoutDoc({ amount: 50000, refundDeductions: existing });
190
- mockTxn.get.mockResolvedValue({ exists: true, id: payout.id, data: () => payout });
191
- const result = await repo.applyRefundDeduction("payout-1", {
192
- orderId: "order-new",
193
- deductedAmount: 10000,
194
- });
195
- // total deducted = 5000 + 10000 = 15000, net = 50000 - 15000 = 35000
196
- expect(result.netAmount).toBe(35000);
197
- });
198
- it("sets appliedAt on the deduction entry", async () => {
199
- const payout = makePayoutDoc({ amount: 50000, refundDeductions: [] });
200
- mockTxn.get.mockResolvedValue({ exists: true, id: payout.id, data: () => payout });
201
- const result = await repo.applyRefundDeduction("payout-1", {
202
- orderId: "order-1",
203
- deductedAmount: 100,
204
- });
205
- const lastDeduction = result.refundDeductions[result.refundDeductions.length - 1];
206
- expect(lastDeduction.appliedAt).toBeInstanceOf(Date);
207
- });
208
- it("uses a Firestore transaction for atomic read-modify-write", async () => {
209
- const payout = makePayoutDoc({ amount: 50000, refundDeductions: [] });
210
- mockTxn.get.mockResolvedValue({ exists: true, id: payout.id, data: () => payout });
211
- await repo.applyRefundDeduction("payout-1", {
212
- orderId: "order-1",
213
- deductedAmount: 100,
214
- });
215
- expect(db.runTransaction).toHaveBeenCalledOnce();
216
- expect(mockTxn.get).toHaveBeenCalledOnce();
217
- expect(mockTxn.update).toHaveBeenCalledOnce();
218
- });
219
- });
220
- // ---------------------------------------------------------------------------
221
- // findPendingByStore
222
- // ---------------------------------------------------------------------------
223
- describe("PayoutRepository.findPendingByStore", () => {
224
- it("returns null when no pending payout found", async () => {
225
- mockQuery.get.mockResolvedValue({ docs: [], empty: true, size: 0 });
226
- const result = await repo.findPendingByStore("store-1");
227
- expect(result).toBeNull();
228
- });
229
- it("queries storeId AND status=pending", async () => {
230
- mockQuery.get.mockResolvedValue({ docs: [], empty: true, size: 0 });
231
- await repo.findPendingByStore("store-abc");
232
- expect(mockCollection.where).toHaveBeenCalledWith("storeId", "==", "store-abc");
233
- expect(mockQuery.where).toHaveBeenCalledWith("status", "==", "pending");
234
- });
235
- it("applies limit of 1 (most recent only)", async () => {
236
- mockQuery.get.mockResolvedValue({ docs: [], empty: true, size: 0 });
237
- await repo.findPendingByStore("store-abc");
238
- expect(mockQuery.limit).toHaveBeenCalledWith(1);
239
- });
240
- it("returns the payout when found", async () => {
241
- const payout = makePayoutDoc({ status: "pending" });
242
- mockQuery.get.mockResolvedValue({
243
- docs: [{ id: payout.id, data: () => payout }],
244
- empty: false,
245
- size: 1,
246
- });
247
- const result = await repo.findPendingByStore("store-pokemon-palace");
248
- expect(result).not.toBeNull();
249
- });
250
- });
251
- // ---------------------------------------------------------------------------
252
- // getPaidOutOrderIds
253
- // ---------------------------------------------------------------------------
254
- describe("PayoutRepository.getPaidOutOrderIds", () => {
255
- it("returns empty Set when no matching payouts", async () => {
256
- mockQuery.get.mockResolvedValue({ docs: [], empty: true, size: 0 });
257
- const ids = await repo.getPaidOutOrderIds("store-1");
258
- expect(ids.size).toBe(0);
259
- });
260
- it("collects all orderIds from matching payout documents", async () => {
261
- const payout1 = makePayoutDoc({ orderIds: ["order-A", "order-B"] });
262
- const payout2 = makePayoutDoc({ id: "payout-2", orderIds: ["order-C"] });
263
- mockQuery.get.mockResolvedValue({
264
- docs: [
265
- { id: payout1.id, data: () => payout1 },
266
- { id: payout2.id, data: () => payout2 },
267
- ],
268
- empty: false,
269
- size: 2,
270
- });
271
- const ids = await repo.getPaidOutOrderIds("store-pokemon-palace");
272
- expect(ids.has("order-A")).toBe(true);
273
- expect(ids.has("order-B")).toBe(true);
274
- expect(ids.has("order-C")).toBe(true);
275
- });
276
- it("queries storeId AND status in [pending, processing, completed]", async () => {
277
- mockQuery.get.mockResolvedValue({ docs: [], empty: true, size: 0 });
278
- await repo.getPaidOutOrderIds("store-1");
279
- expect(mockCollection.where).toHaveBeenCalledWith("storeId", "==", "store-1");
280
- expect(mockQuery.where).toHaveBeenCalledWith("status", "in", expect.arrayContaining(["pending", "processing", "completed"]));
281
- });
282
- it("handles payout with no orderIds field gracefully", async () => {
283
- const payout = { ...makePayoutDoc(), orderIds: undefined };
284
- mockQuery.get.mockResolvedValue({
285
- docs: [{ id: payout.id, data: () => payout }],
286
- empty: false,
287
- size: 1,
288
- });
289
- const ids = await repo.getPaidOutOrderIds("store-1");
290
- expect(ids.size).toBe(0);
291
- });
292
- });
@@ -1,8 +0,0 @@
1
- import type { IRepository } from "../../../contracts";
2
- import type { PreorderItem } from "../types";
3
- export declare class PreordersRepository {
4
- private readonly repo;
5
- constructor(repo: IRepository<PreorderItem>);
6
- findPreorders(): Promise<PreorderItem[]>;
7
- findFeaturedPreorders(): Promise<PreorderItem[]>;
8
- }
@@ -1,25 +0,0 @@
1
- import { PRODUCT_FIELDS } from "../../../constants/field-names";
2
- const { LISTING_TYPE, STATUS, FEATURED, CREATED_AT } = PRODUCT_FIELDS;
3
- const { PRE_ORDER } = PRODUCT_FIELDS.LISTING_TYPE_VALUES;
4
- const { PUBLISHED } = PRODUCT_FIELDS.STATUS_VALUES;
5
- export class PreordersRepository {
6
- constructor(repo) {
7
- this.repo = repo;
8
- }
9
- async findPreorders() {
10
- const result = await this.repo.findAll({
11
- filters: `${LISTING_TYPE}==${PRE_ORDER},${STATUS}==${PUBLISHED}`,
12
- sort: CREATED_AT,
13
- order: "desc",
14
- });
15
- return result.data;
16
- }
17
- async findFeaturedPreorders() {
18
- const result = await this.repo.findAll({
19
- filters: `${LISTING_TYPE}==${PRE_ORDER},${STATUS}==${PUBLISHED},${FEATURED}==true`,
20
- sort: CREATED_AT,
21
- order: "desc",
22
- });
23
- return result.data;
24
- }
25
- }
@@ -1,329 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import { makeMockDb, makeSnap, makeQuerySnap } from "../../../../../tests/helpers/mock-firestore";
3
- import { ValidationError } from "../../../../errors";
4
- const { db, mockDocRef, mockCollection, mockQuery } = makeMockDb();
5
- vi.mock("../../../../providers/db-firebase/admin", () => ({
6
- getAdminDb: () => db,
7
- }));
8
- vi.mock("../../../../providers/db-firebase", async (importOriginal) => {
9
- const actual = await importOriginal();
10
- return {
11
- ...actual,
12
- prepareForFirestore: (d) => d,
13
- };
14
- });
15
- vi.mock("../../../../contracts/field-ops", () => ({
16
- serverTimestamp: () => new Date(),
17
- increment: (n) => n,
18
- arrayUnion: (...args) => args,
19
- arrayRemove: (...args) => args,
20
- deleteField: () => null,
21
- registerFieldOps: vi.fn(),
22
- }));
23
- vi.mock("../../../../errors/normalize", () => ({ normalizeError: vi.fn() }));
24
- vi.mock("../../../../monitoring", () => ({
25
- serverLogger: { info: vi.fn(), warn: vi.fn(), error: vi.fn() },
26
- }));
27
- import { ProductFeaturesRepository } from "../product-features.repository";
28
- import { MAX_STORE_CUSTOM_FEATURES } from "../../schemas/product-features";
29
- const repo = new ProductFeaturesRepository();
30
- function makeFeatureDoc(overrides = {}) {
31
- return {
32
- id: "feature-free-shipping",
33
- slug: "feature-free-shipping",
34
- label: "Free Shipping",
35
- description: "This item ships for free",
36
- icon: "truck",
37
- scope: "platform",
38
- storeId: undefined,
39
- productTypes: ["all"],
40
- displayOrder: 0,
41
- isActive: true,
42
- createdAt: new Date(),
43
- updatedAt: new Date(),
44
- ...overrides,
45
- };
46
- }
47
- beforeEach(() => {
48
- vi.clearAllMocks();
49
- db.collection.mockReturnValue(mockCollection);
50
- mockCollection.doc.mockReturnValue(mockDocRef);
51
- mockCollection.where.mockReturnValue(mockQuery);
52
- mockCollection.get = vi.fn().mockResolvedValue(makeQuerySnap([]));
53
- mockQuery.where.mockReturnValue(mockQuery);
54
- mockQuery.orderBy.mockReturnValue(mockQuery);
55
- mockQuery.limit.mockReturnValue(mockQuery);
56
- mockQuery.get.mockResolvedValue(makeQuerySnap([]));
57
- mockDocRef.get.mockResolvedValue(makeSnap(makeFeatureDoc(), "feature-free-shipping"));
58
- mockDocRef.set.mockResolvedValue(undefined);
59
- mockDocRef.update.mockResolvedValue(undefined);
60
- mockDocRef.delete.mockResolvedValue(undefined);
61
- });
62
- // ---------------------------------------------------------------------------
63
- // generateId
64
- // ---------------------------------------------------------------------------
65
- describe("ProductFeaturesRepository.generateId", () => {
66
- it("generates ID with feature- prefix", () => {
67
- const id = repo.generateId("Free Shipping");
68
- expect(id).toMatch(/^feature-/);
69
- });
70
- it("slugifies the label (spaces → hyphens, lowercase)", () => {
71
- const id = repo.generateId("Free Shipping");
72
- expect(id).toBe("feature-free-shipping");
73
- });
74
- it("does not double-prefix when label already starts with feature-", () => {
75
- const id = repo.generateId("feature-checkout");
76
- expect(id).toBe("feature-checkout");
77
- expect(id).not.toContain("feature-feature-");
78
- });
79
- it("strips special characters from label", () => {
80
- const id = repo.generateId("Fast & Reliable!");
81
- expect(id).not.toContain("&");
82
- expect(id).not.toContain("!");
83
- expect(id).toMatch(/^feature-/);
84
- });
85
- });
86
- // ---------------------------------------------------------------------------
87
- // create — scope validations
88
- // ---------------------------------------------------------------------------
89
- describe("ProductFeaturesRepository.create — scope validations", () => {
90
- it("throws ValidationError when scope=store and storeId is not provided", async () => {
91
- await expect(repo.create({
92
- label: "Custom Badge",
93
- description: "A store badge",
94
- icon: "star",
95
- scope: "store",
96
- productTypes: ["all"],
97
- displayOrder: 0,
98
- isActive: true,
99
- })).rejects.toThrow(ValidationError);
100
- });
101
- it("throws ValidationError when scope=platform and storeId is provided", async () => {
102
- await expect(repo.create({
103
- label: "Platform Badge",
104
- description: "A platform badge",
105
- icon: "award",
106
- scope: "platform",
107
- storeId: "store-pokemon-palace",
108
- productTypes: ["all"],
109
- displayOrder: 0,
110
- isActive: true,
111
- })).rejects.toThrow(ValidationError);
112
- });
113
- it("throws ValidationError when store feature count reaches MAX_STORE_CUSTOM_FEATURES", async () => {
114
- // countByStore will query and return snap with size = MAX_STORE_CUSTOM_FEATURES
115
- mockQuery.get.mockResolvedValue({ size: MAX_STORE_CUSTOM_FEATURES, docs: [], empty: false });
116
- await expect(repo.create({
117
- label: "One Too Many",
118
- description: "Exceeds limit",
119
- icon: "x",
120
- scope: "store",
121
- storeId: "store-pokemon-palace",
122
- productTypes: ["all"],
123
- displayOrder: 0,
124
- isActive: true,
125
- })).rejects.toThrow(ValidationError);
126
- });
127
- it("does NOT throw when store feature count is below MAX_STORE_CUSTOM_FEATURES", async () => {
128
- mockQuery.get.mockResolvedValue({ size: MAX_STORE_CUSTOM_FEATURES - 1, docs: [], empty: false });
129
- // After count check, doc().get() for findByIdOrFail
130
- mockDocRef.get.mockResolvedValue(makeSnap(makeFeatureDoc({ scope: "store", storeId: "store-1" }), "feature-custom-badge"));
131
- await expect(repo.create({
132
- label: "Custom Badge",
133
- description: "A store badge",
134
- icon: "star",
135
- scope: "store",
136
- storeId: "store-pokemon-palace",
137
- productTypes: ["all"],
138
- displayOrder: 0,
139
- isActive: true,
140
- })).resolves.toBeDefined();
141
- });
142
- it("platform scope with no storeId creates the feature successfully", async () => {
143
- mockDocRef.get.mockResolvedValue(makeSnap(makeFeatureDoc(), "feature-free-shipping"));
144
- await expect(repo.create({
145
- label: "Free Shipping",
146
- description: "Ships for free",
147
- icon: "truck",
148
- scope: "platform",
149
- productTypes: ["all"],
150
- displayOrder: 0,
151
- isActive: true,
152
- })).resolves.toBeDefined();
153
- });
154
- });
155
- // ---------------------------------------------------------------------------
156
- // create — field storage
157
- // ---------------------------------------------------------------------------
158
- describe("ProductFeaturesRepository.create — field storage", () => {
159
- it("uses generated ID from label as document ID", async () => {
160
- mockDocRef.get.mockResolvedValue(makeSnap(makeFeatureDoc(), "feature-fast-checkout"));
161
- await repo.create({
162
- label: "Fast Checkout",
163
- description: "Quick buy",
164
- icon: "zap",
165
- scope: "platform",
166
- productTypes: ["all"],
167
- displayOrder: 1,
168
- isActive: true,
169
- });
170
- expect(mockDocRef.set).toHaveBeenCalledWith(expect.objectContaining({ slug: "feature-fast-checkout" }));
171
- });
172
- it("sets createdAt and updatedAt timestamps", async () => {
173
- mockDocRef.get.mockResolvedValue(makeSnap(makeFeatureDoc(), "feature-fast-checkout"));
174
- await repo.create({
175
- label: "Fast Checkout",
176
- description: "Quick buy",
177
- icon: "zap",
178
- scope: "platform",
179
- productTypes: ["all"],
180
- displayOrder: 1,
181
- isActive: true,
182
- });
183
- const setArg = mockDocRef.set.mock.calls[0][0];
184
- expect(setArg.createdAt).toBeInstanceOf(Date);
185
- expect(setArg.updatedAt).toBeInstanceOf(Date);
186
- });
187
- });
188
- // ---------------------------------------------------------------------------
189
- // delete
190
- // ---------------------------------------------------------------------------
191
- describe("ProductFeaturesRepository.delete", () => {
192
- it("throws ValidationError when a product references the feature", async () => {
193
- // The where chain for the product reference check returns a non-empty snap
194
- mockQuery.get.mockResolvedValueOnce({ empty: false, size: 1, docs: [{ id: "prod-1" }] });
195
- await expect(repo.delete("feature-free-shipping")).rejects.toThrow(ValidationError);
196
- });
197
- it("deletes the feature when no product references it", async () => {
198
- mockQuery.get.mockResolvedValueOnce(makeQuerySnap([]));
199
- await expect(repo.delete("feature-free-shipping")).resolves.toBeUndefined();
200
- expect(mockDocRef.delete).toHaveBeenCalledOnce();
201
- });
202
- it("limits the product reference check to 1 document (efficiency)", async () => {
203
- mockQuery.get.mockResolvedValueOnce(makeQuerySnap([]));
204
- await repo.delete("feature-free-shipping");
205
- expect(mockQuery.limit).toHaveBeenCalledWith(1);
206
- });
207
- it("does not delete the feature when a product references it", async () => {
208
- mockQuery.get.mockResolvedValueOnce({ empty: false, size: 1, docs: [{ id: "prod-1" }] });
209
- try {
210
- await repo.delete("feature-free-shipping");
211
- }
212
- catch {
213
- // expected
214
- }
215
- expect(mockDocRef.delete).not.toHaveBeenCalled();
216
- });
217
- });
218
- // ---------------------------------------------------------------------------
219
- // countByStore
220
- // ---------------------------------------------------------------------------
221
- describe("ProductFeaturesRepository.countByStore", () => {
222
- it("returns snap.size as the count", async () => {
223
- mockQuery.get.mockResolvedValue({ size: 3, docs: [], empty: false });
224
- const count = await repo.countByStore("store-pokemon-palace");
225
- expect(count).toBe(3);
226
- });
227
- it("returns 0 when no store features exist", async () => {
228
- mockQuery.get.mockResolvedValue({ size: 0, docs: [], empty: true });
229
- const count = await repo.countByStore("store-no-features");
230
- expect(count).toBe(0);
231
- });
232
- it("filters by scope=store and storeId", async () => {
233
- mockQuery.get.mockResolvedValue({ size: 0, docs: [], empty: true });
234
- await repo.countByStore("store-pokemon-palace");
235
- expect(mockCollection.where).toHaveBeenCalledWith(expect.stringContaining("scope"), "==", "store");
236
- expect(mockQuery.where).toHaveBeenCalledWith(expect.stringContaining("storeId"), "==", "store-pokemon-palace");
237
- });
238
- });
239
- // ---------------------------------------------------------------------------
240
- // update
241
- // ---------------------------------------------------------------------------
242
- describe("ProductFeaturesRepository.update", () => {
243
- it("updates provided fields plus updatedAt", async () => {
244
- await repo.update("feature-free-shipping", { label: "Free Delivery", isActive: false });
245
- expect(mockDocRef.update).toHaveBeenCalledWith(expect.objectContaining({ label: "Free Delivery", isActive: false, updatedAt: expect.any(Date) }));
246
- });
247
- it("calls doc(id) to target the correct feature", async () => {
248
- await repo.update("feature-abc", { label: "Updated" });
249
- expect(mockCollection.doc).toHaveBeenCalledWith("feature-abc");
250
- });
251
- });
252
- // ---------------------------------------------------------------------------
253
- // listFiltered
254
- // ---------------------------------------------------------------------------
255
- describe("ProductFeaturesRepository.listFiltered", () => {
256
- it("applies scope filter when provided", async () => {
257
- mockQuery.get.mockResolvedValue(makeQuerySnap([]));
258
- await repo.listFiltered({ scope: "platform" });
259
- expect(mockCollection.where).toHaveBeenCalledWith(expect.stringContaining("scope"), "==", "platform");
260
- });
261
- it("applies storeId filter when provided", async () => {
262
- mockQuery.get.mockResolvedValue(makeQuerySnap([]));
263
- await repo.listFiltered({ storeId: "store-1" });
264
- expect(mockCollection.where).toHaveBeenCalledWith(expect.stringContaining("storeId"), "==", "store-1");
265
- });
266
- it("applies isActive filter when provided", async () => {
267
- mockQuery.get.mockResolvedValue(makeQuerySnap([]));
268
- await repo.listFiltered({ isActive: true });
269
- expect(mockCollection.where).toHaveBeenCalledWith("isActive", "==", true);
270
- });
271
- it("filters by productType in-memory (not Firestore)", async () => {
272
- const feature1 = makeFeatureDoc({ id: "f-1", productTypes: ["all"] });
273
- const feature2 = makeFeatureDoc({ id: "f-2", productTypes: ["product"] });
274
- const feature3 = makeFeatureDoc({ id: "f-3", productTypes: ["auction"] });
275
- // No Firestore filters applied for productType-only query → uses mockCollection.get
276
- mockCollection.get.mockResolvedValue(makeQuerySnap([
277
- { id: "f-1", data: feature1 },
278
- { id: "f-2", data: feature2 },
279
- { id: "f-3", data: feature3 },
280
- ]));
281
- const results = await repo.listFiltered({ productType: "product" });
282
- // "all" matches everything; "product" matches "product"; "auction" does NOT match "product"
283
- expect(results).toHaveLength(2);
284
- const ids = results.map((r) => r.id);
285
- expect(ids).toContain("f-1");
286
- expect(ids).toContain("f-2");
287
- expect(ids).not.toContain("f-3");
288
- });
289
- it("returns results sorted by displayOrder ascending", async () => {
290
- const features = [
291
- makeFeatureDoc({ id: "f-b", displayOrder: 2 }),
292
- makeFeatureDoc({ id: "f-a", displayOrder: 0 }),
293
- makeFeatureDoc({ id: "f-c", displayOrder: 5 }),
294
- ];
295
- // No Firestore filters → uses mockCollection.get
296
- mockCollection.get.mockResolvedValue(makeQuerySnap(features.map((f) => ({ id: f.id, data: f }))));
297
- const results = await repo.listFiltered({});
298
- expect(results[0].id).toBe("f-a");
299
- expect(results[1].id).toBe("f-b");
300
- expect(results[2].id).toBe("f-c");
301
- });
302
- it("returns empty array when no features match", async () => {
303
- mockQuery.get.mockResolvedValue(makeQuerySnap([]));
304
- const results = await repo.listFiltered({ scope: "store", storeId: "store-empty" });
305
- expect(results).toEqual([]);
306
- });
307
- });
308
- // ---------------------------------------------------------------------------
309
- // listPlatform
310
- // ---------------------------------------------------------------------------
311
- describe("ProductFeaturesRepository.listPlatform", () => {
312
- it("calls listFiltered with scope=platform and isActive=true", async () => {
313
- mockQuery.get.mockResolvedValue(makeQuerySnap([]));
314
- await repo.listPlatform();
315
- expect(mockCollection.where).toHaveBeenCalledWith(expect.stringContaining("scope"), "==", "platform");
316
- expect(mockCollection.where).toHaveBeenCalledWith("isActive", "==", true);
317
- });
318
- });
319
- // ---------------------------------------------------------------------------
320
- // listForStore
321
- // ---------------------------------------------------------------------------
322
- describe("ProductFeaturesRepository.listForStore", () => {
323
- it("calls listFiltered with scope=store, storeId, and isActive=true", async () => {
324
- mockQuery.get.mockResolvedValue(makeQuerySnap([]));
325
- await repo.listForStore("store-pokemon-palace");
326
- expect(mockCollection.where).toHaveBeenCalledWith(expect.stringContaining("storeId"), "==", "store-pokemon-palace");
327
- expect(mockCollection.where).toHaveBeenCalledWith("isActive", "==", true);
328
- });
329
- });