@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,36 @@
1
+ import { z } from "zod";
2
+ import type { AdminNotificationCategory, AdminNotificationDocument } from "./rbac";
3
+ export declare const ADMIN_NOTIFICATION_CATEGORIES: [AdminNotificationCategory, ...AdminNotificationCategory[]];
4
+ type Severity = AdminNotificationDocument["severity"];
5
+ export declare const ADMIN_NOTIFICATION_SEVERITIES: [Severity, ...Severity[]];
6
+ /**
7
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
8
+ * by schema instance and every zod wrapper returns a new one.
9
+ */
10
+ export declare const adminNotificationCreateSchema: z.ZodObject<{
11
+ title: z.ZodString;
12
+ body: z.ZodString;
13
+ category: z.ZodEnum<[AdminNotificationCategory, ...AdminNotificationCategory[]]>;
14
+ severity: z.ZodEnum<["warning" | "error" | "info", ...("warning" | "error" | "info")[]]>;
15
+ audienceUserIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
16
+ entityType: z.ZodOptional<z.ZodString>;
17
+ entityId: z.ZodOptional<z.ZodString>;
18
+ }, "strict", z.ZodTypeAny, {
19
+ title: string;
20
+ body: string;
21
+ category: AdminNotificationCategory;
22
+ severity: "warning" | "error" | "info";
23
+ entityId?: string | undefined;
24
+ entityType?: string | undefined;
25
+ audienceUserIds?: string[] | undefined;
26
+ }, {
27
+ title: string;
28
+ body: string;
29
+ category: AdminNotificationCategory;
30
+ severity: "warning" | "error" | "info";
31
+ entityId?: string | undefined;
32
+ entityType?: string | undefined;
33
+ audienceUserIds?: string[] | undefined;
34
+ }>;
35
+ export type AdminNotificationCreateValues = z.infer<typeof adminNotificationCreateSchema>;
36
+ export {};
@@ -0,0 +1,114 @@
1
+ /*
2
+ * WHY: `POST /api/admin/admin-notifications` spread the raw request body into
3
+ * Firestore with only `isRead: false` pinned. The last unvalidated write
4
+ * path in `src/app/api`.
5
+ *
6
+ * `category` and `severity` are both closed unions that the admin
7
+ * notification bell filters and colours by, and neither was checked — so
8
+ * a notification could be stored with a category no filter chip matches
9
+ * and a severity no badge renders, which is the shape that produces a row
10
+ * visible in the raw collection and invisible in the UI (Recurrent Root
11
+ * Cause #33).
12
+ *
13
+ * `audienceUserIds` decides WHO SEES IT. Unvalidated and unbounded, it
14
+ * could arrive as a string rather than an array — silently narrowing or
15
+ * widening the audience of an admin notification.
16
+ *
17
+ * WHAT: The create contract.
18
+ *
19
+ * ## `isRead` / `readAt` are absent on purpose
20
+ *
21
+ * Both are per-admin read state, owned by the read/dismiss path. A creator
22
+ * marking its own notification as already read would file it straight into the
23
+ * history nobody looks at.
24
+ *
25
+ * EXPORTS:
26
+ * adminNotificationCreateSchema, ADMIN_NOTIFICATION_CATEGORIES,
27
+ * ADMIN_NOTIFICATION_SEVERITIES, type AdminNotificationCreateValues
28
+ *
29
+ * @tag domain:store-extensions,admin-notifications
30
+ * @tag layer:schema
31
+ * @tag pattern:none
32
+ * @tag access:isomorphic
33
+ * @tag consumers:/api/admin/admin-notifications
34
+ * @tag sideEffects:none
35
+ */
36
+ import { z } from "zod";
37
+ import { annotate } from "../../shell/field-ui-meta";
38
+ /*
39
+ * Keyed `Record<Union, true>` so BOTH mistakes are compile errors — a member
40
+ * added to the union and forgotten here, and a value here that is not real.
41
+ */
42
+ const CATEGORY_MAP = {
43
+ system: true,
44
+ security: true,
45
+ moderation: true,
46
+ payouts: true,
47
+ fraud: true,
48
+ growth: true,
49
+ };
50
+ export const ADMIN_NOTIFICATION_CATEGORIES = Object.keys(CATEGORY_MAP);
51
+ const SEVERITY_MAP = {
52
+ info: true,
53
+ warning: true,
54
+ error: true,
55
+ };
56
+ export const ADMIN_NOTIFICATION_SEVERITIES = Object.keys(SEVERITY_MAP);
57
+ /**
58
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
59
+ * by schema instance and every zod wrapper returns a new one.
60
+ */
61
+ export const adminNotificationCreateSchema = z
62
+ .object({
63
+ title: annotate(z.string().min(1, "Give the notification a title.").max(200), {
64
+ section: "message",
65
+ sectionLabel: "Message",
66
+ sectionRequired: true,
67
+ quick: true,
68
+ order: 1,
69
+ row: "full",
70
+ }),
71
+ body: annotate(z.string().min(1, "Say what happened.").max(2000), {
72
+ section: "message",
73
+ quick: true,
74
+ order: 2,
75
+ row: "full",
76
+ kind: "textarea",
77
+ }),
78
+ category: annotate(z.enum(ADMIN_NOTIFICATION_CATEGORIES), {
79
+ section: "routing",
80
+ sectionLabel: "Routing",
81
+ sectionRequired: true,
82
+ quick: true,
83
+ order: 1,
84
+ row: "pair",
85
+ }),
86
+ severity: annotate(z.enum(ADMIN_NOTIFICATION_SEVERITIES), {
87
+ section: "routing",
88
+ quick: true,
89
+ order: 2,
90
+ row: "pair",
91
+ }),
92
+ // Empty (or omitted) means every admin — that is the documented meaning of
93
+ // the field, so an empty array must stay expressible and is NOT `.min(1)`.
94
+ // Capped because this is the audience of a broadcast.
95
+ audienceUserIds: annotate(z.array(z.string().min(1)).max(200).optional(), {
96
+ section: "routing",
97
+ order: 3,
98
+ row: "full",
99
+ kind: "list",
100
+ help: "Leave empty to notify every admin.",
101
+ }),
102
+ entityType: annotate(z.string().max(80).optional(), {
103
+ section: "link",
104
+ sectionLabel: "Linked record",
105
+ order: 1,
106
+ row: "pair",
107
+ }),
108
+ entityId: annotate(z.string().max(200).optional(), {
109
+ section: "link",
110
+ order: 2,
111
+ row: "pair",
112
+ }),
113
+ })
114
+ .strict();
@@ -0,0 +1,57 @@
1
+ import { z } from "zod";
2
+ import type { AlertOperator, AnalyticsCardType } from "./firestore";
3
+ export declare const ANALYTICS_ALERT_OPERATORS: [AlertOperator, ...AlertOperator[]];
4
+ export declare const ANALYTICS_CARD_TYPES: [AnalyticsCardType, ...AnalyticsCardType[]];
5
+ /**
6
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
7
+ * by schema instance and every zod wrapper returns a new one.
8
+ */
9
+ export declare const analyticsAlertCreateSchema: z.ZodObject<{
10
+ label: z.ZodString;
11
+ metric: z.ZodString;
12
+ operator: z.ZodEnum<[AlertOperator, ...AlertOperator[]]>;
13
+ threshold: z.ZodNumber;
14
+ windowHours: z.ZodNumber;
15
+ isActive: z.ZodOptional<z.ZodBoolean>;
16
+ notifyChannels: z.ZodOptional<z.ZodArray<z.ZodEnum<["in-app", "email", "whatsapp"]>, "many">>;
17
+ }, "strict", z.ZodTypeAny, {
18
+ label: string;
19
+ operator: AlertOperator;
20
+ threshold: number;
21
+ metric: string;
22
+ windowHours: number;
23
+ isActive?: boolean | undefined;
24
+ notifyChannels?: ("email" | "whatsapp" | "in-app")[] | undefined;
25
+ }, {
26
+ label: string;
27
+ operator: AlertOperator;
28
+ threshold: number;
29
+ metric: string;
30
+ windowHours: number;
31
+ isActive?: boolean | undefined;
32
+ notifyChannels?: ("email" | "whatsapp" | "in-app")[] | undefined;
33
+ }>;
34
+ export type AnalyticsAlertCreateValues = z.infer<typeof analyticsAlertCreateSchema>;
35
+ export declare const analyticsCardCreateSchema: z.ZodObject<{
36
+ title: z.ZodString;
37
+ type: z.ZodEnum<[AnalyticsCardType, ...AnalyticsCardType[]]>;
38
+ metric: z.ZodString;
39
+ filters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<import("../../..").FirestoreValue, z.ZodTypeDef, import("../../..").FirestoreValue>>>;
40
+ position: z.ZodOptional<z.ZodNumber>;
41
+ isVisible: z.ZodOptional<z.ZodBoolean>;
42
+ }, "strict", z.ZodTypeAny, {
43
+ type: AnalyticsCardType;
44
+ title: string;
45
+ metric: string;
46
+ position?: number | undefined;
47
+ filters?: Record<string, import("../../..").FirestoreValue> | undefined;
48
+ isVisible?: boolean | undefined;
49
+ }, {
50
+ type: AnalyticsCardType;
51
+ title: string;
52
+ metric: string;
53
+ position?: number | undefined;
54
+ filters?: Record<string, import("../../..").FirestoreValue> | undefined;
55
+ isVisible?: boolean | undefined;
56
+ }>;
57
+ export type AnalyticsCardCreateValues = z.infer<typeof analyticsCardCreateSchema>;
@@ -0,0 +1,158 @@
1
+ /*
2
+ * WHY: `POST /api/store/analytics/alerts` and `POST /api/store/analytics/cards`
3
+ * both spread the raw request body into Firestore.
4
+ *
5
+ * The alert one matters most. An analytics alert is a rule that FIRES —
6
+ * `metric`, `operator`, `threshold` and `windowHours` are what a scheduled
7
+ * job evaluates, and none of the four was checked. A `threshold` arriving
8
+ * as the string "50" from a number input was written as a string, so the
9
+ * comparison the alert exists to perform would run against a string; an
10
+ * `operator` outside the real six matched nothing; and `windowHours` was
11
+ * unbounded, so a rule could ask a job to look back a hundred years.
12
+ *
13
+ * Neither failure surfaces as an error. The alert is created, listed, and
14
+ * looks configured — it simply never fires, or fires wrongly.
15
+ *
16
+ * WHAT: The two create contracts.
17
+ *
18
+ * ## `scope` / `ownerId` / `isBuiltIn` are absent on purpose
19
+ *
20
+ * The routes pin all three. `scope` in particular decides whether a row is a
21
+ * seller's or the platform's, so accepting it from the body would let a seller
22
+ * file an admin-scoped card.
23
+ *
24
+ * EXPORTS:
25
+ * analyticsAlertCreateSchema, analyticsCardCreateSchema,
26
+ * ANALYTICS_ALERT_OPERATORS, ANALYTICS_CARD_TYPES,
27
+ * type AnalyticsAlertCreateValues, type AnalyticsCardCreateValues
28
+ *
29
+ * @tag domain:store-extensions,analytics
30
+ * @tag layer:schema
31
+ * @tag pattern:none
32
+ * @tag access:isomorphic
33
+ * @tag consumers:/api/store/analytics/alerts,/api/store/analytics/cards
34
+ * @tag sideEffects:none
35
+ */
36
+ import { z } from "zod";
37
+ import { annotate } from "../../shell/field-ui-meta";
38
+ import { firestoreValueSchema } from "../../../schemas/firestore-value";
39
+ /*
40
+ * Keyed `Record<Union, true>` so BOTH mistakes are compile errors — a value
41
+ * added to the union and forgotten here, and a value here that is not real.
42
+ */
43
+ const ALERT_OPERATOR_MAP = {
44
+ ">": true,
45
+ "<": true,
46
+ ">=": true,
47
+ "<=": true,
48
+ "==": true,
49
+ "!=": true,
50
+ };
51
+ export const ANALYTICS_ALERT_OPERATORS = Object.keys(ALERT_OPERATOR_MAP);
52
+ const CARD_TYPE_MAP = {
53
+ metric: true,
54
+ line: true,
55
+ bar: true,
56
+ pie: true,
57
+ table: true,
58
+ custom: true,
59
+ };
60
+ export const ANALYTICS_CARD_TYPES = Object.keys(CARD_TYPE_MAP);
61
+ /** One year. A window beyond this is a typo, not a reporting period. */
62
+ const MAX_WINDOW_HOURS = 24 * 365;
63
+ /**
64
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
65
+ * by schema instance and every zod wrapper returns a new one.
66
+ */
67
+ export const analyticsAlertCreateSchema = z
68
+ .object({
69
+ label: annotate(z.string().min(1, "Give the alert a name.").max(120), {
70
+ section: "alert",
71
+ sectionLabel: "Alert",
72
+ sectionRequired: true,
73
+ quick: true,
74
+ order: 1,
75
+ row: "full",
76
+ }),
77
+ metric: annotate(z.string().min(1, "Choose a metric to watch."), {
78
+ section: "rule",
79
+ sectionLabel: "When to fire",
80
+ sectionRequired: true,
81
+ quick: true,
82
+ order: 1,
83
+ row: "pair",
84
+ }),
85
+ operator: annotate(z.enum(ANALYTICS_ALERT_OPERATORS), {
86
+ section: "rule",
87
+ quick: true,
88
+ order: 2,
89
+ row: "pair",
90
+ }),
91
+ // Coerced. A number input sends a string, and an uncoerced threshold is
92
+ // compared as a string by whatever evaluates the rule — "9" > "10".
93
+ threshold: annotate(z.coerce.number({ invalid_type_error: "Set a numeric threshold." }), {
94
+ section: "rule",
95
+ quick: true,
96
+ order: 3,
97
+ row: "pair",
98
+ kind: "number",
99
+ }),
100
+ windowHours: annotate(z.coerce
101
+ .number()
102
+ .int("The window must be a whole number of hours.")
103
+ .min(1, "The window must be at least an hour.")
104
+ .max(MAX_WINDOW_HOURS, "That window is longer than a year."), { section: "rule", quick: true, order: 4, row: "pair", kind: "number" }),
105
+ isActive: annotate(z.boolean().optional(), {
106
+ section: "delivery",
107
+ sectionLabel: "Delivery",
108
+ order: 1,
109
+ row: "quarter",
110
+ }),
111
+ notifyChannels: annotate(z.array(z.enum(["in-app", "email", "whatsapp"])).min(1).optional(), { section: "delivery", order: 2, row: "full", kind: "list" }),
112
+ })
113
+ .strict();
114
+ export const analyticsCardCreateSchema = z
115
+ .object({
116
+ title: annotate(z.string().min(1, "Give the card a title.").max(120), {
117
+ section: "card",
118
+ sectionLabel: "Card",
119
+ sectionRequired: true,
120
+ quick: true,
121
+ order: 1,
122
+ row: "full",
123
+ }),
124
+ type: annotate(z.enum(ANALYTICS_CARD_TYPES), {
125
+ section: "card",
126
+ quick: true,
127
+ order: 2,
128
+ row: "pair",
129
+ }),
130
+ metric: annotate(z.string().min(1, "Choose a metric."), {
131
+ section: "card",
132
+ quick: true,
133
+ order: 3,
134
+ row: "pair",
135
+ }),
136
+ // Deliberately open — filter shape varies by card type, and a closed schema
137
+ // would silently strip whatever the builder produced for a type it did not
138
+ // enumerate.
139
+ filters: annotate(z.record(firestoreValueSchema).optional(), {
140
+ section: "card",
141
+ order: 4,
142
+ row: "full",
143
+ kind: "list",
144
+ }),
145
+ position: annotate(z.coerce.number().int().min(0).optional(), {
146
+ section: "layout",
147
+ sectionLabel: "Layout",
148
+ order: 1,
149
+ row: "pair",
150
+ kind: "number",
151
+ }),
152
+ isVisible: annotate(z.boolean().optional(), {
153
+ section: "layout",
154
+ order: 2,
155
+ row: "quarter",
156
+ }),
157
+ })
158
+ .strict();
@@ -0,0 +1,85 @@
1
+ import { z } from "zod";
2
+ /** Whether a string is a permission this system can actually grant. */
3
+ export declare function isKnownPermission(value: string): boolean;
4
+ /**
5
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
6
+ * by schema instance and every zod wrapper returns a new one.
7
+ */
8
+ export declare const customRoleFormSchema: z.ZodObject<{
9
+ name: z.ZodString;
10
+ slug: z.ZodString;
11
+ description: z.ZodOptional<z.ZodString>;
12
+ scope: z.ZodEnum<["global", "store"]>;
13
+ permissions: z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">;
14
+ inheritsFrom: z.ZodOptional<z.ZodString>;
15
+ isActive: z.ZodBoolean;
16
+ }, "strip", z.ZodTypeAny, {
17
+ scope: "store" | "global";
18
+ name: string;
19
+ slug: string;
20
+ isActive: boolean;
21
+ permissions: string[];
22
+ description?: string | undefined;
23
+ inheritsFrom?: string | undefined;
24
+ }, {
25
+ scope: "store" | "global";
26
+ name: string;
27
+ slug: string;
28
+ isActive: boolean;
29
+ permissions: string[];
30
+ description?: string | undefined;
31
+ inheritsFrom?: string | undefined;
32
+ }>;
33
+ export type CustomRoleFormValues = z.infer<typeof customRoleFormSchema>;
34
+ /** Create contract. `createdBy` is absent — the route sets it from the session. */
35
+ export declare const customRoleCreateSchema: z.ZodObject<{
36
+ name: z.ZodString;
37
+ slug: z.ZodString;
38
+ description: z.ZodOptional<z.ZodString>;
39
+ scope: z.ZodEnum<["global", "store"]>;
40
+ permissions: z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">;
41
+ inheritsFrom: z.ZodOptional<z.ZodString>;
42
+ isActive: z.ZodBoolean;
43
+ }, "strip", z.ZodTypeAny, {
44
+ scope: "store" | "global";
45
+ name: string;
46
+ slug: string;
47
+ isActive: boolean;
48
+ permissions: string[];
49
+ description?: string | undefined;
50
+ inheritsFrom?: string | undefined;
51
+ }, {
52
+ scope: "store" | "global";
53
+ name: string;
54
+ slug: string;
55
+ isActive: boolean;
56
+ permissions: string[];
57
+ description?: string | undefined;
58
+ inheritsFrom?: string | undefined;
59
+ }>;
60
+ /**
61
+ * Update contract — partial and `.strict()`, so an unknown key is a 400 rather
62
+ * than a silent write into a document the permission system reads.
63
+ */
64
+ export declare const customRoleUpdateSchema: z.ZodObject<{
65
+ name: z.ZodOptional<z.ZodString>;
66
+ description: z.ZodOptional<z.ZodString>;
67
+ scope: z.ZodOptional<z.ZodEnum<["global", "store"]>>;
68
+ permissions: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
69
+ inheritsFrom: z.ZodOptional<z.ZodString>;
70
+ isActive: z.ZodOptional<z.ZodBoolean>;
71
+ }, "strict", z.ZodTypeAny, {
72
+ scope?: "store" | "global" | undefined;
73
+ name?: string | undefined;
74
+ description?: string | undefined;
75
+ isActive?: boolean | undefined;
76
+ permissions?: string[] | undefined;
77
+ inheritsFrom?: string | undefined;
78
+ }, {
79
+ scope?: "store" | "global" | undefined;
80
+ name?: string | undefined;
81
+ description?: string | undefined;
82
+ isActive?: boolean | undefined;
83
+ permissions?: string[] | undefined;
84
+ inheritsFrom?: string | undefined;
85
+ }>;
@@ -0,0 +1,118 @@
1
+ /*
2
+ * WHY: Custom roles GRANT PERMISSIONS, and neither creating nor updating one
3
+ * validated anything. Measured 2026-08-24:
4
+ * · `POST /api/admin/roles` — `parseJsonBody` then `...body` spread
5
+ * into `.create()`.
6
+ * · `PATCH /api/admin/roles/[id]` — the raw body handed straight to
7
+ * `.update()`.
8
+ * · Both pages (`admin/roles/new`, `.../[id]/edit`) are raw controls
9
+ * with no Zod anywhere.
10
+ * So a role could be written with no name, a `permissions` array holding
11
+ * arbitrary strings, a `scope` outside its union, or any invented key —
12
+ * all persisted verbatim into the document the permission system reads.
13
+ * WHAT: One schema for both pages AND both routes.
14
+ *
15
+ * ## Permissions are checked against the real catalogue
16
+ *
17
+ * `Permission` is a closed union of ~85 `admin:resource:action` strings, and
18
+ * `PERMISSION_GROUPS` is its runtime form. A permission string that is not in
19
+ * it grants nothing — it silently never matches — so a role built from typos
20
+ * looks configured and does nothing, which is worse than being rejected.
21
+ *
22
+ * `"*"` is accepted deliberately: `security/rbac/types.ts` defines it as the
23
+ * wildcard, and rejecting it here would break a legitimate super-role.
24
+ *
25
+ * ## What is NOT accepted from the body
26
+ *
27
+ * `createdBy` is set from the session by the route. `id`/`createdAt`/
28
+ * `updatedAt` are the repository's. A caller able to set `createdBy` could
29
+ * attribute a privilege grant to somebody else, which is precisely the field
30
+ * an audit trail depends on.
31
+ *
32
+ * EXPORTS:
33
+ * customRoleFormSchema, customRoleCreateSchema, customRoleUpdateSchema,
34
+ * isKnownPermission, type CustomRoleFormValues
35
+ *
36
+ * @tag domain:store-extensions,rbac
37
+ * @tag layer:schema
38
+ * @tag pattern:none
39
+ * @tag access:isomorphic
40
+ * @tag consumers:admin/roles pages,/api/admin/roles
41
+ * @tag sideEffects:none
42
+ */
43
+ import { z } from "zod";
44
+ import { annotate } from "../../shell/field-ui-meta";
45
+ import { PERMISSION_GROUPS } from "../../auth/permissions/constants";
46
+ /**
47
+ * Every permission the catalogue actually defines, plus the wildcard.
48
+ *
49
+ * Derived from `PERMISSION_GROUPS` rather than restated — a hand-written copy
50
+ * would be the second list of ~85 strings to keep in sync, and the first one
51
+ * to drift (Root Cause #61).
52
+ */
53
+ const KNOWN_PERMISSIONS = new Set([
54
+ "*",
55
+ ...Object.values(PERMISSION_GROUPS).flat(),
56
+ ]);
57
+ /** Whether a string is a permission this system can actually grant. */
58
+ export function isKnownPermission(value) {
59
+ return KNOWN_PERMISSIONS.has(value);
60
+ }
61
+ const permissionSchema = z.string().refine(isKnownPermission, {
62
+ message: "Not a permission this system defines — it would grant nothing.",
63
+ });
64
+ /**
65
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
66
+ * by schema instance and every zod wrapper returns a new one.
67
+ */
68
+ export const customRoleFormSchema = z.object({
69
+ name: annotate(z.string().min(1, "A role needs a name.").max(80, "Keep the name under 80 characters."), {
70
+ section: "basics", sectionLabel: "Role", sectionRequired: true,
71
+ quick: true, order: 1, row: "pair",
72
+ }),
73
+ slug: annotate(z
74
+ .string()
75
+ .min(1, "A slug is required.")
76
+ .max(80)
77
+ .regex(/^[a-z0-9-]+$/, "Use lowercase letters, numbers and hyphens only."), {
78
+ section: "basics", quick: true, order: 2, row: "pair",
79
+ tier: "t1-derive",
80
+ help: "Generated from the name when left blank.",
81
+ }),
82
+ description: annotate(z.string().max(300, "Keep the description under 300 characters.").optional(), {
83
+ section: "basics", order: 3, row: "full",
84
+ }),
85
+ scope: annotate(z.enum(["global", "store"]), {
86
+ section: "basics", quick: true, order: 4, row: "pair",
87
+ }),
88
+ permissions: annotate(z.array(permissionSchema), {
89
+ section: "permissions", sectionLabel: "Permissions",
90
+ order: 1, row: "full", kind: "list",
91
+ }),
92
+ inheritsFrom: annotate(z.string().max(80).optional(), {
93
+ section: "permissions", order: 2, row: "pair",
94
+ help: "Another role whose permissions this one starts from.",
95
+ }),
96
+ isActive: annotate(z.boolean(), {
97
+ section: "visibility", sectionLabel: "Visibility", order: 1, row: "quarter",
98
+ }),
99
+ });
100
+ /** Create contract. `createdBy` is absent — the route sets it from the session. */
101
+ export const customRoleCreateSchema = customRoleFormSchema;
102
+ /**
103
+ * Update contract — partial and `.strict()`, so an unknown key is a 400 rather
104
+ * than a silent write into a document the permission system reads.
105
+ */
106
+ export const customRoleUpdateSchema = z
107
+ .object({
108
+ name: z.string().min(1).max(80).optional(),
109
+ description: z.string().max(300).optional(),
110
+ scope: z.enum(["global", "store"]).optional(),
111
+ permissions: z.array(permissionSchema).optional(),
112
+ inheritsFrom: z.string().max(80).optional(),
113
+ isActive: z.boolean().optional(),
114
+ // `slug` is deliberately absent: it is the role's stable identifier and
115
+ // renaming it would orphan every user already assigned the role. Same
116
+ // create-only rule every other slug in this codebase follows.
117
+ })
118
+ .strict();
@@ -100,7 +100,25 @@ export interface StoreCategoryDocument extends BaseDocument {
100
100
  export declare const STORE_CATEGORIES_COLLECTION: "storeCategories";
101
101
  export declare const STORE_CATEGORY_INDEXED_FIELDS: readonly ["storeId", "slug", "isActive", "displayOrder", "createdAt"];
102
102
  export declare const DEFAULT_STORE_CATEGORY_DATA: Partial<StoreCategoryDocument>;
103
- export type ListingTemplateType = "standard" | "auction" | "pre-order" | "prize-draw" | "bundle" | "classified" | "digital-code" | "live";
103
+ /**
104
+ * The listing kinds a seller can save a template for.
105
+ *
106
+ * A runtime array, with the type DERIVED from it — so the Zod enum in
107
+ * `listing-template-form.ts` reads this rather than restating it. That was the
108
+ * eleventh hand-written copy of the listing-type union in this codebase, and
109
+ * the tenth had already drifted (Root Cause #61).
110
+ *
111
+ * Two deliberate differences from `ListingType`:
112
+ * - `bundle` is KEPT even though SB-UNI-D stopped it being a listingType. A
113
+ * seeded template stores it (`store-extensions-seed-data.ts:202`), so
114
+ * dropping it here would make that template fail validation and become
115
+ * unsaveable — the same defect as the blog `slug` regex no stored row
116
+ * satisfied.
117
+ * - `art` and `stickers` are ADDED. They are real listing types a seller can
118
+ * create, and their absence meant a template could never be saved for them.
119
+ */
120
+ export declare const LISTING_TEMPLATE_TYPES: readonly ["standard", "auction", "pre-order", "prize-draw", "bundle", "classified", "digital-code", "live", "art", "stickers"];
121
+ export type ListingTemplateType = (typeof LISTING_TEMPLATE_TYPES)[number];
104
122
  export interface ListingTemplateDocument extends BaseDocument {
105
123
  storeId: string;
106
124
  ownerId: string;
@@ -151,6 +169,8 @@ export interface ReportDocument extends BaseDocument {
151
169
  resolution?: string;
152
170
  resolvedAt?: Date;
153
171
  }
172
+ export declare const REPORT_ENTITY_TYPES: [ReportEntityType, ...ReportEntityType[]];
173
+ export declare const REPORT_REASONS: [ReportReason, ...ReportReason[]];
154
174
  export declare const REPORTS_COLLECTION: "reports";
155
175
  export declare const REPORT_INDEXED_FIELDS: readonly ["entityType", "entityId", "reporterId", "reason", "status", "createdAt"];
156
176
  export declare const DEFAULT_REPORT_DATA: Partial<ReportDocument>;
@@ -63,6 +63,36 @@ export const DEFAULT_STORE_CATEGORY_DATA = {
63
63
  displayOrder: 0,
64
64
  productIds: [],
65
65
  };
66
+ // 6. ───── listingTemplates ───────────────────────────────────────────────
67
+ /**
68
+ * The listing kinds a seller can save a template for.
69
+ *
70
+ * A runtime array, with the type DERIVED from it — so the Zod enum in
71
+ * `listing-template-form.ts` reads this rather than restating it. That was the
72
+ * eleventh hand-written copy of the listing-type union in this codebase, and
73
+ * the tenth had already drifted (Root Cause #61).
74
+ *
75
+ * Two deliberate differences from `ListingType`:
76
+ * - `bundle` is KEPT even though SB-UNI-D stopped it being a listingType. A
77
+ * seeded template stores it (`store-extensions-seed-data.ts:202`), so
78
+ * dropping it here would make that template fail validation and become
79
+ * unsaveable — the same defect as the blog `slug` regex no stored row
80
+ * satisfied.
81
+ * - `art` and `stickers` are ADDED. They are real listing types a seller can
82
+ * create, and their absence meant a template could never be saved for them.
83
+ */
84
+ export const LISTING_TEMPLATE_TYPES = [
85
+ "standard",
86
+ "auction",
87
+ "pre-order",
88
+ "prize-draw",
89
+ "bundle",
90
+ "classified",
91
+ "digital-code",
92
+ "live",
93
+ "art",
94
+ "stickers",
95
+ ];
66
96
  export const LISTING_TEMPLATES_COLLECTION = "listingTemplates";
67
97
  export const LISTING_TEMPLATE_INDEXED_FIELDS = [
68
98
  "storeId",
@@ -92,6 +122,36 @@ export const MODERATION_QUEUE_INDEXED_FIELDS = [
92
122
  export const DEFAULT_MODERATION_QUEUE_DATA = {
93
123
  status: "pending",
94
124
  };
125
+ /*
126
+ * Runtime companions for the three report unions above.
127
+ *
128
+ * Keyed `Record<Union, true>` rather than written as arrays, because that is
129
+ * the only shape where BOTH mistakes are compile errors: a member added to the
130
+ * union and forgotten here, AND a value here that is not a real member. An
131
+ * array literal catches neither, which is how ten independent enumerations of
132
+ * `ListingType` came to disagree (Recurrent Root Cause #61).
133
+ */
134
+ const REPORT_ENTITY_TYPE_MAP = {
135
+ product: true,
136
+ store: true,
137
+ review: true,
138
+ event: true,
139
+ user: true,
140
+ blog: true,
141
+ comment: true,
142
+ };
143
+ export const REPORT_ENTITY_TYPES = Object.keys(REPORT_ENTITY_TYPE_MAP);
144
+ const REPORT_REASON_MAP = {
145
+ scam: true,
146
+ counterfeit: true,
147
+ prohibited: true,
148
+ inappropriate: true,
149
+ harassment: true,
150
+ spam: true,
151
+ "ip-violation": true,
152
+ other: true,
153
+ };
154
+ export const REPORT_REASONS = Object.keys(REPORT_REASON_MAP);
95
155
  export const REPORTS_COLLECTION = "reports";
96
156
  export const REPORT_INDEXED_FIELDS = [
97
157
  "entityType",