@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,53 @@
1
+ import { z } from "zod";
2
+ import type { StoreGoogleConfigDocument } from "./firestore";
3
+ /**
4
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
5
+ * by schema instance and every zod wrapper returns a new one.
6
+ */
7
+ export declare const storeGoogleConfigUpdateSchema: z.ZodObject<{
8
+ isConnected: z.ZodOptional<z.ZodBoolean>;
9
+ placeId: z.ZodOptional<z.ZodString>;
10
+ businessName: z.ZodOptional<z.ZodString>;
11
+ }, "strict", z.ZodTypeAny, {
12
+ placeId?: string | undefined;
13
+ isConnected?: boolean | undefined;
14
+ businessName?: string | undefined;
15
+ }, {
16
+ placeId?: string | undefined;
17
+ isConnected?: boolean | undefined;
18
+ businessName?: string | undefined;
19
+ }>;
20
+ export type StoreGoogleConfigFormValues = z.infer<typeof storeGoogleConfigUpdateSchema>;
21
+ /**
22
+ * What the seller's own settings page may see.
23
+ *
24
+ * An ALLOW-list, built as a new object — never the document with keys deleted.
25
+ * A deny-list publishes every field nobody thought to remove, including ones
26
+ * the interface does not declare, which is exactly how a decrypted API token
27
+ * and an unmasked ad-credentials blob reached anonymous callers before
28
+ * (Recurrent Root Cause #70).
29
+ *
30
+ * PUBLIC (to the store owner):
31
+ * storeId, isConnected — what the page renders
32
+ * placeId, businessName — what the page lets them edit
33
+ * averageRating, totalReviews, lastSyncedAt — sync output they need to see
34
+ * id, createdAt, updatedAt — ordinary record metadata
35
+ *
36
+ * PRIVATE:
37
+ * oauthRefreshToken — a long-lived Google credential with no reader and no
38
+ * writer anywhere in either tree. It was being sent to the browser on every
39
+ * load simply because the route returned the document whole.
40
+ */
41
+ export declare function toSellerGoogleConfig(doc: StoreGoogleConfigDocument): {
42
+ id: string;
43
+ storeId: string;
44
+ isConnected: boolean;
45
+ placeId: string | undefined;
46
+ businessName: string | undefined;
47
+ averageRating: number | undefined;
48
+ totalReviews: number | undefined;
49
+ lastSyncedAt: Date | undefined;
50
+ createdAt: Date;
51
+ updatedAt: Date;
52
+ };
53
+ export type SellerGoogleConfig = ReturnType<typeof toSellerGoogleConfig>;
@@ -0,0 +1,105 @@
1
+ /*
2
+ * WHY: `PUT /api/store/google-reviews` spread the raw request body into
3
+ * Firestore on both the create and the update branch, with `storeId`
4
+ * pinned and nothing else checked.
5
+ *
6
+ * ## 🛑 The field that makes this worth doing carefully
7
+ *
8
+ * `StoreGoogleConfigDocument` declares `oauthRefreshToken` — a long-lived
9
+ * Google credential. The raw spread meant a request body could set it, and the
10
+ * sibling `GET` returns the document WHOLE, so it was also being sent to the
11
+ * browser on every load of the seller's Google Reviews settings page.
12
+ *
13
+ * It is scoped to the caller's own store, so this is not a cross-tenant leak.
14
+ * It is still a secret in a page payload for no reason: a repo-wide grep finds
15
+ * **no reader and no writer** for that field anywhere — nothing sets it and
16
+ * nothing consumes it. Per the public-projection rule, a field nobody can name
17
+ * a reader for is private by default.
18
+ *
19
+ * So this schema deliberately does NOT declare it, and the route projects it
20
+ * out of the response. The field itself is left on the document rather than
21
+ * deleted — removing a schema field is a data-model change and deserves its
22
+ * own decision, not a drive-by inside a validation fix.
23
+ *
24
+ * ## `averageRating` / `totalReviews` / `lastSyncedAt` are absent too
25
+ *
26
+ * Those are SYNC OUTPUT — what Google last told us. A seller typing their own
27
+ * review count in is not configuration, it is fabricating the number the
28
+ * storefront displays.
29
+ *
30
+ * EXPORTS:
31
+ * storeGoogleConfigUpdateSchema, toSellerGoogleConfig,
32
+ * type StoreGoogleConfigFormValues, type SellerGoogleConfig
33
+ *
34
+ * @tag domain:store-extensions,google-reviews
35
+ * @tag layer:schema
36
+ * @tag pattern:none
37
+ * @tag access:isomorphic
38
+ * @tag consumers:/api/store/google-reviews
39
+ * @tag sideEffects:none
40
+ */
41
+ import { z } from "zod";
42
+ import { annotate } from "../../shell/field-ui-meta";
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 storeGoogleConfigUpdateSchema = z
48
+ .object({
49
+ isConnected: annotate(z.boolean().optional(), {
50
+ section: "google",
51
+ sectionLabel: "Google Reviews",
52
+ sectionRequired: true,
53
+ quick: true,
54
+ order: 1,
55
+ row: "quarter",
56
+ }),
57
+ placeId: annotate(z.string().max(256).optional(), {
58
+ section: "google",
59
+ quick: true,
60
+ order: 2,
61
+ row: "pair",
62
+ help: "The Google Place ID for this store's listing.",
63
+ }),
64
+ businessName: annotate(z.string().max(200).optional(), {
65
+ section: "google",
66
+ quick: true,
67
+ order: 3,
68
+ row: "pair",
69
+ }),
70
+ })
71
+ .strict();
72
+ /**
73
+ * What the seller's own settings page may see.
74
+ *
75
+ * An ALLOW-list, built as a new object — never the document with keys deleted.
76
+ * A deny-list publishes every field nobody thought to remove, including ones
77
+ * the interface does not declare, which is exactly how a decrypted API token
78
+ * and an unmasked ad-credentials blob reached anonymous callers before
79
+ * (Recurrent Root Cause #70).
80
+ *
81
+ * PUBLIC (to the store owner):
82
+ * storeId, isConnected — what the page renders
83
+ * placeId, businessName — what the page lets them edit
84
+ * averageRating, totalReviews, lastSyncedAt — sync output they need to see
85
+ * id, createdAt, updatedAt — ordinary record metadata
86
+ *
87
+ * PRIVATE:
88
+ * oauthRefreshToken — a long-lived Google credential with no reader and no
89
+ * writer anywhere in either tree. It was being sent to the browser on every
90
+ * load simply because the route returned the document whole.
91
+ */
92
+ export function toSellerGoogleConfig(doc) {
93
+ return {
94
+ id: doc.id,
95
+ storeId: doc.storeId,
96
+ isConnected: doc.isConnected,
97
+ placeId: doc.placeId,
98
+ businessName: doc.businessName,
99
+ averageRating: doc.averageRating,
100
+ totalReviews: doc.totalReviews,
101
+ lastSyncedAt: doc.lastSyncedAt,
102
+ createdAt: doc.createdAt,
103
+ updatedAt: doc.updatedAt,
104
+ };
105
+ }
@@ -0,0 +1,28 @@
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 itemRequestCreateSchema: z.ZodObject<{
7
+ title: z.ZodString;
8
+ description: z.ZodString;
9
+ category: z.ZodOptional<z.ZodString>;
10
+ brand: z.ZodOptional<z.ZodString>;
11
+ maxBudget: z.ZodOptional<z.ZodNumber>;
12
+ imageUrls: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
13
+ }, "strict", z.ZodTypeAny, {
14
+ title: string;
15
+ description: string;
16
+ brand?: string | undefined;
17
+ category?: string | undefined;
18
+ imageUrls?: string[] | undefined;
19
+ maxBudget?: number | undefined;
20
+ }, {
21
+ title: string;
22
+ description: string;
23
+ brand?: string | undefined;
24
+ category?: string | undefined;
25
+ imageUrls?: string[] | undefined;
26
+ maxBudget?: number | undefined;
27
+ }>;
28
+ export type ItemRequestCreateValues = z.infer<typeof itemRequestCreateSchema>;
@@ -0,0 +1,80 @@
1
+ /*
2
+ * WHY: `POST /api/item-requests` spread the raw body into Firestore, and this
3
+ * one is READ BY THE PUBLIC — `GET /api/item-requests` is `auth: false`
4
+ * and returns the open list to anyone.
5
+ *
6
+ * const body = await parseJsonBody<FirestoreDocument>(request);
7
+ * await itemRequestsRepository.create({ ...body, opUserId, ..., replies: [], replyCount: 0 });
8
+ *
9
+ * So an unvalidated write here is an unvalidated PUBLISH. A request could
10
+ * be created with no title and no description, and a caller could set
11
+ * `approvedAt` / `approvedBy` — the fields that record a moderator having
12
+ * cleared it.
13
+ *
14
+ * `status`, `replies` and `replyCount` were pinned server-side, so the
15
+ * approval GATE itself held; what a caller could forge was the RECORD of
16
+ * approval, which is the part a human reads when deciding whether it has
17
+ * already been looked at.
18
+ *
19
+ * WHAT: The create contract — title and description required, budget bounded,
20
+ * and nothing a moderator owns.
21
+ *
22
+ * ## `maxBudget` is coerced and bounded
23
+ *
24
+ * It arrives from a number input as a string. Uncoerced it was written to
25
+ * Firestore as a string, and a later numeric comparison against it would sort
26
+ * lexically — the quiet half of the same class as the `resolvedAt` string that
27
+ * was being written into a Date field on the reports route.
28
+ *
29
+ * EXPORTS: itemRequestCreateSchema, type ItemRequestCreateValues
30
+ *
31
+ * @tag domain:store-extensions,item-requests
32
+ * @tag layer:schema
33
+ * @tag pattern:none
34
+ * @tag access:isomorphic
35
+ * @tag consumers:/api/item-requests
36
+ * @tag sideEffects:none
37
+ */
38
+ import { z } from "zod";
39
+ import { annotate } from "../../shell/field-ui-meta";
40
+ /**
41
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
42
+ * by schema instance and every zod wrapper returns a new one.
43
+ */
44
+ export const itemRequestCreateSchema = z
45
+ .object({
46
+ title: annotate(z
47
+ .string()
48
+ .min(3, "Give the request a title of at least 3 characters.")
49
+ .max(200, "Keep the title under 200 characters."), {
50
+ section: "basics",
51
+ sectionLabel: "What are you looking for?",
52
+ sectionRequired: true,
53
+ quick: true,
54
+ order: 1,
55
+ row: "full",
56
+ }),
57
+ description: annotate(z
58
+ .string()
59
+ .min(10, "Describe what you're after in at least 10 characters.")
60
+ .max(5000, "Keep the description under 5000 characters."), { section: "basics", quick: true, order: 2, row: "full", kind: "textarea" }),
61
+ category: annotate(z.string().max(120).optional(), {
62
+ section: "basics",
63
+ order: 3,
64
+ row: "pair",
65
+ }),
66
+ brand: annotate(z.string().max(120).optional(), {
67
+ section: "basics",
68
+ order: 4,
69
+ row: "pair",
70
+ }),
71
+ // Coerced — see the header. Bounded so a typo cannot record a budget that
72
+ // reads as real money.
73
+ maxBudget: annotate(z.coerce
74
+ .number()
75
+ .min(0, "A budget cannot be negative.")
76
+ .max(10000000, "That budget looks like a typo.")
77
+ .optional(), { section: "basics", order: 5, row: "pair", kind: "number" }),
78
+ imageUrls: annotate(z.array(z.string().url("Each image must be a URL.")).max(10).optional(), { section: "media", sectionLabel: "Photos", order: 1, row: "full", kind: "media" }),
79
+ })
80
+ .strict();
@@ -0,0 +1,78 @@
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 listingTemplateFormSchema: z.ZodObject<{
7
+ name: z.ZodString;
8
+ description: z.ZodOptional<z.ZodString>;
9
+ listingType: z.ZodEnum<["standard", "auction", "pre-order", "prize-draw", "bundle", "classified", "digital-code", "live", "art", "stickers"]>;
10
+ defaults: z.ZodRecord<z.ZodString, z.ZodType<import("../../..").FirestoreValue, z.ZodTypeDef, import("../../..").FirestoreValue>>;
11
+ isShared: z.ZodBoolean;
12
+ isActive: z.ZodBoolean;
13
+ }, "strip", z.ZodTypeAny, {
14
+ name: string;
15
+ listingType: "art" | "stickers" | "classified" | "standard" | "auction" | "pre-order" | "prize-draw" | "digital-code" | "live" | "bundle";
16
+ isActive: boolean;
17
+ isShared: boolean;
18
+ defaults: Record<string, import("../../..").FirestoreValue>;
19
+ description?: string | undefined;
20
+ }, {
21
+ name: string;
22
+ listingType: "art" | "stickers" | "classified" | "standard" | "auction" | "pre-order" | "prize-draw" | "digital-code" | "live" | "bundle";
23
+ isActive: boolean;
24
+ isShared: boolean;
25
+ defaults: Record<string, import("../../..").FirestoreValue>;
26
+ description?: string | undefined;
27
+ }>;
28
+ export type ListingTemplateFormValues = z.infer<typeof listingTemplateFormSchema>;
29
+ /**
30
+ * Create contract. `storeId`/`ownerId` are deliberately absent: the route sets
31
+ * both from the session, so a caller cannot create a template inside someone
32
+ * else's store by adding a field to the body.
33
+ */
34
+ export declare const listingTemplateCreateSchema: z.ZodObject<{
35
+ name: z.ZodString;
36
+ description: z.ZodOptional<z.ZodOptional<z.ZodString>>;
37
+ listingType: z.ZodEnum<["standard", "auction", "pre-order", "prize-draw", "bundle", "classified", "digital-code", "live", "art", "stickers"]>;
38
+ isActive: z.ZodOptional<z.ZodBoolean>;
39
+ isShared: z.ZodOptional<z.ZodBoolean>;
40
+ defaults: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<import("../../..").FirestoreValue, z.ZodTypeDef, import("../../..").FirestoreValue>>>;
41
+ }, "strip", z.ZodTypeAny, {
42
+ name: string;
43
+ listingType: "art" | "stickers" | "classified" | "standard" | "auction" | "pre-order" | "prize-draw" | "digital-code" | "live" | "bundle";
44
+ description?: string | undefined;
45
+ isActive?: boolean | undefined;
46
+ isShared?: boolean | undefined;
47
+ defaults?: Record<string, import("../../..").FirestoreValue> | undefined;
48
+ }, {
49
+ name: string;
50
+ listingType: "art" | "stickers" | "classified" | "standard" | "auction" | "pre-order" | "prize-draw" | "digital-code" | "live" | "bundle";
51
+ description?: string | undefined;
52
+ isActive?: boolean | undefined;
53
+ isShared?: boolean | undefined;
54
+ defaults?: Record<string, import("../../..").FirestoreValue> | undefined;
55
+ }>;
56
+ /** Update contract — every field optional, and the same ownership fields absent. */
57
+ export declare const listingTemplateUpdateSchema: z.ZodObject<{
58
+ name: z.ZodOptional<z.ZodString>;
59
+ description: z.ZodOptional<z.ZodOptional<z.ZodString>>;
60
+ listingType: z.ZodOptional<z.ZodEnum<["standard", "auction", "pre-order", "prize-draw", "bundle", "classified", "digital-code", "live", "art", "stickers"]>>;
61
+ defaults: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<import("../../..").FirestoreValue, z.ZodTypeDef, import("../../..").FirestoreValue>>>;
62
+ isShared: z.ZodOptional<z.ZodBoolean>;
63
+ isActive: z.ZodOptional<z.ZodBoolean>;
64
+ }, "strip", z.ZodTypeAny, {
65
+ name?: string | undefined;
66
+ description?: string | undefined;
67
+ listingType?: "art" | "stickers" | "classified" | "standard" | "auction" | "pre-order" | "prize-draw" | "digital-code" | "live" | "bundle" | undefined;
68
+ isActive?: boolean | undefined;
69
+ isShared?: boolean | undefined;
70
+ defaults?: Record<string, import("../../..").FirestoreValue> | undefined;
71
+ }, {
72
+ name?: string | undefined;
73
+ description?: string | undefined;
74
+ listingType?: "art" | "stickers" | "classified" | "standard" | "auction" | "pre-order" | "prize-draw" | "digital-code" | "live" | "bundle" | undefined;
75
+ isActive?: boolean | undefined;
76
+ isShared?: boolean | undefined;
77
+ defaults?: Record<string, import("../../..").FirestoreValue> | undefined;
78
+ }>;
@@ -0,0 +1,87 @@
1
+ /*
2
+ * WHY: `/store/listing-templates/[id]/edit` was a wholly broken page. The route
3
+ * it calls — `/api/store/listing-templates/[id]` — did not exist, while
4
+ * `src/constants/api.ts` defined the endpoint, the edit page called it
5
+ * three times (GET on load, PATCH on save, DELETE), and the list page
6
+ * rendered an Edit button pointing straight at it. A seller clicking Edit
7
+ * got a page that 404'd on load, on save and on delete.
8
+ * Root Cause #37's dead-route shape, with a real page and a real button
9
+ * in front of it.
10
+ * WHAT: One schema for the listing-template form AND the route that receives
11
+ * it, so the two cannot drift.
12
+ *
13
+ * ## `defaults` stays open on purpose
14
+ *
15
+ * It is a JSON blob of per-listing-type field defaults — the whole point is
16
+ * that it holds whatever fields the target listing type has. `z.record()`
17
+ * rather than a named shape: modelling it would mean restating every listing
18
+ * type's field set here, and getting that wrong strips a seller's saved
19
+ * defaults on the next save (`z.object()` drops unknown keys). The page
20
+ * already `JSON.parse`s it and reports malformed JSON.
21
+ *
22
+ * EXPORTS:
23
+ * listingTemplateFormSchema, listingTemplateCreateSchema,
24
+ * listingTemplateUpdateSchema, type ListingTemplateFormValues
25
+ *
26
+ * @tag domain:store-extensions
27
+ * @tag layer:schema
28
+ * @tag pattern:none
29
+ * @tag access:isomorphic
30
+ * @tag consumers:store/listing-templates pages,/api/store/listing-templates
31
+ * @tag sideEffects:none
32
+ */
33
+ import { z } from "zod";
34
+ import { annotate } from "../../shell/field-ui-meta";
35
+ import { LISTING_TEMPLATE_TYPES } from "./firestore";
36
+ import { firestoreValueSchema } from "../../../schemas/firestore-value";
37
+ /**
38
+ * Derived from the runtime array, never restated. A hand-written copy here
39
+ * would be the eleventh independent enumeration of this union — and the tenth
40
+ * had already drifted, which is how `art`/`stickers` came to be unsaveable as
41
+ * templates while `bundle` lingered.
42
+ */
43
+ const listingTemplateTypeSchema = z.enum(LISTING_TEMPLATE_TYPES);
44
+ /**
45
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
46
+ * by schema instance and every zod wrapper returns a new one.
47
+ */
48
+ export const listingTemplateFormSchema = z.object({
49
+ name: annotate(z.string().min(1, "Name is required").max(120, "Keep the name under 120 characters."), {
50
+ section: "basics", sectionLabel: "Template", sectionRequired: true,
51
+ quick: true, order: 1, row: "full",
52
+ }),
53
+ description: annotate(z.string().max(500, "Keep the description under 500 characters.").optional(), {
54
+ section: "basics", order: 2, row: "full",
55
+ }),
56
+ listingType: annotate(listingTemplateTypeSchema, {
57
+ section: "basics", quick: true, order: 3, row: "pair",
58
+ }),
59
+ // Typed as a Firestore value tree, not `unknown`: `unknown` does not satisfy
60
+ // `ListingTemplateDocument.defaults` (a `FirestoreDocument`), and casting at
61
+ // the repository call to paper over that would defeat the only type-level
62
+ // signal that the shapes agree.
63
+ defaults: annotate(z.record(firestoreValueSchema), {
64
+ section: "defaults", sectionLabel: "Default field values",
65
+ order: 1, row: "full", kind: "list",
66
+ help: "JSON applied to a new listing when this template is chosen.",
67
+ }),
68
+ isShared: annotate(z.boolean(), {
69
+ section: "visibility", sectionLabel: "Visibility", order: 1, row: "quarter",
70
+ }),
71
+ isActive: annotate(z.boolean(), {
72
+ section: "visibility", order: 2, row: "quarter",
73
+ }),
74
+ });
75
+ /**
76
+ * Create contract. `storeId`/`ownerId` are deliberately absent: the route sets
77
+ * both from the session, so a caller cannot create a template inside someone
78
+ * else's store by adding a field to the body.
79
+ */
80
+ export const listingTemplateCreateSchema = listingTemplateFormSchema.partial({
81
+ description: true,
82
+ isShared: true,
83
+ isActive: true,
84
+ defaults: true,
85
+ });
86
+ /** Update contract — every field optional, and the same ownership fields absent. */
87
+ export const listingTemplateUpdateSchema = listingTemplateFormSchema.partial();
@@ -0,0 +1,49 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * The statuses a human review can produce.
4
+ *
5
+ * `satisfies readonly ModerationStatus[]` is load-bearing: it is what stops
6
+ * this becoming an independent, drifting copy of the union.
7
+ */
8
+ export declare const MODERATION_REVIEWER_STATUSES: readonly ["approved", "rejected"];
9
+ /**
10
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
11
+ * by schema instance and every zod wrapper returns a new one.
12
+ */
13
+ export declare const moderationReviewFormSchema: z.ZodEffects<z.ZodObject<{
14
+ status: z.ZodEnum<["approved", "rejected"]>;
15
+ reason: z.ZodOptional<z.ZodString>;
16
+ }, "strict", z.ZodTypeAny, {
17
+ status: "approved" | "rejected";
18
+ reason?: string | undefined;
19
+ }, {
20
+ status: "approved" | "rejected";
21
+ reason?: string | undefined;
22
+ }>, {
23
+ status: "approved" | "rejected";
24
+ reason?: string | undefined;
25
+ }, {
26
+ status: "approved" | "rejected";
27
+ reason?: string | undefined;
28
+ }>;
29
+ export type ModerationReviewFormValues = z.infer<typeof moderationReviewFormSchema>;
30
+ /**
31
+ * Route contract. Identical to the form contract — a review is a single
32
+ * atomic decision, so there is no partial variant.
33
+ */
34
+ export declare const moderationReviewUpdateSchema: z.ZodEffects<z.ZodObject<{
35
+ status: z.ZodEnum<["approved", "rejected"]>;
36
+ reason: z.ZodOptional<z.ZodString>;
37
+ }, "strict", z.ZodTypeAny, {
38
+ status: "approved" | "rejected";
39
+ reason?: string | undefined;
40
+ }, {
41
+ status: "approved" | "rejected";
42
+ reason?: string | undefined;
43
+ }>, {
44
+ status: "approved" | "rejected";
45
+ reason?: string | undefined;
46
+ }, {
47
+ status: "approved" | "rejected";
48
+ reason?: string | undefined;
49
+ }>;
@@ -0,0 +1,101 @@
1
+ /*
2
+ * WHY: `PATCH /api/admin/moderation/[id]` spread the raw request body straight
3
+ * into Firestore:
4
+ *
5
+ * const body = await parseJsonBody<Record<string, JsonValue>>(request);
6
+ * await moderationQueueRepository.update(id, { ...body, reviewerId, reviewedAt });
7
+ *
8
+ * There was no Zod anywhere on this path — not on the route, not on
9
+ * either of the two client surfaces that call it. Under `ROLES_ADMIN_MOD`
10
+ * a caller could write ANY key onto a moderation record, including
11
+ * `entityId`, `ownerId`, `submittedAt` or an invented one, and could set
12
+ * `status` to any string at all — the real `ModerationStatus` union was
13
+ * never consulted.
14
+ *
15
+ * Two client surfaces call it and neither validated: the queue page's
16
+ * inline Approve/Reject controls and `ModerationDetailActions`. Both let
17
+ * a rejection be submitted with an EMPTY reason, so content could be
18
+ * blocked with no record of why.
19
+ * WHAT: One schema shared by the route and both client surfaces.
20
+ *
21
+ * ## A reviewer may only set the two statuses a REVIEW produces
22
+ *
23
+ * `ModerationStatus` has four values, but `pending` is the initial state and
24
+ * `auto-approved` is what the system writes when nothing needed a human. A
25
+ * reviewer setting either by hand would be falsifying the record — so the
26
+ * settable set is the subset below, declared `satisfies readonly
27
+ * ModerationStatus[]` rather than restated, which makes a value outside the
28
+ * real union a COMPILE error instead of a filter that matches nothing
29
+ * (Recurrent Root Cause #33).
30
+ *
31
+ * ## `reviewerId` / `reviewedAt` are absent on purpose
32
+ *
33
+ * The route sets both from the session and the server clock. Accepting them
34
+ * here would let a caller attribute a review to somebody else, or backdate it.
35
+ *
36
+ * EXPORTS:
37
+ * moderationReviewFormSchema, moderationReviewUpdateSchema,
38
+ * MODERATION_REVIEWER_STATUSES, type ModerationReviewFormValues
39
+ *
40
+ * @tag domain:store-extensions,moderation
41
+ * @tag layer:schema
42
+ * @tag pattern:none
43
+ * @tag access:isomorphic
44
+ * @tag consumers:admin/moderation pages,/api/admin/moderation/[id]
45
+ * @tag sideEffects:none
46
+ */
47
+ import { z } from "zod";
48
+ import { annotate } from "../../shell/field-ui-meta";
49
+ /**
50
+ * The statuses a human review can produce.
51
+ *
52
+ * `satisfies readonly ModerationStatus[]` is load-bearing: it is what stops
53
+ * this becoming an independent, drifting copy of the union.
54
+ */
55
+ export const MODERATION_REVIEWER_STATUSES = [
56
+ "approved",
57
+ "rejected",
58
+ ];
59
+ /**
60
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
61
+ * by schema instance and every zod wrapper returns a new one.
62
+ */
63
+ export const moderationReviewFormSchema = z
64
+ .object({
65
+ status: annotate(z.enum(MODERATION_REVIEWER_STATUSES), {
66
+ section: "review",
67
+ sectionLabel: "Review decision",
68
+ sectionRequired: true,
69
+ quick: true,
70
+ order: 1,
71
+ row: "pair",
72
+ }),
73
+ reason: annotate(z.string().max(500, "Keep the reason under 500 characters.").optional(), {
74
+ section: "review",
75
+ order: 2,
76
+ row: "full",
77
+ kind: "textarea",
78
+ help: "Required when rejecting — this is the record of why the media was blocked.",
79
+ }),
80
+ })
81
+ // Unknown keys are a 400, not a silent drop. A plain `z.object()` would
82
+ // STRIP them, which is the quieter half of the same bug: the caller is told
83
+ // the write succeeded and the key it sent simply vanished.
84
+ .strict()
85
+ .superRefine((v, ctx) => {
86
+ // An approval needs no justification; a rejection does. Blocking someone's
87
+ // media with an empty `reason` leaves the owner, and the next reviewer,
88
+ // with no way to know what was wrong with it.
89
+ if (v.status === "rejected" && !v.reason?.trim()) {
90
+ ctx.addIssue({
91
+ code: z.ZodIssueCode.custom,
92
+ path: ["reason"],
93
+ message: "Give a reason for the rejection.",
94
+ });
95
+ }
96
+ });
97
+ /**
98
+ * Route contract. Identical to the form contract — a review is a single
99
+ * atomic decision, so there is no partial variant.
100
+ */
101
+ export const moderationReviewUpdateSchema = moderationReviewFormSchema;