@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,148 @@
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 shippingConfigFormSchema: z.ZodEffects<z.ZodObject<{
7
+ label: z.ZodString;
8
+ method: z.ZodEnum<["free", "flat", "weight", "express", "pickup", "custom"]>;
9
+ flatRate: z.ZodOptional<z.ZodNumber>;
10
+ pricePerKg: z.ZodOptional<z.ZodNumber>;
11
+ freeAbove: z.ZodOptional<z.ZodNumber>;
12
+ expressSurcharge: z.ZodOptional<z.ZodNumber>;
13
+ estimatedDays: z.ZodOptional<z.ZodNumber>;
14
+ isDefault: z.ZodBoolean;
15
+ isActive: z.ZodBoolean;
16
+ }, "strip", z.ZodTypeAny, {
17
+ label: string;
18
+ isDefault: boolean;
19
+ isActive: boolean;
20
+ method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
21
+ estimatedDays?: number | undefined;
22
+ freeAbove?: number | undefined;
23
+ flatRate?: number | undefined;
24
+ pricePerKg?: number | undefined;
25
+ expressSurcharge?: number | undefined;
26
+ }, {
27
+ label: string;
28
+ isDefault: boolean;
29
+ isActive: boolean;
30
+ method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
31
+ estimatedDays?: number | undefined;
32
+ freeAbove?: number | undefined;
33
+ flatRate?: number | undefined;
34
+ pricePerKg?: number | undefined;
35
+ expressSurcharge?: number | undefined;
36
+ }>, {
37
+ label: string;
38
+ isDefault: boolean;
39
+ isActive: boolean;
40
+ method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
41
+ estimatedDays?: number | undefined;
42
+ freeAbove?: number | undefined;
43
+ flatRate?: number | undefined;
44
+ pricePerKg?: number | undefined;
45
+ expressSurcharge?: number | undefined;
46
+ }, {
47
+ label: string;
48
+ isDefault: boolean;
49
+ isActive: boolean;
50
+ method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
51
+ estimatedDays?: number | undefined;
52
+ freeAbove?: number | undefined;
53
+ flatRate?: number | undefined;
54
+ pricePerKg?: number | undefined;
55
+ expressSurcharge?: number | undefined;
56
+ }>;
57
+ export type ShippingConfigFormValues = z.infer<typeof shippingConfigFormSchema>;
58
+ /** `storeId` is absent — the route sets it from the session, never the body. */
59
+ export declare const shippingConfigCreateSchema: z.ZodEffects<z.ZodObject<{
60
+ label: z.ZodString;
61
+ method: z.ZodEnum<["free", "flat", "weight", "express", "pickup", "custom"]>;
62
+ flatRate: z.ZodOptional<z.ZodNumber>;
63
+ pricePerKg: z.ZodOptional<z.ZodNumber>;
64
+ freeAbove: z.ZodOptional<z.ZodNumber>;
65
+ expressSurcharge: z.ZodOptional<z.ZodNumber>;
66
+ estimatedDays: z.ZodOptional<z.ZodNumber>;
67
+ isDefault: z.ZodBoolean;
68
+ isActive: z.ZodBoolean;
69
+ }, "strip", z.ZodTypeAny, {
70
+ label: string;
71
+ isDefault: boolean;
72
+ isActive: boolean;
73
+ method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
74
+ estimatedDays?: number | undefined;
75
+ freeAbove?: number | undefined;
76
+ flatRate?: number | undefined;
77
+ pricePerKg?: number | undefined;
78
+ expressSurcharge?: number | undefined;
79
+ }, {
80
+ label: string;
81
+ isDefault: boolean;
82
+ isActive: boolean;
83
+ method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
84
+ estimatedDays?: number | undefined;
85
+ freeAbove?: number | undefined;
86
+ flatRate?: number | undefined;
87
+ pricePerKg?: number | undefined;
88
+ expressSurcharge?: number | undefined;
89
+ }>, {
90
+ label: string;
91
+ isDefault: boolean;
92
+ isActive: boolean;
93
+ method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
94
+ estimatedDays?: number | undefined;
95
+ freeAbove?: number | undefined;
96
+ flatRate?: number | undefined;
97
+ pricePerKg?: number | undefined;
98
+ expressSurcharge?: number | undefined;
99
+ }, {
100
+ label: string;
101
+ isDefault: boolean;
102
+ isActive: boolean;
103
+ method: "flat" | "weight" | "custom" | "free" | "express" | "pickup";
104
+ estimatedDays?: number | undefined;
105
+ freeAbove?: number | undefined;
106
+ flatRate?: number | undefined;
107
+ pricePerKg?: number | undefined;
108
+ expressSurcharge?: number | undefined;
109
+ }>;
110
+ /**
111
+ * Update contract — partial, and `.strict()` so an unknown key is a 400 rather
112
+ * than a silent write. The per-method completeness rules do not apply: a PATCH
113
+ * may legitimately carry only `isActive`.
114
+ */
115
+ export declare const shippingConfigUpdateSchema: z.ZodObject<{
116
+ label: z.ZodOptional<z.ZodString>;
117
+ method: z.ZodOptional<z.ZodEnum<["free", "flat", "weight", "express", "pickup", "custom"]>>;
118
+ flatRate: z.ZodOptional<z.ZodNumber>;
119
+ pricePerKg: z.ZodOptional<z.ZodNumber>;
120
+ freeAbove: z.ZodOptional<z.ZodNumber>;
121
+ expressSurcharge: z.ZodOptional<z.ZodNumber>;
122
+ estimatedDays: z.ZodOptional<z.ZodNumber>;
123
+ zones: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
124
+ isDefault: z.ZodOptional<z.ZodBoolean>;
125
+ isActive: z.ZodOptional<z.ZodBoolean>;
126
+ }, "strict", z.ZodTypeAny, {
127
+ label?: string | undefined;
128
+ isDefault?: boolean | undefined;
129
+ isActive?: boolean | undefined;
130
+ method?: "flat" | "weight" | "custom" | "free" | "express" | "pickup" | undefined;
131
+ estimatedDays?: number | undefined;
132
+ freeAbove?: number | undefined;
133
+ flatRate?: number | undefined;
134
+ pricePerKg?: number | undefined;
135
+ expressSurcharge?: number | undefined;
136
+ zones?: string[] | undefined;
137
+ }, {
138
+ label?: string | undefined;
139
+ isDefault?: boolean | undefined;
140
+ isActive?: boolean | undefined;
141
+ method?: "flat" | "weight" | "custom" | "free" | "express" | "pickup" | undefined;
142
+ estimatedDays?: number | undefined;
143
+ freeAbove?: number | undefined;
144
+ flatRate?: number | undefined;
145
+ pricePerKg?: number | undefined;
146
+ expressSurcharge?: number | undefined;
147
+ zones?: string[] | undefined;
148
+ }>;
@@ -0,0 +1,104 @@
1
+ /*
2
+ * WHY: `POST /api/store/shipping-configs` spread the raw request body into
3
+ * `.create()` and the PATCH handed it straight to `.update()` — no Zod on
4
+ * either, and neither page validated anything. A shipping rule is money:
5
+ * a `flatRate` of `"abc"`, a negative `freeAbove`, or an invented key are
6
+ * all things that were persisted verbatim.
7
+ * WHAT: One schema for the pages AND the routes.
8
+ *
9
+ * ## The numeric fields are `.coerce` on purpose
10
+ *
11
+ * The pages hold them as strings from `<input type="number">`. Coercing here
12
+ * rather than at each call site means every consumer gets a real number and
13
+ * no page has to remember a `Number()` cast — the kind of per-callsite
14
+ * conversion that produces a `NaN` in Firestore the first time someone forgets.
15
+ *
16
+ * EXPORTS:
17
+ * shippingConfigFormSchema, shippingConfigCreateSchema,
18
+ * shippingConfigUpdateSchema, type ShippingConfigFormValues
19
+ *
20
+ * @tag domain:store-extensions
21
+ * @tag layer:schema
22
+ * @tag pattern:none
23
+ * @tag access:isomorphic
24
+ * @tag consumers:store/shipping-configs pages,/api/store/shipping-configs
25
+ * @tag sideEffects:none
26
+ */
27
+ import { z } from "zod";
28
+ import { annotate } from "../../shell/field-ui-meta";
29
+ /** Mirrors `ShippingMethod` in ./firestore. */
30
+ const shippingMethodSchema = z.enum(["free", "flat", "weight", "express", "pickup", "custom"]);
31
+ /** A non-negative money/threshold amount, coerced from the form's string. */
32
+ const amount = (label) => z.coerce.number({ invalid_type_error: `${label} must be a number.` }).min(0, `${label} cannot be negative.`);
33
+ /**
34
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
35
+ * by schema instance and every zod wrapper returns a new one.
36
+ */
37
+ export const shippingConfigFormSchema = z
38
+ .object({
39
+ label: annotate(z.string().min(1, "Give this rule a name.").max(80), {
40
+ section: "basics", sectionLabel: "Shipping Rule", sectionRequired: true,
41
+ quick: true, order: 1, row: "pair",
42
+ }),
43
+ method: annotate(shippingMethodSchema, {
44
+ section: "basics", quick: true, order: 2, row: "pair",
45
+ }),
46
+ flatRate: annotate(amount("Flat rate").optional(), {
47
+ section: "rates", sectionLabel: "Rates", order: 1, row: "pair",
48
+ }),
49
+ pricePerKg: annotate(amount("Price per kg").optional(), {
50
+ section: "rates", order: 2, row: "pair",
51
+ }),
52
+ freeAbove: annotate(amount("Free above").optional(), {
53
+ section: "rates", order: 3, row: "pair",
54
+ }),
55
+ expressSurcharge: annotate(amount("Express surcharge").optional(), {
56
+ section: "rates", order: 4, row: "pair",
57
+ }),
58
+ estimatedDays: annotate(z.coerce.number().int("Estimated days must be a whole number.").min(0).max(365).optional(), { section: "rates", order: 5, row: "pair" }),
59
+ isDefault: annotate(z.boolean(), {
60
+ section: "visibility", sectionLabel: "Visibility", order: 1, row: "quarter",
61
+ }),
62
+ isActive: annotate(z.boolean(), {
63
+ section: "visibility", order: 2, row: "quarter",
64
+ }),
65
+ })
66
+ .superRefine((v, ctx) => {
67
+ // A rate rule with no rate is not a rule. Checked per method, because the
68
+ // required field differs and a blanket `.min(1)` would make every rate
69
+ // mandatory for a free/pickup rule that has none.
70
+ const need = (path, label) => {
71
+ if (v[path] == null) {
72
+ ctx.addIssue({
73
+ code: z.ZodIssueCode.custom,
74
+ path: [path],
75
+ message: `A "${label}" rule needs a ${path === "flatRate" ? "flat rate" : "price per kg"}.`,
76
+ });
77
+ }
78
+ };
79
+ if (v.method === "flat")
80
+ need("flatRate", "flat");
81
+ if (v.method === "weight")
82
+ need("pricePerKg", "weight");
83
+ });
84
+ /** `storeId` is absent — the route sets it from the session, never the body. */
85
+ export const shippingConfigCreateSchema = shippingConfigFormSchema;
86
+ /**
87
+ * Update contract — partial, and `.strict()` so an unknown key is a 400 rather
88
+ * than a silent write. The per-method completeness rules do not apply: a PATCH
89
+ * may legitimately carry only `isActive`.
90
+ */
91
+ export const shippingConfigUpdateSchema = z
92
+ .object({
93
+ label: z.string().min(1).max(80).optional(),
94
+ method: shippingMethodSchema.optional(),
95
+ flatRate: amount("Flat rate").optional(),
96
+ pricePerKg: amount("Price per kg").optional(),
97
+ freeAbove: amount("Free above").optional(),
98
+ expressSurcharge: amount("Express surcharge").optional(),
99
+ estimatedDays: z.coerce.number().int().min(0).max(365).optional(),
100
+ zones: z.array(z.string()).optional(),
101
+ isDefault: z.boolean().optional(),
102
+ isActive: z.boolean().optional(),
103
+ })
104
+ .strict();
@@ -0,0 +1,54 @@
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, so annotating
5
+ * before `.optional()` silently loses the metadata.
6
+ */
7
+ export declare const storeCategoryFormSchema: z.ZodObject<{
8
+ label: z.ZodString;
9
+ slug: z.ZodOptional<z.ZodString>;
10
+ description: z.ZodOptional<z.ZodString>;
11
+ coverImageUrl: z.ZodOptional<z.ZodString>;
12
+ displayOrder: z.ZodNumber;
13
+ }, "strip", z.ZodTypeAny, {
14
+ label: string;
15
+ displayOrder: number;
16
+ description?: string | undefined;
17
+ slug?: string | undefined;
18
+ coverImageUrl?: string | undefined;
19
+ }, {
20
+ label: string;
21
+ displayOrder: number;
22
+ description?: string | undefined;
23
+ slug?: string | undefined;
24
+ coverImageUrl?: string | undefined;
25
+ }>;
26
+ export type StoreCategoryFormValues = z.infer<typeof storeCategoryFormSchema>;
27
+ /**
28
+ * The server's create contract.
29
+ *
30
+ * Identical fields, but `slug` is REQUIRED here: the client derives it from
31
+ * the label when blank, and a category with no slug has no URL. Keeping the
32
+ * derivation on the client and the requirement on the server means the route
33
+ * never has to guess what the user meant.
34
+ */
35
+ export declare const storeCategoryCreateSchema: z.ZodObject<{
36
+ label: z.ZodString;
37
+ description: z.ZodOptional<z.ZodString>;
38
+ coverImageUrl: z.ZodOptional<z.ZodString>;
39
+ displayOrder: z.ZodNumber;
40
+ } & {
41
+ slug: z.ZodString;
42
+ }, "strip", z.ZodTypeAny, {
43
+ label: string;
44
+ slug: string;
45
+ displayOrder: number;
46
+ description?: string | undefined;
47
+ coverImageUrl?: string | undefined;
48
+ }, {
49
+ label: string;
50
+ slug: string;
51
+ displayOrder: number;
52
+ description?: string | undefined;
53
+ coverImageUrl?: string | undefined;
54
+ }>;
@@ -0,0 +1,73 @@
1
+ /*
2
+ * WHY: `/store/categories/new` collected five fields through raw <Input>s with
3
+ * no <Form>, no schema and no check of any kind, and `POST
4
+ * /api/store/categories` spread the raw request body straight into
5
+ * `storeCategoriesRepository.create()`. Neither side validated anything,
6
+ * so an entirely empty storefront category could be created — and any
7
+ * extra key a caller sent was written verbatim into Firestore.
8
+ * WHAT: One schema for both sides. The client parses it to show inline errors
9
+ * before submitting; the route parses it to decide what is allowed to
10
+ * reach the database.
11
+ *
12
+ * ## Why one schema and not two
13
+ *
14
+ * A client copy and a server copy of the same rules is how they come to
15
+ * disagree — and when they do, the client's is the one users see while the
16
+ * server's is the one that decides. The route strips unknown keys BECAUSE it
17
+ * parses this: `storeId` is set from the session, never from the body, so a
18
+ * caller cannot write a category into someone else's store by adding a field.
19
+ *
20
+ * `productIds` and `isActive` are deliberately absent: they are managed after
21
+ * creation (assigning products, toggling visibility), not typed into the
22
+ * create form, and the repository supplies their defaults.
23
+ *
24
+ * EXPORTS:
25
+ * storeCategoryFormSchema, storeCategoryCreateSchema,
26
+ * type StoreCategoryFormValues
27
+ *
28
+ * @tag domain:store-extensions
29
+ * @tag layer:schema
30
+ * @tag pattern:none
31
+ * @tag access:isomorphic
32
+ * @tag consumers:store/categories/new,POST /api/store/categories
33
+ * @tag sideEffects:none
34
+ */
35
+ import { z } from "zod";
36
+ import { annotate } from "../../shell/field-ui-meta";
37
+ /**
38
+ * 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
39
+ * by schema instance and every zod wrapper returns a new one, so annotating
40
+ * before `.optional()` silently loses the metadata.
41
+ */
42
+ export const storeCategoryFormSchema = z.object({
43
+ label: annotate(z.string().min(1, "Label is required").max(80, "Keep the label under 80 characters."), {
44
+ section: "basics", sectionLabel: "Category", sectionRequired: true,
45
+ quick: true, order: 1, row: "full",
46
+ }),
47
+ slug: annotate(z.string().max(80, "Keep the slug under 80 characters.").optional(), {
48
+ section: "basics", order: 2, row: "full",
49
+ // T1 calculated: derived from the label when left blank, then frozen —
50
+ // the same create-only rule every other slug in this codebase follows,
51
+ // because renaming one breaks inbound links.
52
+ tier: "t1-derive",
53
+ help: "Left blank, this is generated from the label.",
54
+ }),
55
+ description: annotate(z.string().max(500, "Keep the description under 500 characters.").optional(), {
56
+ section: "basics", order: 3, row: "full",
57
+ }),
58
+ coverImageUrl: annotate(z.string().optional(), {
59
+ section: "media", sectionLabel: "Media", order: 1, row: "full", kind: "media",
60
+ }),
61
+ displayOrder: annotate(z.coerce.number().int("Display order must be a whole number.").min(0, "Display order cannot be negative."), { section: "visibility", sectionLabel: "Visibility", order: 1, row: "pair" }),
62
+ });
63
+ /**
64
+ * The server's create contract.
65
+ *
66
+ * Identical fields, but `slug` is REQUIRED here: the client derives it from
67
+ * the label when blank, and a category with no slug has no URL. Keeping the
68
+ * derivation on the client and the requirement on the server means the route
69
+ * never has to guess what the user meant.
70
+ */
71
+ export const storeCategoryCreateSchema = storeCategoryFormSchema.extend({
72
+ slug: z.string().min(1, "Slug is required").max(80),
73
+ });
@@ -13,6 +13,7 @@
13
13
  */
14
14
  import { NextResponse } from "next/server.js";
15
15
  import { getProviders } from "../../../../contracts";
16
+ import { toStoreDetail } from "../../../../_internal/server/features/stores/adapters";
16
17
  import { normalizeError } from "../../../../errors/normalize";
17
18
  // --- GET /api/stores/[storeSlug] ---------------------------------------------
18
19
  export async function GET(_request, context) {
@@ -33,31 +34,7 @@ export async function GET(_request, context) {
33
34
  return NextResponse.json({ success: false, error: "Store not found" }, { status: 404 });
34
35
  }
35
36
  // Map to public-safe StoreDetail shape (strip internal/sensitive fields)
36
- const store = {
37
- id: raw.id,
38
- storeSlug: raw.storeSlug,
39
- ownerId: raw.ownerId,
40
- storeName: raw.storeName,
41
- storeDescription: raw.storeDescription,
42
- storeCategory: raw.storeCategory,
43
- storeLogoURL: raw.storeLogoURL,
44
- storeBannerURL: raw.storeBannerURL,
45
- status: raw.status,
46
- isPublic: raw.isPublic,
47
- totalProducts: raw.stats?.totalProducts ?? raw.totalProducts ?? undefined,
48
- itemsSold: raw.stats?.itemsSold ?? raw.itemsSold ?? undefined,
49
- totalReviews: raw.stats?.totalReviews ?? raw.totalReviews ?? undefined,
50
- averageRating: raw.stats?.averageRating ?? raw.averageRating,
51
- bio: raw.bio,
52
- location: raw.location,
53
- website: raw.website,
54
- socialLinks: raw.socialLinks,
55
- returnPolicy: raw.returnPolicy,
56
- shippingPolicy: raw.shippingPolicy,
57
- isVacationMode: raw.isVacationMode,
58
- vacationMessage: raw.vacationMessage,
59
- createdAt: raw.createdAt,
60
- };
37
+ const store = toStoreDetail(raw);
61
38
  return NextResponse.json({ success: true, data: store });
62
39
  }
63
40
  catch (error) {
@@ -13,6 +13,10 @@ import { getDefaultCurrency } from "../../../core/baseline-resolver";
13
13
  import { useGuestWishlist } from "../../wishlist/hooks/useGuestWishlist";
14
14
  import { pushWishlistOp } from "../../cart/utils/pending-ops";
15
15
  import { AUCTION_PUBLIC_SORT_OPTIONS } from "../../products/constants/sieve";
16
+ import { AvailabilityTabs } from "../../products/components/AvailabilityTabs";
17
+ import { AVAILABILITY_VALUES } from "../../../constants/field-names";
18
+ import { TABLE_KEYS } from "../../../constants/table-keys";
19
+ const STORE_AUCTION_TYPES = ["auction"];
16
20
  const __P = {
17
21
  p3: "p-[var(--appkit-space-3)]",
18
22
  };
@@ -45,6 +49,12 @@ export function StoreAuctionsListing({ storeId, initialData }) {
45
49
  const hasActiveState = !!table.get("q") ||
46
50
  table.get("sort") !== DEFAULT_SORT ||
47
51
  filterActiveCount > 0;
52
+ // Absent means "available" — the same default `listStoreProducts`
53
+ // resolves server-side. These six store tabs sent NO availability
54
+ // param at all until 2026-08-24, while their SSR fetch did apply one,
55
+ // so any client refetch silently widened the list (Root Cause #30).
56
+ const availability = table.get(TABLE_KEYS.AVAILABILITY) ||
57
+ AVAILABILITY_VALUES.AVAILABLE;
48
58
  const params = {
49
59
  q: table.get("q") || undefined,
50
60
  minBid: table.get("minBid") ? Number(table.get("minBid")) : undefined,
@@ -56,6 +66,7 @@ export function StoreAuctionsListing({ storeId, initialData }) {
56
66
  perPage: table.getNumber("pageSize", 24),
57
67
  storeId: storeId || undefined,
58
68
  listingType: "auction",
69
+ availability,
59
70
  };
60
71
  const { products: rawAuctions, totalPages, page, isLoading } = useProducts(params, { initialData });
61
72
  const auctions = rawAuctions.map((p) => ({
@@ -75,6 +86,9 @@ export function StoreAuctionsListing({ storeId, initialData }) {
75
86
  status: p.status,
76
87
  slug: p.slug,
77
88
  buyNowPrice: p.buyNowPrice,
89
+ // Read by isBuyNowAvailable() on the card — without it a sold auction still
90
+ // offers a Buyout chip.
91
+ isSold: p.isSold,
78
92
  }));
79
93
  const commitSearch = useCallback(() => {
80
94
  // table.set("q", v) already resets page to 1 — see root-cause #13.
@@ -107,7 +121,7 @@ export function StoreAuctionsListing({ storeId, initialData }) {
107
121
  return;
108
122
  setView(v);
109
123
  table.set("view", v);
110
- }, onResetAll: resetAll, hasActiveState: hasActiveState }), totalPages > 1 && (_jsx(StickyToolbar, { offset: "header+pagination", tone: "translucent", border: true, padding: "toolbar", children: _jsx(Row, { justify: "center", children: _jsx(Pagination, { currentPage: page, totalPages: totalPages, onPageChange: (p) => table.setPage(p) }) }) })), _jsx(Div, { padding: "y-lg", children: isLoading ? (_jsx(Div, { className: gridClass, children: Array.from({ length: 8 }).map((_, i) => (_jsxs(Div, { className: "overflow-hidden animate-pulse", border: "subtle", rounded: "xl", children: [_jsx(Div, { className: "aspect-square", surface: "subtle" }), _jsxs(Stack, { className: `${__P.p3}`, gap: "sm", children: [_jsx(Div, { className: "h-3 w-3/4", surface: "subtle", rounded: "default" }), _jsx(Div, { className: "h-4 w-1/2", surface: "subtle", rounded: "default" }), _jsx(Div, { className: "h-8", surface: "subtle", rounded: "default" })] })] }, i))) })) : (_jsx(MarketplaceAuctionGrid, { auctions: auctions, variant: view === "list" ? "list" : "grid", gridClassName: view === "list" ? "flex flex-col gap-[var(--appkit-space-4)]" : gridClass, wishlistActions: wishlistActions, labels: {
124
+ }, onResetAll: resetAll, hasActiveState: hasActiveState }), _jsx(Div, { padding: "y-sm", children: _jsx(AvailabilityTabs, { types: STORE_AUCTION_TYPES }) }), totalPages > 1 && (_jsx(StickyToolbar, { offset: "header+pagination", tone: "translucent", border: true, padding: "toolbar", children: _jsx(Row, { justify: "center", children: _jsx(Pagination, { currentPage: page, totalPages: totalPages, onPageChange: (p) => table.setPage(p) }) }) })), _jsx(Div, { padding: "y-lg", children: isLoading ? (_jsx(Div, { className: gridClass, children: Array.from({ length: 8 }).map((_, i) => (_jsxs(Div, { className: "overflow-hidden animate-pulse", border: "subtle", rounded: "xl", children: [_jsx(Div, { className: "aspect-square", surface: "subtle" }), _jsxs(Stack, { className: `${__P.p3}`, gap: "sm", children: [_jsx(Div, { className: "h-3 w-3/4", surface: "subtle", rounded: "default" }), _jsx(Div, { className: "h-4 w-1/2", surface: "subtle", rounded: "default" }), _jsx(Div, { className: "h-8", surface: "subtle", rounded: "default" })] })] }, i))) })) : (_jsx(MarketplaceAuctionGrid, { auctions: auctions, variant: view === "list" ? "list" : "grid", gridClassName: view === "list" ? "flex flex-col gap-[var(--appkit-space-4)]" : gridClass, wishlistActions: wishlistActions, labels: {
111
125
  emptyTitle: "No auctions yet",
112
126
  emptyDescription: "This store has no active auctions.",
113
127
  } })) }), _jsx(FilterDrawer, { open: filterOpen, onOpen: openFilters, onClose: () => setFilterOpen(false), onApply: applyFilters, onReset: onFilterClear, activeCount: filterActiveCount, hideTrigger: true, children: _jsx(AuctionFilters, { table: pendingTable, currencyPrefix: "\u20B9" }) }), _jsx(LoginRequiredModal, { isOpen: modalOpen, onClose: closeModal, message: modalMessage })] }));
@@ -8,9 +8,12 @@ import { Div, FilterDrawer, ListingToolbar, Pagination, Row, Text, StickyToolbar
8
8
  import { ClassifiedFilters } from "../../classified/components/ClassifiedFilters";
9
9
  import { InteractiveProductCard } from "../../products/components/InteractiveProductCard";
10
10
  import { PRODUCT_FIELDS } from "../../../constants/field-names";
11
- import { TABLE_KEYS } from "../../../constants/table-keys";
12
11
  import { sortBy } from "../../../constants/sort";
13
12
  import { ROUTES } from "../../../next";
13
+ import { AvailabilityTabs } from "../../products/components/AvailabilityTabs";
14
+ import { AVAILABILITY_VALUES } from "../../../constants/field-names";
15
+ import { TABLE_KEYS } from "../../../constants/table-keys";
16
+ const STORE_CLASSIFIED_TYPES = ["classified"];
14
17
  const DEFAULT_SORT = sortBy(PRODUCT_FIELDS.CREATED_AT);
15
18
  const SORT_OPTIONS = [
16
19
  { value: sortBy(PRODUCT_FIELDS.CREATED_AT), label: "Newest First" },
@@ -28,6 +31,12 @@ export function StoreClassifiedsListing({ storeId, initialData }) {
28
31
  const applyFilters = useCallback(() => { onFilterApply(); setFilterOpen(false); }, [onFilterApply]);
29
32
  const resetAll = useCallback(() => { onResetAll({ q: "", sort: "" }); setSearchInput(""); }, [onResetAll]);
30
33
  const hasActiveState = !!table.get("q") || table.get("sort") !== DEFAULT_SORT || filterActiveCount > 0;
34
+ // Absent means "available" — the same default `listStoreProducts`
35
+ // resolves server-side. These six store tabs sent NO availability
36
+ // param at all until 2026-08-24, while their SSR fetch did apply one,
37
+ // so any client refetch silently widened the list (Root Cause #30).
38
+ const availability = table.get(TABLE_KEYS.AVAILABILITY) ||
39
+ AVAILABILITY_VALUES.AVAILABLE;
31
40
  const params = {
32
41
  q: table.get("q") || undefined,
33
42
  minPrice: table.get(TABLE_KEYS.MIN_PRICE) ? Number(table.get(TABLE_KEYS.MIN_PRICE)) : undefined,
@@ -44,10 +53,11 @@ export function StoreClassifiedsListing({ storeId, initialData }) {
44
53
  [TABLE_KEYS.NEGOTIABLE]: table.get(TABLE_KEYS.NEGOTIABLE),
45
54
  [TABLE_KEYS.ACCEPTS_SHIPPING]: table.get(TABLE_KEYS.ACCEPTS_SHIPPING),
46
55
  },
56
+ availability,
47
57
  };
48
58
  const { products, totalPages, page, isLoading } = useProducts(params, { initialData });
49
59
  const gridClass = "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-[var(--appkit-space-4)]";
50
- return (_jsxs(Div, { className: "min-h-[200px]", children: [_jsx(ListingToolbar, { filterCount: filterActiveCount, onFiltersClick: openFilters, searchValue: searchInput, searchPlaceholder: "Search store classifieds\u2026", onSearchChange: setSearchInput, onSearchCommit: () => table.set("q", searchInput.trim()), sortValue: table.get("sort") || DEFAULT_SORT, sortOptions: SORT_OPTIONS, onSortChange: (v) => table.set("sort", v), onResetAll: resetAll, hasActiveState: hasActiveState }), totalPages > 1 && (_jsx(StickyToolbar, { offset: "header+pagination", tone: "translucent", border: true, padding: "toolbar", children: _jsx(Row, { justify: "center", children: _jsx(Pagination, { currentPage: page, totalPages: totalPages, onPageChange: (p) => table.setPage(p) }) }) })), _jsx(Div, { padding: "y-lg", children: _jsx(Div, { className: gridClass, children: isLoading
60
+ return (_jsxs(Div, { className: "min-h-[200px]", children: [_jsx(ListingToolbar, { filterCount: filterActiveCount, onFiltersClick: openFilters, searchValue: searchInput, searchPlaceholder: "Search store classifieds\u2026", onSearchChange: setSearchInput, onSearchCommit: () => table.set("q", searchInput.trim()), sortValue: table.get("sort") || DEFAULT_SORT, sortOptions: SORT_OPTIONS, onSortChange: (v) => table.set("sort", v), onResetAll: resetAll, hasActiveState: hasActiveState }), _jsx(Div, { padding: "y-sm", children: _jsx(AvailabilityTabs, { types: STORE_CLASSIFIED_TYPES }) }), totalPages > 1 && (_jsx(StickyToolbar, { offset: "header+pagination", tone: "translucent", border: true, padding: "toolbar", children: _jsx(Row, { justify: "center", children: _jsx(Pagination, { currentPage: page, totalPages: totalPages, onPageChange: (p) => table.setPage(p) }) }) })), _jsx(Div, { padding: "y-lg", children: _jsx(Div, { className: gridClass, children: isLoading
51
61
  ? Array.from({ length: 8 }).map((_, i) => _jsx(Div, { surface: "muted", rounded: "xl", className: "aspect-square animate-pulse" }, i))
52
62
  : products.length === 0
53
63
  ? _jsx(Div, { paddingY: "y-4xl", className: "col-span-full text-left", children: _jsx(Text, { color: "muted", children: "No classified listings in this store yet." }) })