@mohasinac/appkit 4.13.1 → 4.15.0

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 (493) hide show
  1. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +14 -5
  2. package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +3 -0
  3. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +6 -0
  4. package/dist/_internal/client/features/lottery/LotteryDetailView.d.ts +8 -0
  5. package/dist/_internal/client/features/lottery/LotteryDetailView.js +4 -1
  6. package/dist/_internal/client/features/lottery/LotteryListView.d.ts +7 -0
  7. package/dist/_internal/client/features/lottery/LotteryListView.js +1 -1
  8. package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.js +4 -1
  9. package/dist/_internal/client/features/lottery/slot-collage-items.d.ts +15 -0
  10. package/dist/_internal/client/features/lottery/slot-collage-items.js +13 -0
  11. package/dist/_internal/server/features/auctions/actions.js +8 -2
  12. package/dist/_internal/server/features/bundles/data.d.ts +16 -0
  13. package/dist/_internal/server/features/bundles/data.js +26 -0
  14. package/dist/_internal/server/features/bundles/index.d.ts +1 -1
  15. package/dist/_internal/server/features/bundles/index.js +1 -1
  16. package/dist/_internal/server/features/cart/service.d.ts +3 -3
  17. package/dist/_internal/server/features/checkout/actions.js +25 -0
  18. package/dist/_internal/server/features/checkout/locked-lines.d.ts +38 -0
  19. package/dist/_internal/server/features/checkout/locked-lines.js +171 -0
  20. package/dist/_internal/server/features/checkout/source-context.d.ts +5 -0
  21. package/dist/_internal/server/features/checkout/source-context.js +157 -0
  22. package/dist/_internal/server/features/homepage/index.d.ts +0 -1
  23. package/dist/_internal/server/features/homepage/index.js +7 -1
  24. package/dist/_internal/server/features/lottery/adapters.js +4 -0
  25. package/dist/_internal/server/features/offers/adapters.d.ts +103 -0
  26. package/dist/_internal/server/features/offers/adapters.js +88 -0
  27. package/dist/_internal/server/features/offers/index.d.ts +2 -0
  28. package/dist/_internal/server/features/offers/index.js +1 -0
  29. package/dist/_internal/server/features/orders/adapters.js +24 -0
  30. package/dist/_internal/server/features/products/data.js +15 -37
  31. package/dist/_internal/server/features/products/index.d.ts +1 -1
  32. package/dist/_internal/server/features/products/index.js +1 -1
  33. package/dist/_internal/server/features/products/list-public.d.ts +46 -20
  34. package/dist/_internal/server/features/products/list-public.js +266 -90
  35. package/dist/_internal/server/features/products/listing-tab-counts.d.ts +44 -0
  36. package/dist/_internal/server/features/products/listing-tab-counts.js +97 -0
  37. package/dist/_internal/server/features/site-settings/adapters.d.ts +51 -0
  38. package/dist/_internal/server/features/site-settings/adapters.js +75 -0
  39. package/dist/_internal/server/features/site-settings/index.d.ts +1 -0
  40. package/dist/_internal/server/features/site-settings/index.js +1 -0
  41. package/dist/_internal/server/features/stores/adapters.d.ts +56 -0
  42. package/dist/_internal/server/features/stores/adapters.js +91 -0
  43. package/dist/_internal/server/features/stores/index.d.ts +1 -0
  44. package/dist/_internal/server/features/stores/index.js +1 -0
  45. package/dist/_internal/server/jobs/core/auctionSettlement.js +56 -2
  46. package/dist/_internal/server/jobs/core/offerExpiry.js +55 -19
  47. package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.d.ts +5 -0
  48. package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.js +33 -1
  49. package/dist/_internal/server/jobs/handlers/messages.d.ts +7 -0
  50. package/dist/_internal/server/jobs/handlers/messages.js +10 -0
  51. package/dist/_internal/shared/actions/action-registry.js +17 -1
  52. package/dist/_internal/shared/checkout/lanes.d.ts +25 -0
  53. package/dist/_internal/shared/checkout/lanes.js +26 -0
  54. package/dist/_internal/shared/features/auctions/config.d.ts +27 -0
  55. package/dist/_internal/shared/features/auctions/config.js +27 -0
  56. package/dist/_internal/shared/features/auctions/schema.d.ts +14 -2
  57. package/dist/_internal/shared/features/auctions/schema.js +13 -1
  58. package/dist/_internal/shared/features/blog/schema.d.ts +2 -2
  59. package/dist/_internal/shared/features/cart/schema.d.ts +20 -15
  60. package/dist/_internal/shared/features/cart/schema.js +15 -0
  61. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +32 -32
  62. package/dist/_internal/shared/features/emi/schedule.d.ts +24 -3
  63. package/dist/_internal/shared/features/emi/schedule.js +20 -5
  64. package/dist/_internal/shared/features/events/schema.d.ts +2 -2
  65. package/dist/_internal/shared/features/homepage/section-gate.d.ts +14 -0
  66. package/dist/_internal/shared/features/homepage/section-gate.js +51 -0
  67. package/dist/_internal/shared/features/offers/config.d.ts +30 -0
  68. package/dist/_internal/shared/features/offers/config.js +59 -0
  69. package/dist/_internal/shared/features/orders/schema.d.ts +8 -8
  70. package/dist/_internal/shared/features/products/schema.d.ts +30 -30
  71. package/dist/_internal/shared/features/products/to-product-item.js +6 -0
  72. package/dist/_internal/shared/features/reviews/schema.d.ts +2 -2
  73. package/dist/_internal/shared/features/site-settings/fees.d.ts +60 -0
  74. package/dist/_internal/shared/features/site-settings/fees.js +39 -0
  75. package/dist/_internal/shared/features/site-settings/types.d.ts +40 -0
  76. package/dist/_internal/shared/features/site-settings/types.js +1 -0
  77. package/dist/_internal/shared/history/history.d.ts +88 -0
  78. package/dist/_internal/shared/history/history.js +198 -0
  79. package/dist/_internal/shared/history/index.d.ts +4 -0
  80. package/dist/_internal/shared/history/index.js +2 -0
  81. package/dist/_internal/shared/history/types.d.ts +61 -0
  82. package/dist/_internal/shared/history/types.js +6 -0
  83. package/dist/_internal/shared/listing-types/_registry.d.ts +54 -1
  84. package/dist/_internal/shared/listing-types/_registry.js +67 -0
  85. package/dist/_internal/shared/listing-types/art/config.d.ts +3 -0
  86. package/dist/_internal/shared/listing-types/art/config.js +5 -0
  87. package/dist/_internal/shared/listing-types/auction/config.d.ts +13 -0
  88. package/dist/_internal/shared/listing-types/auction/config.js +21 -0
  89. package/dist/_internal/shared/listing-types/availability.d.ts +79 -0
  90. package/dist/_internal/shared/listing-types/availability.js +104 -0
  91. package/dist/_internal/shared/listing-types/capabilities.d.ts +15 -0
  92. package/dist/_internal/shared/listing-types/capabilities.js +12 -0
  93. package/dist/_internal/shared/listing-types/classified/config.d.ts +3 -0
  94. package/dist/_internal/shared/listing-types/classified/config.js +5 -0
  95. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +11 -0
  96. package/dist/_internal/shared/listing-types/digital-code/config.js +22 -2
  97. package/dist/_internal/shared/listing-types/live/config.d.ts +3 -0
  98. package/dist/_internal/shared/listing-types/live/config.js +5 -0
  99. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +3 -0
  100. package/dist/_internal/shared/listing-types/pre-order/config.js +19 -0
  101. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +11 -0
  102. package/dist/_internal/shared/listing-types/prize-draw/config.js +15 -0
  103. package/dist/_internal/shared/listing-types/standard/config.d.ts +3 -0
  104. package/dist/_internal/shared/listing-types/standard/config.js +5 -0
  105. package/dist/_internal/shared/listing-types/stickers/config.d.ts +3 -0
  106. package/dist/_internal/shared/listing-types/stickers/config.js +5 -0
  107. package/dist/client.d.ts +20 -7
  108. package/dist/client.js +22 -4
  109. package/dist/constants/api-endpoints.d.ts +6 -0
  110. package/dist/constants/api-endpoints.js +2 -0
  111. package/dist/constants/field-names.d.ts +57 -8
  112. package/dist/constants/field-names.js +101 -8
  113. package/dist/constants/table-keys.d.ts +17 -0
  114. package/dist/constants/table-keys.js +17 -0
  115. package/dist/errors/error-codes.d.ts +13 -1
  116. package/dist/errors/error-codes.js +13 -1
  117. package/dist/errors/error-display-map.js +12 -3
  118. package/dist/errors/messages.d.ts +10 -2
  119. package/dist/errors/messages.js +10 -2
  120. package/dist/features/about/components/AboutView.d.ts +3 -0
  121. package/dist/features/about/components/AboutView.js +3 -2
  122. package/dist/features/about/components/PolicyPageView.d.ts +2 -1
  123. package/dist/features/about/components/PolicyPageView.js +61 -23
  124. package/dist/features/about/components/PublicProfileView.js +5 -0
  125. package/dist/features/about/schemas/firestore.d.ts +3 -0
  126. package/dist/features/account/components/UserBidsView.js +12 -4
  127. package/dist/features/account/components/UserOrdersView.js +7 -0
  128. package/dist/features/account/components/UserReturnsView.d.ts +3 -0
  129. package/dist/features/account/components/UserReturnsView.js +17 -1
  130. package/dist/features/account/components/index.d.ts +0 -2
  131. package/dist/features/account/components/index.js +0 -1
  132. package/dist/features/account/schemas/index.d.ts +2 -2
  133. package/dist/features/account/types/index.d.ts +21 -2
  134. package/dist/features/addresses/schemas/index.d.ts +4 -4
  135. package/dist/features/admin/components/AdminArtView.js +8 -3
  136. package/dist/features/admin/components/AdminAuditLogView.js +1 -0
  137. package/dist/features/admin/components/AdminBidsView.js +15 -2
  138. package/dist/features/admin/components/AdminBlogEditorView.js +65 -33
  139. package/dist/features/admin/components/AdminClassifiedView.js +8 -3
  140. package/dist/features/admin/components/AdminDigitalCodesView.js +8 -3
  141. package/dist/features/admin/components/AdminFeatureEditorView.js +35 -6
  142. package/dist/features/admin/components/AdminFeatureFlagsView.js +1 -0
  143. package/dist/features/admin/components/AdminLiveView.js +8 -3
  144. package/dist/features/admin/components/AdminNavEditorView.js +15 -5
  145. package/dist/features/admin/components/AdminNewsletterView.js +18 -2
  146. package/dist/features/admin/components/AdminOffersView.d.ts +4 -0
  147. package/dist/features/admin/components/AdminOffersView.js +230 -0
  148. package/dist/features/admin/components/AdminOrdersView.js +10 -1
  149. package/dist/features/admin/components/AdminPaymentMethodsView.js +24 -4
  150. package/dist/features/admin/components/AdminPrizeDrawsView.js +5 -0
  151. package/dist/features/admin/components/AdminProductsView.js +16 -29
  152. package/dist/features/admin/components/AdminScammerEditorView.d.ts +2 -1
  153. package/dist/features/admin/components/AdminScammerEditorView.js +3 -13
  154. package/dist/features/admin/components/AdminScammersView.js +3 -8
  155. package/dist/features/admin/components/AdminSectionsView.js +32 -23
  156. package/dist/features/admin/components/AdminSessionsView.js +17 -2
  157. package/dist/features/admin/components/AdminSiteSettingsView.js +31 -13
  158. package/dist/features/admin/components/AdminSiteView.js +6 -2
  159. package/dist/features/admin/components/AdminStickersView.js +8 -3
  160. package/dist/features/admin/components/ViewAuditLogEntryModal.js +1 -0
  161. package/dist/features/admin/components/index.d.ts +2 -0
  162. package/dist/features/admin/components/index.js +1 -0
  163. package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +4 -2
  164. package/dist/features/admin/components/sections/adminSectionsTypes.js +45 -27
  165. package/dist/features/admin/constants/filter-tabs.d.ts +89 -0
  166. package/dist/features/admin/constants/filter-tabs.js +56 -0
  167. package/dist/features/admin/schemas/firestore.d.ts +122 -3
  168. package/dist/features/admin/schemas/firestore.js +1 -0
  169. package/dist/features/admin/schemas/homepage-section-form.d.ts +22 -0
  170. package/dist/features/admin/schemas/homepage-section-form.js +68 -0
  171. package/dist/features/admin/schemas/nav-item-form.d.ts +74 -0
  172. package/dist/features/admin/schemas/nav-item-form.js +72 -0
  173. package/dist/features/auctions/actions/bid-actions.d.ts +20 -5
  174. package/dist/features/auctions/actions/bid-actions.js +93 -20
  175. package/dist/features/auctions/components/AuctionBidsTable.d.ts +10 -1
  176. package/dist/features/auctions/components/AuctionBidsTable.js +22 -4
  177. package/dist/features/auctions/components/AuctionDetailPageView.js +11 -6
  178. package/dist/features/auctions/components/AuctionsListView.js +5 -6
  179. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +7 -0
  180. package/dist/features/auctions/components/MarketplaceAuctionCard.js +19 -2
  181. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +1 -2
  182. package/dist/features/auctions/components/PlaceBidFormClient.js +8 -4
  183. package/dist/features/auctions/components/bid-detail-fields.d.ts +29 -0
  184. package/dist/features/auctions/components/bid-detail-fields.js +103 -0
  185. package/dist/features/auctions/repository/bid.repository.d.ts +13 -0
  186. package/dist/features/auctions/repository/bid.repository.js +23 -0
  187. package/dist/features/auctions/schemas/firestore.d.ts +17 -0
  188. package/dist/features/auctions/schemas/index.d.ts +12 -12
  189. package/dist/features/audit-log/schemas/firestore.d.ts +14 -0
  190. package/dist/features/audit-log/schemas/firestore.js +7 -0
  191. package/dist/features/auth/permissions/constants.d.ts +1 -1
  192. package/dist/features/auth/permissions/constants.js +10 -1
  193. package/dist/features/blog/actions/blog-actions.d.ts +7 -7
  194. package/dist/features/blog/schemas/blog-form.d.ts +80 -0
  195. package/dist/features/blog/schemas/blog-form.js +100 -0
  196. package/dist/features/blog/schemas/index.d.ts +6 -6
  197. package/dist/features/cart/repository/cart.repository.js +1 -0
  198. package/dist/features/cart/schemas/firestore.d.ts +15 -0
  199. package/dist/features/catalogue/schemas/validation.d.ts +4 -4
  200. package/dist/features/categories/components/BrandDetailPageView.js +23 -40
  201. package/dist/features/categories/components/BrandDetailTabs.d.ts +7 -7
  202. package/dist/features/categories/components/BrandDetailTabs.js +8 -12
  203. package/dist/features/categories/components/BundleCollage.js +1 -1
  204. package/dist/features/categories/components/CategoryDetailPageView.js +53 -57
  205. package/dist/features/categories/components/CategoryDetailTabs.d.ts +10 -8
  206. package/dist/features/categories/components/CategoryDetailTabs.js +11 -16
  207. package/dist/features/categories/components/CategoryProductsListing.js +11 -1
  208. package/dist/features/categories/components/ConcernCard.js +7 -1
  209. package/dist/features/categories/schemas/firestore.d.ts +13 -0
  210. package/dist/features/categories/schemas/index.d.ts +26 -26
  211. package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +16 -1
  212. package/dist/features/classified/components/ClassifiedDetailPageView.js +23 -3
  213. package/dist/features/events/components/AdminEventEditorView.js +32 -54
  214. package/dist/features/events/components/AdminEventEntriesView.js +22 -3
  215. package/dist/features/events/components/AdminEventsView.js +15 -11
  216. package/dist/features/events/components/EventFilters.d.ts +9 -1
  217. package/dist/features/events/components/EventFilters.js +45 -21
  218. package/dist/features/events/components/EventsIndexListing.d.ts +6 -1
  219. package/dist/features/events/components/EventsIndexListing.js +2 -2
  220. package/dist/features/events/components/EventsListPageView.js +13 -4
  221. package/dist/features/events/repository/events.repository.d.ts +17 -0
  222. package/dist/features/events/repository/events.repository.js +27 -0
  223. package/dist/features/events/schemas/event-form.d.ts +113 -0
  224. package/dist/features/events/schemas/event-form.js +82 -0
  225. package/dist/features/events/schemas/firestore.d.ts +12 -0
  226. package/dist/features/events/schemas/firestore.js +12 -0
  227. package/dist/features/events/schemas/index.d.ts +50 -50
  228. package/dist/features/events/types/index.d.ts +11 -0
  229. package/dist/features/events/types/index.js +57 -1
  230. package/dist/features/faq/actions/faq-actions.d.ts +12 -12
  231. package/dist/features/faq/schemas/index.d.ts +8 -8
  232. package/dist/features/filters/FilterFacetSection.d.ts +7 -1
  233. package/dist/features/filters/FilterFacetSection.js +11 -3
  234. package/dist/features/grouped/schemas/grouped-listing-form.d.ts +101 -0
  235. package/dist/features/grouped/schemas/grouped-listing-form.js +89 -0
  236. package/dist/features/grouped/schemas/index.d.ts +4 -4
  237. package/dist/features/homepage/actions/homepage-section-actions.d.ts +11 -3
  238. package/dist/features/homepage/actions/homepage-section-actions.js +33 -1
  239. package/dist/features/homepage/components/AnnouncementBar.d.ts +7 -1
  240. package/dist/features/homepage/components/AnnouncementBar.js +3 -3
  241. package/dist/features/homepage/components/MarketplaceHomepageView.js +20 -6
  242. package/dist/features/homepage/hooks/homepage-query.d.ts +16 -0
  243. package/dist/features/homepage/hooks/homepage-query.js +45 -0
  244. package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +10 -0
  245. package/dist/features/homepage/hooks/useFeaturedAuctions.js +28 -8
  246. package/dist/features/homepage/hooks/useFeaturedPreOrders.js +17 -8
  247. package/dist/features/homepage/hooks/useFeaturedProducts.js +15 -8
  248. package/dist/features/homepage/schemas/index.d.ts +33 -2
  249. package/dist/features/homepage/schemas/index.js +24 -0
  250. package/dist/features/layout/AppLayoutShell.d.ts +11 -1
  251. package/dist/features/layout/AppLayoutShell.js +15 -14
  252. package/dist/features/layout/BackToTop.d.ts +9 -0
  253. package/dist/features/layout/BackToTop.js +10 -1
  254. package/dist/features/layout/BottomActions.js +28 -25
  255. package/dist/features/layout/BottomChrome.d.ts +34 -0
  256. package/dist/features/layout/BottomChrome.js +55 -0
  257. package/dist/features/layout/BottomNavLayout.d.ts +6 -0
  258. package/dist/features/layout/BottomNavLayout.js +7 -1
  259. package/dist/features/layout/BottomNavbar.js +15 -2
  260. package/dist/features/layout/FooterLayout.js +11 -1
  261. package/dist/features/layout/NavbarLayout.js +1 -1
  262. package/dist/features/layout/TitleBarLayout.d.ts +7 -0
  263. package/dist/features/layout/TitleBarLayout.js +28 -5
  264. package/dist/features/layout/index.d.ts +2 -0
  265. package/dist/features/layout/index.js +1 -0
  266. package/dist/features/lottery/types/index.d.ts +3 -0
  267. package/dist/features/media/MediaPickerModal.js +5 -1
  268. package/dist/features/messages/schemas/index.d.ts +2 -2
  269. package/dist/features/orders/components/OrderScopeTabs.d.ts +20 -0
  270. package/dist/features/orders/components/OrderScopeTabs.js +31 -0
  271. package/dist/features/orders/components/OrderStatusTimeline.d.ts +5 -1
  272. package/dist/features/orders/components/OrderStatusTimeline.js +39 -20
  273. package/dist/features/orders/constants/order-scope.d.ts +48 -0
  274. package/dist/features/orders/constants/order-scope.js +111 -0
  275. package/dist/features/orders/repository/orders.repository.d.ts +54 -7
  276. package/dist/features/orders/repository/orders.repository.js +121 -22
  277. package/dist/features/orders/schemas/firestore.d.ts +152 -0
  278. package/dist/features/orders/schemas/firestore.js +30 -0
  279. package/dist/features/orders/schemas/index.d.ts +18 -18
  280. package/dist/features/orders/types/index.d.ts +35 -7
  281. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +14 -9
  282. package/dist/features/pre-orders/components/PreOrdersListView.js +6 -5
  283. package/dist/features/pre-orders/schemas/index.d.ts +1 -1
  284. package/dist/features/products/actions/product-actions.d.ts +14 -0
  285. package/dist/features/products/actions/product-actions.js +49 -11
  286. package/dist/features/products/api/route.d.ts +12 -0
  287. package/dist/features/products/api/route.js +42 -100
  288. package/dist/features/products/components/ArtStickersListView.js +2 -2
  289. package/dist/features/products/components/AuctionsIndexListing.js +13 -11
  290. package/dist/features/products/components/AvailabilityTabs.d.ts +11 -0
  291. package/dist/features/products/components/AvailabilityTabs.js +47 -0
  292. package/dist/features/products/components/GroupSettingsPanel.js +5 -1
  293. package/dist/features/products/components/MakeOfferButton.js +48 -49
  294. package/dist/features/products/components/PrizeDrawCollage.d.ts +20 -4
  295. package/dist/features/products/components/PrizeDrawCollage.js +9 -1
  296. package/dist/features/products/components/PrizeDrawsIndexListing.js +14 -12
  297. package/dist/features/products/components/PrizeDrawsListingView.js +2 -2
  298. package/dist/features/products/components/PrizeDrawsSection.d.ts +7 -1
  299. package/dist/features/products/components/PrizeDrawsSection.js +23 -18
  300. package/dist/features/products/components/ProductDetailPageView.d.ts +4 -1
  301. package/dist/features/products/components/ProductDetailPageView.js +18 -4
  302. package/dist/features/products/components/ProductForm.js +5 -2
  303. package/dist/features/products/components/ProductGrid.js +6 -1
  304. package/dist/features/products/components/ProductsIndexListing.js +22 -32
  305. package/dist/features/products/components/ProductsIndexPageView.js +6 -9
  306. package/dist/features/products/components/index.d.ts +2 -2
  307. package/dist/features/products/components/index.js +1 -1
  308. package/dist/features/products/config/listing-type-listing-config.d.ts +20 -0
  309. package/dist/features/products/config/listing-type-listing-config.js +22 -10
  310. package/dist/features/products/constants/action-defs.d.ts +2 -0
  311. package/dist/features/products/constants/action-defs.js +6 -0
  312. package/dist/features/products/hooks/useAvailabilityScope.d.ts +13 -0
  313. package/dist/features/products/hooks/useAvailabilityScope.js +19 -0
  314. package/dist/features/products/hooks/useProducts.d.ts +5 -0
  315. package/dist/features/products/hooks/useProducts.js +13 -2
  316. package/dist/features/products/repository/products.repository.d.ts +31 -2
  317. package/dist/features/products/repository/products.repository.js +53 -21
  318. package/dist/features/products/schemas/firestore.d.ts +17 -3
  319. package/dist/features/products/schemas/firestore.js +7 -2
  320. package/dist/features/products/schemas/index.d.ts +64 -64
  321. package/dist/features/products/schemas/product-features.validators.d.ts +79 -6
  322. package/dist/features/products/schemas/product-features.validators.js +63 -0
  323. package/dist/features/products/types/index.d.ts +16 -1
  324. package/dist/features/promotions/schemas/index.d.ts +2 -2
  325. package/dist/features/reviews/schemas/index.d.ts +16 -16
  326. package/dist/features/scams/constants/scammer-status-display.d.ts +28 -0
  327. package/dist/features/scams/constants/scammer-status-display.js +79 -0
  328. package/dist/features/search/schemas/index.d.ts +4 -4
  329. package/dist/features/seller/actions/offer-actions.js +57 -4
  330. package/dist/features/seller/components/OfferPhaseTimeline.d.ts +59 -0
  331. package/dist/features/seller/components/OfferPhaseTimeline.js +107 -0
  332. package/dist/features/seller/components/SellerArtView.js +5 -0
  333. package/dist/features/seller/components/SellerAuctionsView.js +13 -15
  334. package/dist/features/seller/components/SellerBidsView.js +11 -4
  335. package/dist/features/seller/components/SellerClassifiedView.js +5 -0
  336. package/dist/features/seller/components/SellerCouponEditorView.js +17 -17
  337. package/dist/features/seller/components/SellerDigitalCodesView.js +5 -0
  338. package/dist/features/seller/components/SellerLiveView.js +5 -0
  339. package/dist/features/seller/components/SellerOffersView.js +2 -1
  340. package/dist/features/seller/components/SellerOrdersView.js +31 -9
  341. package/dist/features/seller/components/SellerPayoutSettingsView.js +56 -31
  342. package/dist/features/seller/components/SellerPreOrdersView.js +5 -0
  343. package/dist/features/seller/components/SellerPrizeDrawsView.js +14 -16
  344. package/dist/features/seller/components/SellerProductShell.js +7 -1
  345. package/dist/features/seller/components/SellerProductsView.js +11 -8
  346. package/dist/features/seller/components/SellerStickersView.js +5 -0
  347. package/dist/features/seller/components/index.d.ts +0 -2
  348. package/dist/features/seller/components/index.js +0 -1
  349. package/dist/features/seller/repository/offer.repository.d.ts +142 -24
  350. package/dist/features/seller/repository/offer.repository.js +165 -26
  351. package/dist/features/seller/schemas/coupon-form.d.ts +72 -0
  352. package/dist/features/seller/schemas/coupon-form.js +116 -0
  353. package/dist/features/seller/schemas/firestore.d.ts +56 -2
  354. package/dist/features/seller/schemas/firestore.js +27 -0
  355. package/dist/features/seller/schemas/index.d.ts +2 -2
  356. package/dist/features/seller/schemas/offer-forms.d.ts +46 -0
  357. package/dist/features/seller/schemas/offer-forms.js +42 -0
  358. package/dist/features/seller/server.d.ts +0 -1
  359. package/dist/features/seller/server.js +0 -1
  360. package/dist/features/shell/SectionForm.d.ts +99 -0
  361. package/dist/features/shell/SectionForm.js +128 -0
  362. package/dist/features/shell/build-sections.d.ts +63 -0
  363. package/dist/features/shell/build-sections.js +207 -0
  364. package/dist/features/shell/entity-form.d.ts +109 -0
  365. package/dist/features/shell/entity-form.js +96 -0
  366. package/dist/features/shell/field-ui-meta.d.ts +115 -0
  367. package/dist/features/shell/field-ui-meta.js +324 -0
  368. package/dist/features/shell/index.d.ts +8 -0
  369. package/dist/features/shell/index.js +4 -0
  370. package/dist/features/status-history/components/StatusTimeline.d.ts +74 -0
  371. package/dist/features/status-history/components/StatusTimeline.js +46 -0
  372. package/dist/features/status-history/index.d.ts +11 -0
  373. package/dist/features/status-history/index.js +10 -0
  374. package/dist/features/store-extensions/components/ReviewDecisionModal.d.ts +27 -0
  375. package/dist/features/store-extensions/components/ReviewDecisionModal.js +82 -0
  376. package/dist/features/store-extensions/index.d.ts +12 -0
  377. package/dist/features/store-extensions/index.js +12 -0
  378. package/dist/features/store-extensions/schemas/admin-notification-form.d.ts +36 -0
  379. package/dist/features/store-extensions/schemas/admin-notification-form.js +114 -0
  380. package/dist/features/store-extensions/schemas/analytics-forms.d.ts +57 -0
  381. package/dist/features/store-extensions/schemas/analytics-forms.js +158 -0
  382. package/dist/features/store-extensions/schemas/custom-role-form.d.ts +85 -0
  383. package/dist/features/store-extensions/schemas/custom-role-form.js +118 -0
  384. package/dist/features/store-extensions/schemas/firestore.d.ts +21 -1
  385. package/dist/features/store-extensions/schemas/firestore.js +60 -0
  386. package/dist/features/store-extensions/schemas/google-config-form.d.ts +53 -0
  387. package/dist/features/store-extensions/schemas/google-config-form.js +105 -0
  388. package/dist/features/store-extensions/schemas/item-request-create-form.d.ts +28 -0
  389. package/dist/features/store-extensions/schemas/item-request-create-form.js +80 -0
  390. package/dist/features/store-extensions/schemas/listing-template-form.d.ts +78 -0
  391. package/dist/features/store-extensions/schemas/listing-template-form.js +87 -0
  392. package/dist/features/store-extensions/schemas/moderation-review-form.d.ts +49 -0
  393. package/dist/features/store-extensions/schemas/moderation-review-form.js +101 -0
  394. package/dist/features/store-extensions/schemas/payout-method-form.d.ts +153 -0
  395. package/dist/features/store-extensions/schemas/payout-method-form.js +155 -0
  396. package/dist/features/store-extensions/schemas/report-create-form.d.ts +25 -0
  397. package/dist/features/store-extensions/schemas/report-create-form.js +79 -0
  398. package/dist/features/store-extensions/schemas/report-review-form.d.ts +47 -0
  399. package/dist/features/store-extensions/schemas/report-review-form.js +111 -0
  400. package/dist/features/store-extensions/schemas/shipping-config-form.d.ts +148 -0
  401. package/dist/features/store-extensions/schemas/shipping-config-form.js +104 -0
  402. package/dist/features/store-extensions/schemas/store-category-form.d.ts +54 -0
  403. package/dist/features/store-extensions/schemas/store-category-form.js +73 -0
  404. package/dist/features/stores/api/[storeSlug]/route.js +2 -25
  405. package/dist/features/stores/components/StoreAuctionsListing.js +15 -1
  406. package/dist/features/stores/components/StoreClassifiedsListing.js +12 -2
  407. package/dist/features/stores/components/StoreDetailLayoutView.js +24 -71
  408. package/dist/features/stores/components/StoreDigitalCodesListing.js +12 -2
  409. package/dist/features/stores/components/StoreLiveItemsListing.js +12 -2
  410. package/dist/features/stores/components/StorePreOrdersListing.js +12 -1
  411. package/dist/features/stores/components/StoreProductsListing.js +11 -1
  412. package/dist/features/stores/repository/store.repository.js +6 -0
  413. package/dist/features/stores/schemas/index.d.ts +6 -6
  414. package/dist/features/support/schemas/index.d.ts +4 -4
  415. package/dist/features/tester/actions/checklist-item-actions.d.ts +4 -4
  416. package/dist/features/tester/seed-data/offers-tester-seed-data.js +119 -3
  417. package/dist/features/tester/seed-data/products-tester-seed-data.js +131 -1
  418. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +431 -1
  419. package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
  420. package/dist/index.d.ts +25 -12
  421. package/dist/index.js +26 -11
  422. package/dist/next/routing/route-map.d.ts +23 -3
  423. package/dist/next/routing/route-map.js +14 -2
  424. package/dist/providers/db-firebase/base.repository.d.ts +30 -0
  425. package/dist/providers/db-firebase/base.repository.js +50 -1
  426. package/dist/providers/db-firebase/index.d.ts +1 -1
  427. package/dist/providers/db-firebase/index.js +1 -1
  428. package/dist/providers/db-firebase/sieve.d.ts +25 -0
  429. package/dist/providers/db-firebase/sieve.js +52 -18
  430. package/dist/react/hooks/useUrlTable.js +10 -1
  431. package/dist/schemas/firestore-value.d.ts +8 -0
  432. package/dist/schemas/firestore-value.js +44 -0
  433. package/dist/schemas/index.d.ts +1 -1
  434. package/dist/schemas/index.js +1 -1
  435. package/dist/schemas/registry.d.ts +702 -69
  436. package/dist/schemas/registry.js +64 -1
  437. package/dist/seed/_helpers/category-forest.d.ts +2 -0
  438. package/dist/seed/_helpers/category-forest.js +309 -0
  439. package/dist/seed/_helpers/category-tree.d.ts +27 -0
  440. package/dist/seed/_helpers/category-tree.js +103 -0
  441. package/dist/seed/bids-seed-data.js +30 -0
  442. package/dist/seed/catalogue-seed-data.js +12 -12
  443. package/dist/seed/categories-seed-data.js +177 -162
  444. package/dist/seed/events-seed-data.js +61 -10
  445. package/dist/seed/homepage-sections-seed-data.js +5 -1
  446. package/dist/seed/offers-seed-data.js +244 -34
  447. package/dist/seed/orders-seed-data.js +336 -1
  448. package/dist/seed/products-art-seed-data.js +50 -12
  449. package/dist/seed/products-auctions-seed-data.js +138 -18
  450. package/dist/seed/products-classifieds-seed-data.js +80 -16
  451. package/dist/seed/products-digital-codes-seed-data.js +66 -18
  452. package/dist/seed/products-live-items-seed-data.js +64 -13
  453. package/dist/seed/products-preorders-seed-data.d.ts +0 -1
  454. package/dist/seed/products-preorders-seed-data.js +52 -13
  455. package/dist/seed/products-prize-draws-seed-data.js +63 -14
  456. package/dist/seed/products-standard-seed-data.js +99 -26
  457. package/dist/seed/products-stickers-seed-data.js +47 -12
  458. package/dist/seed/reviews-seed-data.js +6 -1
  459. package/dist/seed/site-settings-seed-data.d.ts +1 -38
  460. package/dist/seed/site-settings-seed-data.js +38 -76
  461. package/dist/seed/stores-seed-data.js +71 -1
  462. package/dist/seed/users-seed-data.js +15 -5
  463. package/dist/server-entry.d.ts +1 -2
  464. package/dist/server-entry.js +4 -3
  465. package/dist/server.d.ts +6 -3
  466. package/dist/server.js +13 -4
  467. package/dist/styles.css +78 -12
  468. package/dist/tailwind-utilities.css +1 -1
  469. package/dist/ui/components/Button.style.css +19 -4
  470. package/dist/ui/components/CollapsibleSection.d.ts +17 -1
  471. package/dist/ui/components/CollapsibleSection.js +6 -2
  472. package/dist/ui/components/FilterChipGroup.d.ts +25 -1
  473. package/dist/ui/components/FilterChipGroup.js +21 -4
  474. package/dist/ui/components/HandMode.style.css +47 -0
  475. package/dist/ui/components/Layout.d.ts +9 -2
  476. package/dist/ui/components/Layout.js +1 -1
  477. package/dist/ui/components/ListingLayout.js +8 -8
  478. package/dist/ui/components/ListingLayout.style.css +8 -7
  479. package/dist/ui/components/RecordDetailModal.d.ts +10 -1
  480. package/dist/ui/components/RecordDetailModal.js +2 -2
  481. package/dist/ui/components/StickyToolbar.d.ts +3 -1
  482. package/dist/ui/components/StickyToolbar.js +62 -20
  483. package/dist/ui/components/bottom-chrome-slot.d.ts +21 -0
  484. package/dist/ui/components/bottom-chrome-slot.js +29 -0
  485. package/dist/ui/components/index.style.css +3 -0
  486. package/dist/ui/forms/FormShell.d.ts +43 -13
  487. package/dist/ui/forms/FormShell.js +22 -11
  488. package/dist/ui/forms/index.d.ts +1 -1
  489. package/dist/ui/index.d.ts +1 -1
  490. package/package.json +2 -1
  491. package/scripts/node-esm-loader.mjs +65 -0
  492. package/scripts/seed-cli-loader.mjs +6 -49
  493. package/scripts/seed-cli.mjs +1 -1
@@ -0,0 +1,153 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
4
+ * by schema instance and every zod wrapper returns a new one.
5
+ */
6
+ export declare const payoutMethodFormSchema: z.ZodEffects<z.ZodObject<{
7
+ type: z.ZodEnum<["upi", "bank", "card", "other"]>;
8
+ label: z.ZodString;
9
+ upiVpa: z.ZodOptional<z.ZodString>;
10
+ accountHolderName: z.ZodOptional<z.ZodString>;
11
+ accountNumber: z.ZodOptional<z.ZodString>;
12
+ ifscCode: z.ZodOptional<z.ZodString>;
13
+ bankName: z.ZodOptional<z.ZodString>;
14
+ isDefault: z.ZodBoolean;
15
+ isActive: z.ZodBoolean;
16
+ }, "strip", z.ZodTypeAny, {
17
+ type: "card" | "other" | "upi" | "bank";
18
+ label: string;
19
+ isDefault: boolean;
20
+ isActive: boolean;
21
+ accountHolderName?: string | undefined;
22
+ ifscCode?: string | undefined;
23
+ bankName?: string | undefined;
24
+ accountNumber?: string | undefined;
25
+ upiVpa?: string | undefined;
26
+ }, {
27
+ type: "card" | "other" | "upi" | "bank";
28
+ label: string;
29
+ isDefault: boolean;
30
+ isActive: boolean;
31
+ accountHolderName?: string | undefined;
32
+ ifscCode?: string | undefined;
33
+ bankName?: string | undefined;
34
+ accountNumber?: string | undefined;
35
+ upiVpa?: string | undefined;
36
+ }>, {
37
+ type: "card" | "other" | "upi" | "bank";
38
+ label: string;
39
+ isDefault: boolean;
40
+ isActive: boolean;
41
+ accountHolderName?: string | undefined;
42
+ ifscCode?: string | undefined;
43
+ bankName?: string | undefined;
44
+ accountNumber?: string | undefined;
45
+ upiVpa?: string | undefined;
46
+ }, {
47
+ type: "card" | "other" | "upi" | "bank";
48
+ label: string;
49
+ isDefault: boolean;
50
+ isActive: boolean;
51
+ accountHolderName?: string | undefined;
52
+ ifscCode?: string | undefined;
53
+ bankName?: string | undefined;
54
+ accountNumber?: string | undefined;
55
+ upiVpa?: string | undefined;
56
+ }>;
57
+ export type PayoutMethodFormValues = z.infer<typeof payoutMethodFormSchema>;
58
+ /**
59
+ * Create contract. `sellerId`/`storeId` are absent on purpose — the route sets
60
+ * both from the session, so a caller cannot file a payout method against
61
+ * another seller by adding fields to the body.
62
+ */
63
+ export declare const payoutMethodCreateSchema: z.ZodEffects<z.ZodObject<{
64
+ type: z.ZodEnum<["upi", "bank", "card", "other"]>;
65
+ label: z.ZodString;
66
+ upiVpa: z.ZodOptional<z.ZodString>;
67
+ accountHolderName: z.ZodOptional<z.ZodString>;
68
+ accountNumber: z.ZodOptional<z.ZodString>;
69
+ ifscCode: z.ZodOptional<z.ZodString>;
70
+ bankName: z.ZodOptional<z.ZodString>;
71
+ isDefault: z.ZodBoolean;
72
+ isActive: z.ZodBoolean;
73
+ }, "strip", z.ZodTypeAny, {
74
+ type: "card" | "other" | "upi" | "bank";
75
+ label: string;
76
+ isDefault: boolean;
77
+ isActive: boolean;
78
+ accountHolderName?: string | undefined;
79
+ ifscCode?: string | undefined;
80
+ bankName?: string | undefined;
81
+ accountNumber?: string | undefined;
82
+ upiVpa?: string | undefined;
83
+ }, {
84
+ type: "card" | "other" | "upi" | "bank";
85
+ label: string;
86
+ isDefault: boolean;
87
+ isActive: boolean;
88
+ accountHolderName?: string | undefined;
89
+ ifscCode?: string | undefined;
90
+ bankName?: string | undefined;
91
+ accountNumber?: string | undefined;
92
+ upiVpa?: string | undefined;
93
+ }>, {
94
+ type: "card" | "other" | "upi" | "bank";
95
+ label: string;
96
+ isDefault: boolean;
97
+ isActive: boolean;
98
+ accountHolderName?: string | undefined;
99
+ ifscCode?: string | undefined;
100
+ bankName?: string | undefined;
101
+ accountNumber?: string | undefined;
102
+ upiVpa?: string | undefined;
103
+ }, {
104
+ type: "card" | "other" | "upi" | "bank";
105
+ label: string;
106
+ isDefault: boolean;
107
+ isActive: boolean;
108
+ accountHolderName?: string | undefined;
109
+ ifscCode?: string | undefined;
110
+ bankName?: string | undefined;
111
+ accountNumber?: string | undefined;
112
+ upiVpa?: string | undefined;
113
+ }>;
114
+ /**
115
+ * Update contract.
116
+ *
117
+ * The per-type rules deliberately do NOT apply here: a PATCH may carry a
118
+ * single field (`isDefault`, say) and requiring the whole bank block on every
119
+ * partial update would make toggling the default impossible. The bounds still
120
+ * apply to whatever IS sent, and the create path is where completeness is
121
+ * enforced.
122
+ */
123
+ export declare const payoutMethodUpdateSchema: z.ZodObject<{
124
+ type: z.ZodOptional<z.ZodEnum<["upi", "bank", "card", "other"]>>;
125
+ label: z.ZodOptional<z.ZodString>;
126
+ upiVpa: z.ZodOptional<z.ZodString>;
127
+ accountHolderName: z.ZodOptional<z.ZodString>;
128
+ accountNumber: z.ZodOptional<z.ZodString>;
129
+ ifscCode: z.ZodOptional<z.ZodString>;
130
+ bankName: z.ZodOptional<z.ZodString>;
131
+ isDefault: z.ZodOptional<z.ZodBoolean>;
132
+ isActive: z.ZodOptional<z.ZodBoolean>;
133
+ }, "strict", z.ZodTypeAny, {
134
+ type?: "card" | "other" | "upi" | "bank" | undefined;
135
+ label?: string | undefined;
136
+ isDefault?: boolean | undefined;
137
+ accountHolderName?: string | undefined;
138
+ ifscCode?: string | undefined;
139
+ bankName?: string | undefined;
140
+ isActive?: boolean | undefined;
141
+ accountNumber?: string | undefined;
142
+ upiVpa?: string | undefined;
143
+ }, {
144
+ type?: "card" | "other" | "upi" | "bank" | undefined;
145
+ label?: string | undefined;
146
+ isDefault?: boolean | undefined;
147
+ accountHolderName?: string | undefined;
148
+ ifscCode?: string | undefined;
149
+ bankName?: string | undefined;
150
+ isActive?: boolean | undefined;
151
+ accountNumber?: string | undefined;
152
+ upiVpa?: string | undefined;
153
+ }>;
@@ -0,0 +1,155 @@
1
+ /*
2
+ * WHY: A seller's payout method is where their money goes, and it was
3
+ * validated at ZERO layers. Measured 2026-08-24:
4
+ * · `store/payout-methods/new` — `accountNumber` and `ifscCode` are
5
+ * bare <Input>s with no `required` and no pattern; `onSave` has no
6
+ * validation at all and posts `form as Record<string, unknown>`.
7
+ * Both default to `""`, so an empty bank payout method saved cleanly.
8
+ * · `.../[id]/edit` — `onSave` has no validation either, and does not
9
+ * even render the account-number/IFSC inputs.
10
+ * · `POST /api/store/payout-methods` — `parseJsonBody` then `...body`
11
+ * spread into `.create()`. No Zod.
12
+ * · `PATCH .../[id]` — the raw body passed straight to `.update()`.
13
+ * No Zod, no field filtering.
14
+ * A payout method with a blank account number is not a validation nicety;
15
+ * it is a payout that cannot be made, discovered at payout time.
16
+ * WHAT: One schema for the pages AND the routes.
17
+ *
18
+ * ## The rules are per TYPE, which is why this needs a superRefine
19
+ *
20
+ * A UPI method needs a VPA and no bank fields; a bank method needs an account
21
+ * number, an IFSC and a holder name and no VPA. Per-field `.min(1)` cannot
22
+ * express that — it would make every field mandatory for every type.
23
+ *
24
+ * The IFSC and UPI patterns are the ones already used by
25
+ * `SellerPayoutSettingsView` (`^[A-Z]{4}0[A-Z0-9]{6}$` and the VPA shape), not
26
+ * a second pair invented here — two regexes for one format is how they come to
27
+ * disagree about what a valid IFSC is.
28
+ *
29
+ * EXPORTS:
30
+ * payoutMethodFormSchema, payoutMethodCreateSchema,
31
+ * payoutMethodUpdateSchema, type PayoutMethodFormValues
32
+ *
33
+ * @tag domain:store-extensions
34
+ * @tag layer:schema
35
+ * @tag pattern:none
36
+ * @tag access:isomorphic
37
+ * @tag consumers:store/payout-methods pages,/api/store/payout-methods
38
+ * @tag sideEffects:none
39
+ */
40
+ import { z } from "zod";
41
+ import { annotate } from "../../shell/field-ui-meta";
42
+ /** Same pattern `SellerPayoutSettingsView` enforces. */
43
+ const IFSC_RE = /^[A-Z]{4}0[A-Z0-9]{6}$/;
44
+ /** Same pattern `SellerPayoutSettingsView` enforces. */
45
+ const UPI_VPA_RE = /^[\w.\-_]{2,256}@[a-zA-Z]{2,64}$/;
46
+ /**
47
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
48
+ * by schema instance and every zod wrapper returns a new one.
49
+ */
50
+ export const payoutMethodFormSchema = z
51
+ .object({
52
+ type: annotate(z.enum(["upi", "bank", "card", "other"]), {
53
+ section: "method", sectionLabel: "Payout Method", sectionRequired: true,
54
+ quick: true, order: 1, row: "pair",
55
+ }),
56
+ label: annotate(z.string().min(1, "Give this method a name you'll recognise.").max(80), {
57
+ section: "method", quick: true, order: 2, row: "pair",
58
+ }),
59
+ upiVpa: annotate(z.string().max(256).optional(), {
60
+ section: "method", order: 3, row: "full",
61
+ help: "For UPI methods, e.g. name@bank.",
62
+ }),
63
+ accountHolderName: annotate(z.string().max(120).optional(), {
64
+ section: "bank", sectionLabel: "Bank Account", order: 1, row: "full",
65
+ }),
66
+ accountNumber: annotate(z.string().max(34).optional(), {
67
+ section: "bank", order: 2, row: "pair",
68
+ }),
69
+ ifscCode: annotate(z.string().max(11).optional(), {
70
+ section: "bank", order: 3, row: "pair",
71
+ }),
72
+ bankName: annotate(z.string().max(120).optional(), {
73
+ section: "bank", order: 4, row: "pair",
74
+ }),
75
+ isDefault: annotate(z.boolean(), {
76
+ section: "visibility", sectionLabel: "Visibility", order: 1, row: "quarter",
77
+ }),
78
+ isActive: annotate(z.boolean(), {
79
+ section: "visibility", order: 2, row: "quarter",
80
+ }),
81
+ })
82
+ .superRefine((v, ctx) => {
83
+ const issue = (path, message) => ctx.addIssue({ code: z.ZodIssueCode.custom, path: [path], message });
84
+ /**
85
+ * "Required, and if present the right shape" — the same two-part check
86
+ * every one of these fields needs. One helper rather than a required
87
+ * branch plus a format branch per field, which is what turned this into
88
+ * an unreadable if/else chain.
89
+ */
90
+ const require = (path, raw, missing, format) => {
91
+ const value = raw?.trim() ?? "";
92
+ if (!value)
93
+ return issue(path, missing);
94
+ if (!format)
95
+ return;
96
+ const candidate = format.normalise ? format.normalise(value) : value;
97
+ if (!format.re.test(candidate))
98
+ issue(path, format.message);
99
+ };
100
+ // Per-type rules by lookup, not by branching. A new payout type adds an
101
+ // entry here rather than another arm of a chain.
102
+ const RULES = {
103
+ upi: () => require("upiVpa", v.upiVpa, "A UPI ID is required for a UPI payout method.", {
104
+ re: UPI_VPA_RE,
105
+ message: "Please enter a valid UPI ID, e.g. name@bank.",
106
+ }),
107
+ // These four are what make a payout actually possible. Every one of them
108
+ // could previously be left blank and saved.
109
+ bank: () => {
110
+ require("accountHolderName", v.accountHolderName, "The account holder's name is required.");
111
+ require("accountNumber", v.accountNumber, "An account number is required.", {
112
+ re: /^\d{6,18}$/,
113
+ message: "An account number is 6–18 digits.",
114
+ });
115
+ require("ifscCode", v.ifscCode, "An IFSC code is required.", {
116
+ re: IFSC_RE,
117
+ message: "Please enter a valid IFSC code, e.g. HDFC0001234.",
118
+ normalise: (x) => x.toUpperCase(),
119
+ });
120
+ require("bankName", v.bankName, "The bank name is required.");
121
+ },
122
+ // `card` and `other` carry no extra requirements today — the label is
123
+ // enough to identify them, and inventing rules for them would reject
124
+ // methods sellers can legitimately record.
125
+ };
126
+ RULES[v.type]?.();
127
+ });
128
+ /**
129
+ * Create contract. `sellerId`/`storeId` are absent on purpose — the route sets
130
+ * both from the session, so a caller cannot file a payout method against
131
+ * another seller by adding fields to the body.
132
+ */
133
+ export const payoutMethodCreateSchema = payoutMethodFormSchema;
134
+ /**
135
+ * Update contract.
136
+ *
137
+ * The per-type rules deliberately do NOT apply here: a PATCH may carry a
138
+ * single field (`isDefault`, say) and requiring the whole bank block on every
139
+ * partial update would make toggling the default impossible. The bounds still
140
+ * apply to whatever IS sent, and the create path is where completeness is
141
+ * enforced.
142
+ */
143
+ export const payoutMethodUpdateSchema = z
144
+ .object({
145
+ type: z.enum(["upi", "bank", "card", "other"]).optional(),
146
+ label: z.string().min(1).max(80).optional(),
147
+ upiVpa: z.string().max(256).regex(UPI_VPA_RE, "Please enter a valid UPI ID.").optional(),
148
+ accountHolderName: z.string().max(120).optional(),
149
+ accountNumber: z.string().regex(/^\d{6,18}$/, "An account number is 6–18 digits.").optional(),
150
+ ifscCode: z.string().regex(IFSC_RE, "Please enter a valid IFSC code.").optional(),
151
+ bankName: z.string().max(120).optional(),
152
+ isDefault: z.boolean().optional(),
153
+ isActive: z.boolean().optional(),
154
+ })
155
+ .strict();
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
4
+ * by schema instance and every zod wrapper returns a new one.
5
+ */
6
+ export declare const reportCreateSchema: z.ZodObject<{
7
+ entityType: z.ZodEnum<[import("./firestore").ReportEntityType, ...import("./firestore").ReportEntityType[]]>;
8
+ entityId: z.ZodString;
9
+ reason: z.ZodEnum<[import("./firestore").ReportReason, ...import("./firestore").ReportReason[]]>;
10
+ detail: z.ZodString;
11
+ evidenceUrls: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
12
+ }, "strict", z.ZodTypeAny, {
13
+ reason: import("./firestore").ReportReason;
14
+ entityId: string;
15
+ entityType: import("./firestore").ReportEntityType;
16
+ detail: string;
17
+ evidenceUrls?: string[] | undefined;
18
+ }, {
19
+ reason: import("./firestore").ReportReason;
20
+ entityId: string;
21
+ entityType: import("./firestore").ReportEntityType;
22
+ detail: string;
23
+ evidenceUrls?: string[] | undefined;
24
+ }>;
25
+ export type ReportCreateValues = z.infer<typeof reportCreateSchema>;
@@ -0,0 +1,79 @@
1
+ /*
2
+ * WHY: `POST /api/reports` — the surface any signed-in user files an abuse
3
+ * report through — spread the raw request body into Firestore:
4
+ *
5
+ * const body = await parseJsonBody<Record<string, JsonValue>>(request);
6
+ * await reportsRepository.create({ ...body, reporterId, reporterEmail, status: "pending" });
7
+ *
8
+ * Nothing was checked. Two distinct consequences:
9
+ *
10
+ * 1. An EMPTY report could be filed. `entityType`, `entityId`, `reason`
11
+ * and `detail` are what make a report actionable and none was
12
+ * required, so a row could reach the moderation queue naming nothing
13
+ * and describing nothing.
14
+ * 2. A reporter could set fields that belong to the REVIEWER — a body
15
+ * carrying `assignedTo`, `resolution` or `resolvedAt` was written
16
+ * verbatim, so a user could file a report that already claimed to be
17
+ * resolved by a named admin.
18
+ *
19
+ * `status` was pinned server-side, which is the only reason (2) was not
20
+ * worse than it is.
21
+ *
22
+ * WHAT: The create contract. Four required fields, evidence optional, and
23
+ * nothing a reviewer owns.
24
+ *
25
+ * ## `reporterId` / `reporterEmail` / `status` are absent on purpose
26
+ *
27
+ * The route sets all three. Accepting `reporterId` would let one user file a
28
+ * report in another's name, which is a way to weaponise the abuse queue rather
29
+ * than a validation nicety.
30
+ *
31
+ * EXPORTS: reportCreateSchema, type ReportCreateValues
32
+ *
33
+ * @tag domain:store-extensions,reports
34
+ * @tag layer:schema
35
+ * @tag pattern:none
36
+ * @tag access:isomorphic
37
+ * @tag consumers:/api/reports
38
+ * @tag sideEffects:none
39
+ */
40
+ import { z } from "zod";
41
+ import { annotate } from "../../shell/field-ui-meta";
42
+ import { REPORT_ENTITY_TYPES, REPORT_REASONS } from "./firestore";
43
+ /**
44
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
45
+ * by schema instance and every zod wrapper returns a new one.
46
+ */
47
+ export const reportCreateSchema = z
48
+ .object({
49
+ entityType: annotate(z.enum(REPORT_ENTITY_TYPES), {
50
+ section: "target",
51
+ sectionLabel: "What are you reporting?",
52
+ sectionRequired: true,
53
+ quick: true,
54
+ order: 1,
55
+ row: "pair",
56
+ }),
57
+ entityId: annotate(z.string().min(1, "Tell us which item this is about."), {
58
+ section: "target",
59
+ quick: true,
60
+ order: 2,
61
+ row: "pair",
62
+ }),
63
+ reason: annotate(z.enum(REPORT_REASONS), {
64
+ section: "detail",
65
+ sectionLabel: "Why",
66
+ sectionRequired: true,
67
+ quick: true,
68
+ order: 1,
69
+ row: "pair",
70
+ }),
71
+ detail: annotate(z
72
+ .string()
73
+ .min(10, "Please describe the problem in at least 10 characters.")
74
+ .max(5000, "Keep the description under 5000 characters."), { section: "detail", quick: true, order: 2, row: "full", kind: "textarea" }),
75
+ // Capped: an unbounded array on a user-writable document is a way to grow
76
+ // one row past what a list read can afford (Rule #6).
77
+ evidenceUrls: annotate(z.array(z.string().url("Each piece of evidence must be a URL.")).max(10).optional(), { section: "detail", order: 3, row: "full", kind: "list" }),
78
+ })
79
+ .strict();
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+ /** The statuses a human review can produce. `pending` is the initial state. */
3
+ export declare const REPORT_REVIEWER_STATUSES: readonly ["under-review", "actioned", "dismissed"];
4
+ /**
5
+ * The two that CLOSE a report — the server stamps `resolvedAt` for these and
6
+ * for no others. Exported so the route and any future consumer share one
7
+ * answer to "is this report finished", rather than each spelling out the pair.
8
+ */
9
+ export declare const REPORT_TERMINAL_STATUSES: readonly ["actioned", "dismissed"];
10
+ /**
11
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
12
+ * by schema instance and every zod wrapper returns a new one.
13
+ */
14
+ export declare const reportReviewFormSchema: z.ZodEffects<z.ZodObject<{
15
+ status: z.ZodEnum<["under-review", "actioned", "dismissed"]>;
16
+ resolution: z.ZodOptional<z.ZodString>;
17
+ }, "strict", z.ZodTypeAny, {
18
+ status: "dismissed" | "under-review" | "actioned";
19
+ resolution?: string | undefined;
20
+ }, {
21
+ status: "dismissed" | "under-review" | "actioned";
22
+ resolution?: string | undefined;
23
+ }>, {
24
+ status: "dismissed" | "under-review" | "actioned";
25
+ resolution?: string | undefined;
26
+ }, {
27
+ status: "dismissed" | "under-review" | "actioned";
28
+ resolution?: string | undefined;
29
+ }>;
30
+ export type ReportReviewFormValues = z.infer<typeof reportReviewFormSchema>;
31
+ /** Route contract — identical; a review is one atomic decision. */
32
+ export declare const reportReviewUpdateSchema: z.ZodEffects<z.ZodObject<{
33
+ status: z.ZodEnum<["under-review", "actioned", "dismissed"]>;
34
+ resolution: z.ZodOptional<z.ZodString>;
35
+ }, "strict", z.ZodTypeAny, {
36
+ status: "dismissed" | "under-review" | "actioned";
37
+ resolution?: string | undefined;
38
+ }, {
39
+ status: "dismissed" | "under-review" | "actioned";
40
+ resolution?: string | undefined;
41
+ }>, {
42
+ status: "dismissed" | "under-review" | "actioned";
43
+ resolution?: string | undefined;
44
+ }, {
45
+ status: "dismissed" | "under-review" | "actioned";
46
+ resolution?: string | undefined;
47
+ }>;
@@ -0,0 +1,111 @@
1
+ /*
2
+ * WHY: `PATCH /api/admin/reports/[id]` spread the raw request body straight
3
+ * into Firestore, exactly as the moderation route did:
4
+ *
5
+ * const body = await parseJsonBody<Record<string, JsonValue>>(request);
6
+ * await reportsRepository.update(id, { ...body, assignedTo: user.uid });
7
+ *
8
+ * No Zod on the route, none on either client surface. `status` was never
9
+ * checked against the real `ReportStatus` union, and any key at all could
10
+ * be written onto a report — `reporterId`, `entityId`, `evidenceUrls`,
11
+ * or something invented.
12
+ *
13
+ * ## 🛑 And it was actively corrupting `resolvedAt`
14
+ *
15
+ * BOTH client surfaces — the list page's inline controls and
16
+ * `ReportDetailActions` — sent:
17
+ *
18
+ * resolvedAt: status === "actioned" || status === "dismissed"
19
+ * ? new Date() : undefined
20
+ *
21
+ * `new Date()` does not survive `JSON.stringify`. It arrives at the route
22
+ * as an ISO **string**, and the raw spread wrote that string into a field
23
+ * `ReportDocument` declares as `Date`. Seeded reports hold real
24
+ * Timestamps, so the collection carries BOTH shapes for one field —
25
+ * the sort of split that later reads as "the date filter is broken" long
26
+ * after the cause is out of sight (Recurrent Root Cause #47).
27
+ *
28
+ * Nothing renders `resolvedAt` today, which is the only reason it was
29
+ * never noticed. It is a latent corruption, not a cosmetic one.
30
+ *
31
+ * WHAT: One schema shared by the route and both client surfaces — and
32
+ * `resolvedAt` is REMOVED from the client contract entirely. The server
33
+ * stamps it, the same way the moderation route already stamps
34
+ * `reviewedAt`. A timestamp the client cannot send is a timestamp the
35
+ * client cannot send in the wrong type.
36
+ *
37
+ * ## A reviewer may only set the three statuses a REVIEW produces
38
+ *
39
+ * `ReportStatus` has four values; `pending` is the state a report is born in.
40
+ * The settable subset is declared `satisfies readonly ReportStatus[]` rather
41
+ * than restated, so a value outside the real union is a COMPILE error instead
42
+ * of a filter that silently matches nothing (Recurrent Root Cause #33).
43
+ *
44
+ * EXPORTS:
45
+ * reportReviewFormSchema, reportReviewUpdateSchema,
46
+ * REPORT_REVIEWER_STATUSES, REPORT_TERMINAL_STATUSES,
47
+ * type ReportReviewFormValues
48
+ *
49
+ * @tag domain:store-extensions,reports
50
+ * @tag layer:schema
51
+ * @tag pattern:none
52
+ * @tag access:isomorphic
53
+ * @tag consumers:admin/reports pages,/api/admin/reports/[id]
54
+ * @tag sideEffects:none
55
+ */
56
+ import { z } from "zod";
57
+ import { annotate } from "../../shell/field-ui-meta";
58
+ /** The statuses a human review can produce. `pending` is the initial state. */
59
+ export const REPORT_REVIEWER_STATUSES = [
60
+ "under-review",
61
+ "actioned",
62
+ "dismissed",
63
+ ];
64
+ /**
65
+ * The two that CLOSE a report — the server stamps `resolvedAt` for these and
66
+ * for no others. Exported so the route and any future consumer share one
67
+ * answer to "is this report finished", rather than each spelling out the pair.
68
+ */
69
+ export const REPORT_TERMINAL_STATUSES = [
70
+ "actioned",
71
+ "dismissed",
72
+ ];
73
+ /**
74
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
75
+ * by schema instance and every zod wrapper returns a new one.
76
+ */
77
+ export const reportReviewFormSchema = z
78
+ .object({
79
+ status: annotate(z.enum(REPORT_REVIEWER_STATUSES), {
80
+ section: "review",
81
+ sectionLabel: "Report decision",
82
+ sectionRequired: true,
83
+ quick: true,
84
+ order: 1,
85
+ row: "pair",
86
+ }),
87
+ resolution: annotate(z.string().max(1000, "Keep the resolution under 1000 characters.").optional(), {
88
+ section: "review",
89
+ order: 2,
90
+ row: "full",
91
+ kind: "textarea",
92
+ help: "Required when actioning or dismissing — the reporter may see a summary.",
93
+ }),
94
+ // `resolvedAt` is deliberately NOT a field. See the header.
95
+ })
96
+ .strict()
97
+ .superRefine((v, ctx) => {
98
+ // Taking a report for review needs no note; closing one does. "Actioned"
99
+ // with an empty resolution tells the reporter, and the next admin, nothing
100
+ // about what was actually done.
101
+ if (REPORT_TERMINAL_STATUSES.includes(v.status) &&
102
+ !v.resolution?.trim()) {
103
+ ctx.addIssue({
104
+ code: z.ZodIssueCode.custom,
105
+ path: ["resolution"],
106
+ message: "Say what was done about this report before closing it.",
107
+ });
108
+ }
109
+ });
110
+ /** Route contract — identical; a review is one atomic decision. */
111
+ export const reportReviewUpdateSchema = reportReviewFormSchema;