@mohasinac/appkit 4.30.18 → 4.31.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 (557) hide show
  1. package/dist/_internal/client/features/digital-code/CodeRevealPanel.js +5 -2
  2. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +3 -3
  3. package/dist/_internal/client/features/layout/useSidebarSearch.d.ts +21 -5
  4. package/dist/_internal/client/features/layout/useSidebarSearch.js +27 -6
  5. package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +23 -3
  6. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +106 -86
  7. package/dist/_internal/client/features/lottery/LotteryPullForm.d.ts +16 -5
  8. package/dist/_internal/client/features/lottery/LotteryPullForm.js +65 -40
  9. package/dist/_internal/client/features/maintenance/views/AnalysisRunnerView.js +5 -2
  10. package/dist/_internal/client/features/maintenance/views/CloudLogsListView.js +11 -3
  11. package/dist/_internal/client/hand-mode/HandModeProvider.js +2 -0
  12. package/dist/_internal/server/features/auctions/actions.js +14 -3
  13. package/dist/_internal/server/features/auctions/service.js +1 -1
  14. package/dist/_internal/server/features/auth/permissions.d.ts +2 -0
  15. package/dist/_internal/server/features/auth/permissions.js +3 -2
  16. package/dist/_internal/server/features/blog/data.js +2 -2
  17. package/dist/_internal/server/features/blog/service.js +3 -3
  18. package/dist/_internal/server/features/brands/data.js +1 -1
  19. package/dist/_internal/server/features/brands/service.js +3 -3
  20. package/dist/_internal/server/features/bundles/actions.js +6 -1
  21. package/dist/_internal/server/features/bundles/data.js +21 -4
  22. package/dist/_internal/server/features/cart/data.js +3 -1
  23. package/dist/_internal/server/features/cart/service.js +13 -2
  24. package/dist/_internal/server/features/categories/data.js +26 -6
  25. package/dist/_internal/server/features/classified/index.d.ts +0 -1
  26. package/dist/_internal/server/features/classified/index.js +0 -1
  27. package/dist/_internal/server/features/digital-code/index.d.ts +0 -1
  28. package/dist/_internal/server/features/digital-code/index.js +0 -1
  29. package/dist/_internal/server/features/events/actions.js +17 -4
  30. package/dist/_internal/server/features/events/data.js +1 -1
  31. package/dist/_internal/server/features/events/service.js +1 -1
  32. package/dist/_internal/server/features/grouped/data.js +7 -2
  33. package/dist/_internal/server/features/item-requests/data.js +1 -1
  34. package/dist/_internal/server/features/live/index.d.ts +0 -1
  35. package/dist/_internal/server/features/live/index.js +0 -1
  36. package/dist/_internal/server/features/lottery/actions.js +2 -2
  37. package/dist/_internal/server/features/lottery/data.js +1 -1
  38. package/dist/_internal/server/features/orders/actions.js +7 -7
  39. package/dist/_internal/server/features/orders/data.d.ts +1 -1
  40. package/dist/_internal/server/features/orders/data.js +14 -2
  41. package/dist/_internal/server/features/orders/service.js +1 -1
  42. package/dist/_internal/server/features/pre-orders/service.js +1 -1
  43. package/dist/_internal/server/features/prize-draws/actions.js +1 -1
  44. package/dist/_internal/server/features/products/data.js +21 -6
  45. package/dist/_internal/server/features/products/list-public.d.ts +9 -0
  46. package/dist/_internal/server/features/products/list-public.js +95 -7
  47. package/dist/_internal/server/features/products/service.js +1 -1
  48. package/dist/_internal/server/features/promotions/actions.js +1 -1
  49. package/dist/_internal/server/features/promotions/data.js +1 -1
  50. package/dist/_internal/server/features/promotions/service.js +1 -1
  51. package/dist/_internal/server/features/reviews/data.d.ts +1 -1
  52. package/dist/_internal/server/features/reviews/data.js +6 -1
  53. package/dist/_internal/server/features/reviews/og-data.js +1 -1
  54. package/dist/_internal/server/features/shared/listing-data-factory.js +7 -2
  55. package/dist/_internal/server/features/site-settings/adapters.d.ts +2 -2
  56. package/dist/_internal/server/features/site-settings/adapters.js +8 -5
  57. package/dist/_internal/server/features/stores/data.js +1 -1
  58. package/dist/_internal/server/features/sublisting-categories/data.js +1 -1
  59. package/dist/_internal/server/features/tester/visibility.d.ts +2 -1
  60. package/dist/_internal/server/features/tester/visibility.js +2 -2
  61. package/dist/_internal/server/functions/scheduled.d.ts +3 -1
  62. package/dist/_internal/server/functions/scheduled.js +27 -1
  63. package/dist/_internal/server/jobs/core/auctionSettlement.js +6 -1
  64. package/dist/_internal/server/jobs/core/hardBanCascade.js +4 -0
  65. package/dist/_internal/server/jobs/core/index.d.ts +2 -0
  66. package/dist/_internal/server/jobs/core/index.js +2 -0
  67. package/dist/_internal/server/jobs/core/onOrderStatusChange.js +7 -15
  68. package/dist/_internal/server/jobs/core/pageViewPrune.d.ts +10 -0
  69. package/dist/_internal/server/jobs/core/pageViewPrune.js +44 -0
  70. package/dist/_internal/server/jobs/core/pageViewRollup.d.ts +2 -0
  71. package/dist/_internal/server/jobs/core/pageViewRollup.js +87 -0
  72. package/dist/_internal/server/jobs/core/revenueRollup.js +7 -1
  73. package/dist/_internal/server/jobs/handlers/index.d.ts +2 -0
  74. package/dist/_internal/server/jobs/handlers/index.js +2 -0
  75. package/dist/_internal/server/jobs/handlers/pageViewPrune.d.ts +2 -0
  76. package/dist/_internal/server/jobs/handlers/pageViewPrune.js +2 -0
  77. package/dist/_internal/server/jobs/handlers/pageViewRollup.d.ts +2 -0
  78. package/dist/_internal/server/jobs/handlers/pageViewRollup.js +2 -0
  79. package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
  80. package/dist/_internal/shared/actions/action-registry.js +69 -22
  81. package/dist/_internal/shared/checkout/rules/classified.rule.d.ts +9 -4
  82. package/dist/_internal/shared/checkout/rules/classified.rule.js +7 -2
  83. package/dist/_internal/shared/features/layout/matchesNavQuery.d.ts +14 -0
  84. package/dist/_internal/shared/features/layout/matchesNavQuery.js +72 -0
  85. package/dist/_internal/shared/features/layout/types.d.ts +37 -1
  86. package/dist/_internal/shared/features/layout/types.js +19 -1
  87. package/dist/_internal/shared/features/notifications/action-url.d.ts +9 -1
  88. package/dist/_internal/shared/features/notifications/action-url.js +47 -0
  89. package/dist/_internal/shared/features/offers/config.d.ts +65 -0
  90. package/dist/_internal/shared/features/offers/config.js +73 -2
  91. package/dist/_internal/shared/features/orders/schema.d.ts +19 -1
  92. package/dist/_internal/shared/features/orders/schema.js +22 -2
  93. package/dist/_internal/shared/features/site-settings/types.d.ts +12 -3
  94. package/dist/_internal/shared/listing-types/capabilities.d.ts +8 -2
  95. package/dist/_internal/shared/listing-types/capabilities.js +6 -1
  96. package/dist/_internal/shared/listing-types/classified/ctas.js +6 -1
  97. package/dist/_internal/shared/listing-types/feature-flags.d.ts +10 -5
  98. package/dist/_internal/shared/listing-types/feature-flags.js +11 -6
  99. package/dist/client/api/useApiQuery.js +17 -6
  100. package/dist/client.d.ts +38 -20
  101. package/dist/client.js +39 -14
  102. package/dist/configs/next.js +10 -2
  103. package/dist/constants/api-endpoints.d.ts +18 -54
  104. package/dist/constants/api-endpoints.js +6 -26
  105. package/dist/constants/field-names.d.ts +6 -24
  106. package/dist/constants/field-names.js +10 -27
  107. package/dist/constants/geo/countries.d.ts +50 -0
  108. package/dist/constants/geo/countries.js +129 -0
  109. package/dist/constants/geo/subdivisions.d.ts +13 -0
  110. package/dist/constants/geo/subdivisions.js +104 -0
  111. package/dist/constants/index.d.ts +2 -2
  112. package/dist/constants/index.js +2 -2
  113. package/dist/constants/table-keys.d.ts +24 -0
  114. package/dist/constants/table-keys.js +28 -0
  115. package/dist/contracts/client-realtime.d.ts +6 -0
  116. package/dist/contracts/extend.d.ts +0 -9
  117. package/dist/contracts/index.d.ts +1 -1
  118. package/dist/contracts/realtime-session.d.ts +12 -12
  119. package/dist/contracts/realtime-session.js +79 -77
  120. package/dist/core/browser.d.ts +1 -1
  121. package/dist/core/browser.js +1 -1
  122. package/dist/core/index.d.ts +1 -1
  123. package/dist/core/index.js +1 -1
  124. package/dist/core/site-config.d.ts +0 -3
  125. package/dist/core/site-config.js +0 -3
  126. package/dist/errors/index.d.ts +1 -1
  127. package/dist/errors/index.js +1 -1
  128. package/dist/errors/messages.d.ts +0 -8
  129. package/dist/errors/messages.js +0 -9
  130. package/dist/features/about/components/DeveloperView.js +7 -2
  131. package/dist/features/about/components/PolicyPageView.js +9 -1
  132. package/dist/features/about/components/PublicProfileView.js +23 -5
  133. package/dist/features/about/schemas/index.d.ts +8 -8
  134. package/dist/features/account/components/AddressFilters.js +32 -11
  135. package/dist/features/account/components/AddressForm.d.ts +26 -25
  136. package/dist/features/account/components/AddressForm.js +81 -103
  137. package/dist/features/account/components/AddressesIndexListing.js +8 -4
  138. package/dist/features/account/components/NotificationBell.js +4 -3
  139. package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
  140. package/dist/features/account/components/UserOffersPanel.js +1 -1
  141. package/dist/features/account/components/UserSidebar.d.ts +3 -4
  142. package/dist/features/account/components/UserSupportView.js +89 -58
  143. package/dist/features/account/components/index.d.ts +1 -7
  144. package/dist/features/account/components/index.js +0 -3
  145. package/dist/features/account/hooks/useAddresses.d.ts +4 -3
  146. package/dist/features/account/hooks/useAddresses.js +4 -6
  147. package/dist/features/account/hooks/useCollapsedSections.d.ts +51 -10
  148. package/dist/features/account/hooks/useCollapsedSections.js +211 -38
  149. package/dist/features/account/hooks/useProfile.d.ts +8 -0
  150. package/dist/features/account/index.d.ts +0 -3
  151. package/dist/features/account/index.js +0 -3
  152. package/dist/features/account/schemas/index.d.ts +0 -92
  153. package/dist/features/account/schemas/index.js +42 -20
  154. package/dist/features/addresses/components/AddressLocationFields.d.ts +13 -0
  155. package/dist/features/addresses/components/AddressLocationFields.js +41 -0
  156. package/dist/features/addresses/hooks/usePostalLookup.d.ts +17 -0
  157. package/dist/features/addresses/hooks/usePostalLookup.js +133 -0
  158. package/dist/features/addresses/schemas/address-form.d.ts +423 -0
  159. package/dist/features/addresses/schemas/address-form.js +212 -0
  160. package/dist/features/addresses/schemas/index.d.ts +1 -0
  161. package/dist/features/addresses/schemas/index.js +8 -0
  162. package/dist/features/admin/actions/admin-read-actions.d.ts +1 -1
  163. package/dist/features/admin/actions/index.d.ts +0 -1
  164. package/dist/features/admin/actions/index.js +0 -1
  165. package/dist/features/admin/actions/notification-actions.js +1 -41
  166. package/dist/features/admin/components/AdminActionIndexView.d.ts +32 -0
  167. package/dist/features/admin/components/AdminActionIndexView.js +128 -0
  168. package/dist/features/admin/components/AdminAdEditorView.js +159 -163
  169. package/dist/features/admin/components/AdminAddressEditorView.js +97 -55
  170. package/dist/features/admin/components/AdminBrandEditorView.d.ts +15 -0
  171. package/dist/features/admin/components/AdminBrandEditorView.js +113 -77
  172. package/dist/features/admin/components/AdminBundleEditorView.d.ts +19 -9
  173. package/dist/features/admin/components/AdminBundleEditorView.js +136 -168
  174. package/dist/features/admin/components/AdminCategoryEditorView.js +120 -43
  175. package/dist/features/admin/components/AdminCouponEditorView.js +145 -109
  176. package/dist/features/admin/components/AdminEmployeeEditorView.js +125 -56
  177. package/dist/features/admin/components/AdminFaqEditorView.js +112 -58
  178. package/dist/features/admin/components/AdminFeatureEditorView.js +108 -68
  179. package/dist/features/admin/components/AdminFulfillmentView.js +5 -2
  180. package/dist/features/admin/components/AdminMediaView.js +3 -3
  181. package/dist/features/admin/components/AdminNavEditorView.js +69 -44
  182. package/dist/features/admin/components/AdminOrderEditorView.js +47 -10
  183. package/dist/features/admin/components/AdminPrizeDrawsView.js +16 -2
  184. package/dist/features/admin/components/AdminSidebar.d.ts +11 -7
  185. package/dist/features/admin/components/AdminSiteSettingsView.js +37 -37
  186. package/dist/features/admin/components/AdminStoreEditorView.js +75 -52
  187. package/dist/features/admin/components/AdminSublistingCategoryEditorView.js +71 -30
  188. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +95 -65
  189. package/dist/features/admin/components/BrandQuickCreateForm.d.ts +10 -0
  190. package/dist/features/admin/components/BrandQuickCreateForm.js +49 -26
  191. package/dist/features/admin/components/CategoryQuickCreateForm.d.ts +11 -0
  192. package/dist/features/admin/components/CategoryQuickCreateForm.js +48 -26
  193. package/dist/features/admin/components/index.d.ts +2 -2
  194. package/dist/features/admin/components/index.js +1 -1
  195. package/dist/features/admin/constants/site-settings-tabs.d.ts +120 -0
  196. package/dist/features/admin/constants/site-settings-tabs.js +152 -0
  197. package/dist/features/admin/index.d.ts +0 -3
  198. package/dist/features/admin/index.js +0 -2
  199. package/dist/features/admin/repository/analytics-rollup.repository.d.ts +35 -0
  200. package/dist/features/admin/repository/analytics-rollup.repository.js +30 -0
  201. package/dist/features/admin/schemas/admin-editor-forms.d.ts +56 -57
  202. package/dist/features/admin/schemas/admin-editor-forms.js +97 -54
  203. package/dist/features/admin/schemas/admin-ops-forms.d.ts +57 -5
  204. package/dist/features/admin/schemas/admin-ops-forms.js +104 -20
  205. package/dist/features/admin/schemas/admin-user-form.js +7 -0
  206. package/dist/features/admin/schemas/firestore.d.ts +48 -95
  207. package/dist/features/admin/schemas/firestore.js +15 -151
  208. package/dist/features/admin/schemas/nav-item-form.js +9 -2
  209. package/dist/features/admin/server.d.ts +0 -4
  210. package/dist/features/admin/server.js +0 -2
  211. package/dist/features/admin/types/index.d.ts +0 -7
  212. package/dist/features/analytics/repository/page-views.repository.d.ts +14 -0
  213. package/dist/features/analytics/repository/page-views.repository.js +24 -0
  214. package/dist/features/analytics/types.d.ts +1 -1
  215. package/dist/features/analytics/types.js +13 -0
  216. package/dist/features/auctions/components/AuctionDetailPageView.js +6 -2
  217. package/dist/features/auctions/components/MarketplaceAuctionCard.js +3 -1
  218. package/dist/features/auth/actions/index.d.ts +0 -1
  219. package/dist/features/auth/actions/index.js +0 -1
  220. package/dist/features/auth/actions/profile-actions.js +4 -3
  221. package/dist/features/auth/actions/realtime-token-actions.js +1 -12
  222. package/dist/features/auth/auth-helpers.js +5 -7
  223. package/dist/features/auth/components/ForgotPasswordView.js +1 -1
  224. package/dist/features/auth/components/Guards.js +2 -1
  225. package/dist/features/auth/components/LoginForm.d.ts +0 -2
  226. package/dist/features/auth/components/LoginForm.js +2 -4
  227. package/dist/features/auth/components/RegisterForm.js +62 -19
  228. package/dist/features/auth/components/ResetPasswordView.js +1 -1
  229. package/dist/features/auth/hooks/useAuth.js +3 -0
  230. package/dist/features/auth/permissions/constants.d.ts +27 -1
  231. package/dist/features/auth/role-predicates.d.ts +75 -7
  232. package/dist/features/auth/role-predicates.js +28 -2
  233. package/dist/features/auth/schemas/firestore.d.ts +22 -0
  234. package/dist/features/auth/schemas/index.d.ts +1 -1
  235. package/dist/features/auth/schemas/index.js +44 -8
  236. package/dist/features/auth/types/index.d.ts +14 -1
  237. package/dist/features/blog/api/route.js +10 -2
  238. package/dist/features/blog/components/BlogIndexListing.js +1 -1
  239. package/dist/features/blog/hooks/useBlog.js +2 -2
  240. package/dist/features/blog/repository/blog.repository.js +3 -1
  241. package/dist/features/blog/schemas/index.d.ts +4 -0
  242. package/dist/features/blog/schemas/index.js +2 -0
  243. package/dist/features/blog/types/index.d.ts +1 -1
  244. package/dist/features/cart/actions/cart-actions.js +13 -4
  245. package/dist/features/cart/utils/pending-ops.js +1 -1
  246. package/dist/features/catalogue/components/CatalogueItemEditorView.d.ts +22 -0
  247. package/dist/features/catalogue/components/CatalogueItemEditorView.js +112 -52
  248. package/dist/features/catalogue/schemas/validation.d.ts +4 -4
  249. package/dist/features/catalogue/schemas/validation.js +47 -10
  250. package/dist/features/categories/components/BrandDetailPageView.js +28 -12
  251. package/dist/features/categories/components/CategoryDetailPageView.js +37 -20
  252. package/dist/features/categories/repository/categories.repository.js +3 -1
  253. package/dist/features/categories/schemas/bundle-form.d.ts +142 -0
  254. package/dist/features/categories/schemas/bundle-form.js +149 -0
  255. package/dist/features/checkout/actions/checkout-value-otp-actions.js +10 -1
  256. package/dist/features/classified/components/ClassifiedContactSellerPanel.js +1 -1
  257. package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +5 -4
  258. package/dist/features/classified/components/ClassifiedDetailPageView.js +47 -18
  259. package/dist/features/consultation/components/ConsultationForm.js +1 -1
  260. package/dist/features/consultation/schemas/index.js +34 -10
  261. package/dist/features/corporate/schemas/index.js +36 -15
  262. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -1
  263. package/dist/features/events/components/EventBanner.js +5 -2
  264. package/dist/features/events/components/EventOfferCard.js +3 -1
  265. package/dist/features/events/components/EventPollWidget.js +1 -1
  266. package/dist/features/events/components/SpinWheelView.js +3 -2
  267. package/dist/features/filters/FilterPanel.js +3 -3
  268. package/dist/features/filters/RangeFilter.d.ts +10 -0
  269. package/dist/features/filters/RangeFilter.js +41 -4
  270. package/dist/features/grouped/components/GroupedListingEditorView.js +2 -1
  271. package/dist/features/history/hooks/useHistory.js +29 -27
  272. package/dist/features/homepage/components/AdSlot.js +3 -1
  273. package/dist/features/homepage/components/GoogleReviewsSection.js +8 -2
  274. package/dist/features/homepage/components/MarketplaceHomepageView.js +58 -15
  275. package/dist/features/homepage/components/SocialFeedSection.js +4 -1
  276. package/dist/features/homepage/hooks/useBlogArticles.js +1 -1
  277. package/dist/features/homepage/lib/live-stats.js +8 -1
  278. package/dist/features/homepage/repository/carousel.repository.js +2 -1
  279. package/dist/features/layout/BottomActions.js +84 -11
  280. package/dist/features/layout/BottomActionsContext.d.ts +1 -6
  281. package/dist/features/layout/BottomActionsContext.js +1 -1
  282. package/dist/features/layout/hooks/useBottomActions.js +2 -2
  283. package/dist/features/layout/hooks/useFormBottomActions.d.ts +12 -1
  284. package/dist/features/layout/hooks/useFormBottomActions.js +12 -6
  285. package/dist/features/live/components/LiveItemDetailPageView.js +4 -1
  286. package/dist/features/lottery/schemas/config-write.d.ts +9 -5
  287. package/dist/features/lottery/schemas/config-write.js +69 -9
  288. package/dist/features/media/finalize.js +3 -1
  289. package/dist/features/media/modals/ImageEditor.js +1 -1
  290. package/dist/features/media/modals/VideoThumbnailSelector.js +5 -2
  291. package/dist/features/media/modals/VideoTrimModal.js +5 -2
  292. package/dist/features/media/upload/MediaUploadField.js +2 -2
  293. package/dist/features/messages/hooks/useConversation.js +18 -4
  294. package/dist/features/messages/hooks/useConversations.js +25 -8
  295. package/dist/features/orders/components/RefundRequestView.js +5 -2
  296. package/dist/features/orders/schemas/buyer-forms.d.ts +6 -3
  297. package/dist/features/orders/schemas/buyer-forms.js +31 -3
  298. package/dist/features/orders/schemas/index.d.ts +2 -2
  299. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -1
  300. package/dist/features/pre-orders/components/PreOrderActionsClient.js +1 -1
  301. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -1
  302. package/dist/features/products/components/GroupSettingsPanel.js +3 -1
  303. package/dist/features/products/components/MakeOfferButton.d.ts +13 -2
  304. package/dist/features/products/components/MakeOfferButton.js +33 -11
  305. package/dist/features/products/components/PrizeDrawDetailPageView.js +4 -1
  306. package/dist/features/products/components/ProductDetailActions.js +0 -1
  307. package/dist/features/products/components/ProductDetailPageView.d.ts +7 -3
  308. package/dist/features/products/components/ProductDetailPageView.js +16 -7
  309. package/dist/features/products/components/ShareButton.js +3 -1
  310. package/dist/features/products/constants/action-defs.d.ts +1 -2
  311. package/dist/features/products/constants/action-defs.js +40 -43
  312. package/dist/features/products/repository/loadProductFeatures.js +10 -2
  313. package/dist/features/products/repository/products.repository.d.ts +5 -1
  314. package/dist/features/products/repository/products.repository.js +25 -2
  315. package/dist/features/products/schemas/firestore.d.ts +7 -3
  316. package/dist/features/products/schemas/product-features.validators.js +3 -0
  317. package/dist/features/promotions/components/CouponCard.js +11 -8
  318. package/dist/features/reviews/actions/review-actions.js +8 -1
  319. package/dist/features/reviews/components/ReviewDetailPageView.js +13 -3
  320. package/dist/features/reviews/components/ReviewDetailShell.js +3 -1
  321. package/dist/features/scams/actions/scam-actions.d.ts +9 -1
  322. package/dist/features/scams/actions/scam-actions.js +52 -12
  323. package/dist/features/scams/components/SellerTrustBadge.d.ts +1 -1
  324. package/dist/features/scams/components/SellerTrustBadge.js +13 -0
  325. package/dist/features/scams/repository/scammer.repository.js +2 -1
  326. package/dist/features/scams/schemas/firestore.d.ts +15 -1
  327. package/dist/features/scams/schemas/report-form.d.ts +5 -5
  328. package/dist/features/scams/schemas/report-form.js +18 -3
  329. package/dist/features/search/action-index/derive.d.ts +49 -0
  330. package/dist/features/search/action-index/derive.js +121 -0
  331. package/dist/features/search/action-index/repository.d.ts +42 -0
  332. package/dist/features/search/action-index/repository.js +100 -0
  333. package/dist/features/search/action-index/settings-entries.d.ts +41 -0
  334. package/dist/features/search/action-index/settings-entries.js +268 -0
  335. package/dist/features/search/action-index/types.d.ts +81 -0
  336. package/dist/features/search/action-index/types.js +102 -0
  337. package/dist/features/search/action-index/validate-entry.d.ts +34 -0
  338. package/dist/features/search/action-index/validate-entry.js +114 -0
  339. package/dist/features/search/hooks/useNavSuggestions.d.ts +5 -1
  340. package/dist/features/search/hooks/useNavSuggestions.js +23 -3
  341. package/dist/features/search/repository/search.repository.js +3 -1
  342. package/dist/features/seller/actions/offer-actions.js +43 -19
  343. package/dist/features/seller/actions/seller-actions.js +29 -5
  344. package/dist/features/seller/components/CategoryChipPicker.d.ts +9 -0
  345. package/dist/features/seller/components/CategoryChipPicker.js +12 -0
  346. package/dist/features/seller/components/FulfillmentView.js +5 -2
  347. package/dist/features/seller/components/PhysicalLocationModal.js +1 -1
  348. package/dist/features/seller/components/PrintCenterView.js +3 -1
  349. package/dist/features/seller/components/SellerAddressesView.js +5 -1
  350. package/dist/features/seller/components/SellerAnalyticsAlertsView.js +83 -43
  351. package/dist/features/seller/components/SellerArtView.d.ts +14 -7
  352. package/dist/features/seller/components/SellerArtView.js +4 -119
  353. package/dist/features/seller/components/SellerBidsView.js +1 -1
  354. package/dist/features/seller/components/SellerClassifiedView.d.ts +14 -7
  355. package/dist/features/seller/components/SellerClassifiedView.js +4 -124
  356. package/dist/features/seller/components/SellerCouponEditorView.d.ts +22 -1
  357. package/dist/features/seller/components/SellerCouponEditorView.js +91 -45
  358. package/dist/features/seller/components/SellerCouponsView.js +1 -1
  359. package/dist/features/seller/components/SellerDigitalCodesView.d.ts +14 -7
  360. package/dist/features/seller/components/SellerDigitalCodesView.js +4 -126
  361. package/dist/features/seller/components/SellerGoogleReviewsView.js +2 -2
  362. package/dist/features/seller/components/SellerListingTypeView.d.ts +66 -0
  363. package/dist/features/seller/components/SellerListingTypeView.js +277 -0
  364. package/dist/features/seller/components/SellerLiveView.d.ts +14 -7
  365. package/dist/features/seller/components/SellerLiveView.js +4 -126
  366. package/dist/features/seller/components/SellerOrdersView.js +3 -3
  367. package/dist/features/seller/components/SellerPayoutMethodsView.js +2 -2
  368. package/dist/features/seller/components/SellerProductShell.d.ts +5 -0
  369. package/dist/features/seller/components/SellerProductShell.js +15 -5
  370. package/dist/features/seller/components/SellerProductsView.js +24 -10
  371. package/dist/features/seller/components/SellerReviewsView.js +47 -16
  372. package/dist/features/seller/components/SellerShippingConfigsView.js +5 -4
  373. package/dist/features/seller/components/SellerSidebar.d.ts +3 -6
  374. package/dist/features/seller/components/SellerStickersView.d.ts +14 -7
  375. package/dist/features/seller/components/SellerStickersView.js +4 -119
  376. package/dist/features/seller/components/SellerStoreCategoriesView.js +3 -2
  377. package/dist/features/seller/components/SellerSupportView.d.ts +31 -0
  378. package/dist/features/seller/components/SellerSupportView.js +100 -0
  379. package/dist/features/seller/components/index.d.ts +4 -8
  380. package/dist/features/seller/components/index.js +2 -4
  381. package/dist/features/seller/index.d.ts +0 -1
  382. package/dist/features/seller/index.js +0 -1
  383. package/dist/features/seller/schemas/coupon-form.d.ts +214 -0
  384. package/dist/features/seller/schemas/coupon-form.js +155 -23
  385. package/dist/features/seller/schemas/offer-forms.d.ts +16 -7
  386. package/dist/features/seller/schemas/offer-forms.js +28 -12
  387. package/dist/features/shell/FormShell.js +2 -2
  388. package/dist/features/shell/QuickFormDrawer.js +2 -2
  389. package/dist/features/shell/SectionForm.d.ts +19 -1
  390. package/dist/features/shell/SectionForm.js +104 -17
  391. package/dist/features/shell/build-sections.d.ts +23 -0
  392. package/dist/features/shell/build-sections.js +106 -8
  393. package/dist/features/shell/field-ui-meta.d.ts +44 -0
  394. package/dist/features/shell/field-ui-meta.js +14 -7
  395. package/dist/features/shell/form-sections.d.ts +46 -0
  396. package/dist/features/shell/form-sections.js +114 -0
  397. package/dist/features/shipments/components/AdminShipmentEditorView.js +87 -64
  398. package/dist/features/shipments/schemas/validation.d.ts +2 -2
  399. package/dist/features/shipments/schemas/validation.js +44 -13
  400. package/dist/features/store-extensions/schemas/custom-role-form.js +6 -2
  401. package/dist/features/store-extensions/schemas/listing-template-form.d.ts +7 -7
  402. package/dist/features/store-extensions/schemas/payout-method-form.js +14 -0
  403. package/dist/features/stores/actions/store-query-actions.js +3 -2
  404. package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -1
  405. package/dist/features/stores/api/[storeSlug]/products/route.js +3 -1
  406. package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
  407. package/dist/features/stores/components/StoreDetailLayoutView.js +12 -3
  408. package/dist/features/support/repository/support.repository.d.ts +21 -0
  409. package/dist/features/support/repository/support.repository.js +63 -0
  410. package/dist/features/support/schemas/firestore.d.ts +27 -2
  411. package/dist/features/support/schemas/firestore.js +2 -0
  412. package/dist/features/support/schemas/ticket-create-form.js +7 -0
  413. package/dist/features/tester/schemas/checklist-item-form.d.ts +43 -0
  414. package/dist/features/tester/schemas/checklist-item-form.js +109 -0
  415. package/dist/features/tester/seed-data/blog-tester-seed-data.js +2 -2
  416. package/dist/features/tester/seed-data/categories-tester-seed-data.js +2 -2
  417. package/dist/features/tester/seed-data/events-tester-seed-data.js +5 -5
  418. package/dist/features/tester/seed-data/orders-tester-seed-data.js +2 -2
  419. package/dist/features/tester/seed-data/products-tester-seed-data.js +48 -49
  420. package/dist/features/tester/seed-data/stores-tester-seed-data.js +3 -3
  421. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +291 -30
  422. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +51 -14
  423. package/dist/features/wishlist/hooks/useWishlistToggle.js +8 -1
  424. package/dist/http/api-handler.js +2 -1
  425. package/dist/index.d.ts +25 -104
  426. package/dist/index.js +38 -143
  427. package/dist/jobs.d.ts +1 -1
  428. package/dist/jobs.js +1 -1
  429. package/dist/monitoring/browser.d.ts +0 -2
  430. package/dist/monitoring/browser.js +12 -1
  431. package/dist/monitoring/index.d.ts +0 -2
  432. package/dist/monitoring/index.js +0 -1
  433. package/dist/next/api/routeHandler.js +9 -4
  434. package/dist/next/index.d.ts +1 -2
  435. package/dist/next/index.js +0 -1
  436. package/dist/next/middleware/index.d.ts +0 -2
  437. package/dist/next/middleware/index.js +0 -1
  438. package/dist/next/routing/route-map.d.ts +8 -7
  439. package/dist/next/routing/route-map.js +10 -3
  440. package/dist/providers/auth-firebase/session.js +3 -1
  441. package/dist/providers/db-firebase/admin-app-lite.js +8 -8
  442. package/dist/providers/db-firebase/admin.js +27 -13
  443. package/dist/providers/db-firebase/browser-stub.d.ts +1 -11
  444. package/dist/providers/db-firebase/browser-stub.js +6 -11
  445. package/dist/providers/db-firebase/index.d.ts +0 -1
  446. package/dist/providers/db-firebase/index.js +0 -1
  447. package/dist/providers/db-firebase/rtdb-paths.d.ts +15 -6
  448. package/dist/providers/db-firebase/rtdb-paths.js +15 -6
  449. package/dist/providers/db-firebase/rtdb-url.d.ts +27 -0
  450. package/dist/providers/db-firebase/rtdb-url.js +50 -0
  451. package/dist/providers/db-firebase/sieve.d.ts +22 -0
  452. package/dist/providers/firebase-client/realtime.d.ts +20 -0
  453. package/dist/providers/firebase-client/realtime.js +34 -1
  454. package/dist/providers.d.ts +1 -1
  455. package/dist/providers.js +1 -1
  456. package/dist/react/hooks/use-action-dispatch.js +8 -2
  457. package/dist/react/hooks/useFormStatePreservation.js +3 -1
  458. package/dist/react/hooks/useListingTypeFlags.d.ts +1 -1
  459. package/dist/react/hooks/useListingTypeFlags.js +1 -1
  460. package/dist/react/hooks/usePendingFilters.js +5 -3
  461. package/dist/react/hooks/usePendingTable.js +15 -3
  462. package/dist/react/hooks/useRealtimeEvent.js +20 -9
  463. package/dist/repositories/index.d.ts +0 -1
  464. package/dist/repositories/index.js +0 -1
  465. package/dist/schemas/registry.d.ts +197 -232
  466. package/dist/schemas/registry.js +5 -6
  467. package/dist/schemas/webhooks/razorpay.d.ts +50 -50
  468. package/dist/security/authorization.d.ts +9 -0
  469. package/dist/security/authorization.js +16 -2
  470. package/dist/security/browser.d.ts +1 -3
  471. package/dist/security/browser.js +5 -2
  472. package/dist/security/index.d.ts +1 -3
  473. package/dist/security/index.js +19 -2
  474. package/dist/security/pii-encrypt.js +16 -0
  475. package/dist/security/pii-schemas.d.ts +0 -14
  476. package/dist/security/pii-schemas.js +7 -15
  477. package/dist/seed/_helpers/category-forest.js +2 -2
  478. package/dist/seed/_helpers/media.d.ts +19 -0
  479. package/dist/seed/_helpers/media.js +75 -0
  480. package/dist/seed/blog-posts-seed-data.js +17 -17
  481. package/dist/seed/carousel-slides-seed-data.js +7 -7
  482. package/dist/seed/cart-seed-data.js +13 -13
  483. package/dist/seed/categories-seed-data.js +10 -10
  484. package/dist/seed/events-seed-data.js +24 -24
  485. package/dist/seed/factories/product.factory.js +4 -4
  486. package/dist/seed/factories/store.factory.js +3 -3
  487. package/dist/seed/factories/user.factory.js +2 -2
  488. package/dist/seed/grouped-listings-seed-data.js +11 -11
  489. package/dist/seed/homepage-sections-seed-data.js +2 -2
  490. package/dist/seed/index.d.ts +0 -1
  491. package/dist/seed/index.js +0 -1
  492. package/dist/seed/manifest.d.ts +1 -1
  493. package/dist/seed/manifest.js +0 -5
  494. package/dist/seed/notifications-seed-data.js +20 -1
  495. package/dist/seed/orders-seed-data.js +2 -2
  496. package/dist/seed/products-art-seed-data.js +16 -16
  497. package/dist/seed/products-auctions-seed-data.js +34 -34
  498. package/dist/seed/products-classifieds-seed-data.js +35 -37
  499. package/dist/seed/products-digital-codes-seed-data.js +20 -20
  500. package/dist/seed/products-live-items-seed-data.js +11 -11
  501. package/dist/seed/products-preorders-seed-data.js +13 -13
  502. package/dist/seed/products-prize-draws-seed-data.js +43 -43
  503. package/dist/seed/products-standard-seed-data.js +54 -54
  504. package/dist/seed/products-stickers-seed-data.js +15 -15
  505. package/dist/seed/reviews-seed-data.js +4 -4
  506. package/dist/seed/scammers-seed-data.js +3 -3
  507. package/dist/seed/site-settings-seed-data.js +11 -24
  508. package/dist/seed/store-extensions-seed-data.js +10 -10
  509. package/dist/seed/stores-seed-data.js +11 -11
  510. package/dist/seed/support-tickets-seed-data.d.ts +14 -0
  511. package/dist/seed/support-tickets-seed-data.js +20 -1
  512. package/dist/seed/users-seed-data.js +20 -20
  513. package/dist/server-entry.d.ts +0 -1
  514. package/dist/server-entry.js +0 -1
  515. package/dist/server.d.ts +9 -6
  516. package/dist/server.js +7 -13
  517. package/dist/styles.css +248 -68
  518. package/dist/tailwind-utilities.css +1 -1
  519. package/dist/tokens/themes/default-dark.js +2 -2
  520. package/dist/tokens/themes/default-light.js +2 -2
  521. package/dist/tokens/tokens.css +24 -4
  522. package/dist/ui/components/ActionRow.d.ts +50 -0
  523. package/dist/ui/components/ActionRow.js +53 -0
  524. package/dist/ui/components/ActionRow.style.css +145 -0
  525. package/dist/ui/components/Drawer.d.ts +10 -0
  526. package/dist/ui/components/Drawer.js +2 -1
  527. package/dist/ui/components/FilterDrawer.js +4 -1
  528. package/dist/ui/components/FilterDrawer.style.css +6 -12
  529. package/dist/ui/components/FormActionBar.js +14 -1
  530. package/dist/ui/components/FormActionBar.style.css +12 -11
  531. package/dist/ui/components/ListingLayout.js +8 -1
  532. package/dist/ui/components/ListingLayout.style.css +6 -13
  533. package/dist/ui/components/Modal.d.ts +15 -1
  534. package/dist/ui/components/Modal.js +17 -3
  535. package/dist/ui/components/QuickCreateModal.js +2 -2
  536. package/dist/ui/components/QuickCreateModal.style.css +78 -84
  537. package/dist/ui/components/RecordDetailModal.js +2 -2
  538. package/dist/ui/components/SideDrawer.d.ts +8 -0
  539. package/dist/ui/components/SideDrawer.js +2 -1
  540. package/dist/ui/components/SideDrawer.style.css +6 -3
  541. package/dist/ui/components/SideModal.d.ts +11 -1
  542. package/dist/ui/components/SideModal.js +3 -2
  543. package/dist/ui/components/SideModal.style.css +14 -0
  544. package/dist/ui/components/Typography.style.css +33 -24
  545. package/dist/ui/components/index.style.css +1 -0
  546. package/dist/ui/components/toolbar-collapse.js +1 -2
  547. package/dist/ui/forms/FormShell.style.css +260 -311
  548. package/dist/ui/index.d.ts +2 -0
  549. package/dist/ui/index.js +1 -0
  550. package/dist/utils/index.d.ts +0 -1
  551. package/dist/utils/index.js +0 -1
  552. package/dist/validation/index.d.ts +1 -1
  553. package/dist/validation/index.js +1 -1
  554. package/dist/validation/schemas.d.ts +0 -19
  555. package/dist/validation/schemas.js +8 -19
  556. package/package.json +1 -1
  557. package/scripts/seed-cli.mjs +3 -6
@@ -19,8 +19,7 @@ export type { CacheConfig } from "./cache-middleware";
19
19
  export { createApiMiddleware, runChain, buildBaseContext, } from "./middleware/chain";
20
20
  export type { CreateApiMiddlewareConfig } from "./middleware/chain";
21
21
  export { piiScrubberMiddleware } from "./middleware/pii-scrubber";
22
- export { createPiiRedactorMiddleware } from "./middleware/pii-redactor";
23
- export type { BaseRequestContext, AuthRequestContext, Middleware, PiiRedactionRule, } from "./middleware";
22
+ export type { BaseRequestContext, AuthRequestContext, Middleware, } from "./middleware";
24
23
  export { successResponse, errorResponse, ApiErrors } from "./api/api-response";
25
24
  export type { ApiSuccessResponse, ApiErrorResponse } from "./api/api-response";
26
25
  export { GlobalError } from "./components/GlobalError";
@@ -19,7 +19,6 @@ export { withCache, invalidateCache } from "./cache-middleware";
19
19
  // PII-aware composable middleware chain (Phase 21)
20
20
  export { createApiMiddleware, runChain, buildBaseContext, } from "./middleware/chain";
21
21
  export { piiScrubberMiddleware } from "./middleware/pii-scrubber";
22
- export { createPiiRedactorMiddleware } from "./middleware/pii-redactor";
23
22
  // Standardized API response helpers
24
23
  export { successResponse, errorResponse, ApiErrors } from "./api/api-response";
25
24
  // Error UI view components
@@ -1,6 +1,4 @@
1
1
  export type { BaseRequestContext, AuthRequestContext, Middleware, } from "./types";
2
2
  export { piiScrubberMiddleware } from "./pii-scrubber";
3
- export { createPiiRedactorMiddleware } from "./pii-redactor";
4
- export type { PiiRedactionRule } from "./pii-redactor";
5
3
  export { createApiMiddleware, runChain, buildBaseContext } from "./chain";
6
4
  export type { CreateApiMiddlewareConfig } from "./chain";
@@ -1,3 +1,2 @@
1
1
  export { piiScrubberMiddleware } from "./pii-scrubber";
2
- export { createPiiRedactorMiddleware } from "./pii-redactor";
3
2
  export { createApiMiddleware, runChain, buildBaseContext } from "./chain";
@@ -149,7 +149,6 @@ export declare const DEFAULT_ROUTE_MAP: {
149
149
  readonly ORDER_INVOICE: (id: string) => string;
150
150
  readonly ORDER_PAYMENT: (id: string) => string;
151
151
  readonly NOTIFICATIONS: "/user/notifications";
152
- readonly MESSAGES: "/user/messages";
153
152
  /** Plan §10 — claimed-coupons wallet (Active / Expired / Used tabs). */
154
153
  readonly CLAIMED_COUPONS: "/user/coupons";
155
154
  readonly BECOME_SELLER: "/user/become-seller";
@@ -175,7 +174,6 @@ export declare const DEFAULT_ROUTE_MAP: {
175
174
  };
176
175
  readonly STORE: {
177
176
  readonly DASHBOARD: "/store";
178
- readonly MESSAGES: "/store/messages";
179
177
  readonly PRODUCTS: "/store/products";
180
178
  readonly PRODUCTS_NEW: "/store/products/new";
181
179
  readonly PRODUCTS_EDIT: (id: string) => string;
@@ -211,6 +209,8 @@ export declare const DEFAULT_ROUTE_MAP: {
211
209
  readonly FEATURES_NEW: "/store/features/new";
212
210
  readonly FEATURES_EDIT: (id: string) => string;
213
211
  readonly SLUG: "/store/slug";
212
+ /** Tickets raised ABOUT this store (W11). Read-only for the seller. */
213
+ readonly SUPPORT: "/store/support";
214
214
  readonly BUNDLES: "/store/bundles";
215
215
  readonly BUNDLES_NEW: "/store/bundles/new";
216
216
  readonly BUNDLES_EDIT: (id: string) => string;
@@ -282,6 +282,7 @@ export declare const DEFAULT_ROUTE_MAP: {
282
282
  readonly CAROUSELS_EDIT: (id: string) => string;
283
283
  readonly SECTIONS: "/admin/sections";
284
284
  readonly NAVIGATION: "/admin/navigation";
285
+ readonly ACTION_INDEX: "/admin/action-index";
285
286
  readonly NAVIGATION_NEW: "/admin/navigation/new";
286
287
  readonly NAVIGATION_EDIT: (id: string) => string;
287
288
  readonly CATEGORIES: "/admin/categories";
@@ -333,7 +334,6 @@ export declare const DEFAULT_ROUTE_MAP: {
333
334
  readonly EVENT_ENTRIES: (id: string) => string;
334
335
  readonly STORES: "/admin/stores";
335
336
  readonly STORE_DETAIL: (id: string) => string;
336
- readonly FEATURE_FLAGS: "/admin/feature-flags";
337
337
  readonly COPILOT: "/admin/copilot";
338
338
  readonly ADS: "/admin/ads";
339
339
  readonly ADS_NEW: "/admin/ads/new";
@@ -552,7 +552,6 @@ export declare const ROUTES: {
552
552
  readonly ORDER_INVOICE: (id: string) => string;
553
553
  readonly ORDER_PAYMENT: (id: string) => string;
554
554
  readonly NOTIFICATIONS: "/user/notifications";
555
- readonly MESSAGES: "/user/messages";
556
555
  /** Plan §10 — claimed-coupons wallet (Active / Expired / Used tabs). */
557
556
  readonly CLAIMED_COUPONS: "/user/coupons";
558
557
  readonly BECOME_SELLER: "/user/become-seller";
@@ -578,7 +577,6 @@ export declare const ROUTES: {
578
577
  };
579
578
  readonly STORE: {
580
579
  readonly DASHBOARD: "/store";
581
- readonly MESSAGES: "/store/messages";
582
580
  readonly PRODUCTS: "/store/products";
583
581
  readonly PRODUCTS_NEW: "/store/products/new";
584
582
  readonly PRODUCTS_EDIT: (id: string) => string;
@@ -614,6 +612,8 @@ export declare const ROUTES: {
614
612
  readonly FEATURES_NEW: "/store/features/new";
615
613
  readonly FEATURES_EDIT: (id: string) => string;
616
614
  readonly SLUG: "/store/slug";
615
+ /** Tickets raised ABOUT this store (W11). Read-only for the seller. */
616
+ readonly SUPPORT: "/store/support";
617
617
  readonly BUNDLES: "/store/bundles";
618
618
  readonly BUNDLES_NEW: "/store/bundles/new";
619
619
  readonly BUNDLES_EDIT: (id: string) => string;
@@ -685,6 +685,7 @@ export declare const ROUTES: {
685
685
  readonly CAROUSELS_EDIT: (id: string) => string;
686
686
  readonly SECTIONS: "/admin/sections";
687
687
  readonly NAVIGATION: "/admin/navigation";
688
+ readonly ACTION_INDEX: "/admin/action-index";
688
689
  readonly NAVIGATION_NEW: "/admin/navigation/new";
689
690
  readonly NAVIGATION_EDIT: (id: string) => string;
690
691
  readonly CATEGORIES: "/admin/categories";
@@ -736,7 +737,6 @@ export declare const ROUTES: {
736
737
  readonly EVENT_ENTRIES: (id: string) => string;
737
738
  readonly STORES: "/admin/stores";
738
739
  readonly STORE_DETAIL: (id: string) => string;
739
- readonly FEATURE_FLAGS: "/admin/feature-flags";
740
740
  readonly COPILOT: "/admin/copilot";
741
741
  readonly ADS: "/admin/ads";
742
742
  readonly ADS_NEW: "/admin/ads/new";
@@ -818,7 +818,6 @@ export declare const ROUTES: {
818
818
  /** @deprecated Use ROUTES.STORE instead */
819
819
  export declare const SELLER_ROUTES: {
820
820
  readonly DASHBOARD: "/store";
821
- readonly MESSAGES: "/store/messages";
822
821
  readonly PRODUCTS: "/store/products";
823
822
  readonly PRODUCTS_NEW: "/store/products/new";
824
823
  readonly PRODUCTS_EDIT: (id: string) => string;
@@ -854,6 +853,8 @@ export declare const SELLER_ROUTES: {
854
853
  readonly FEATURES_NEW: "/store/features/new";
855
854
  readonly FEATURES_EDIT: (id: string) => string;
856
855
  readonly SLUG: "/store/slug";
856
+ /** Tickets raised ABOUT this store (W11). Read-only for the seller. */
857
+ readonly SUPPORT: "/store/support";
857
858
  readonly BUNDLES: "/store/bundles";
858
859
  readonly BUNDLES_NEW: "/store/bundles/new";
859
860
  readonly BUNDLES_EDIT: (id: string) => string;
@@ -153,7 +153,6 @@ export const DEFAULT_ROUTE_MAP = {
153
153
  ORDER_INVOICE: (id) => `/user/orders/${id}/invoice`,
154
154
  ORDER_PAYMENT: (id) => `/user/orders/${id}/payment`,
155
155
  NOTIFICATIONS: "/user/notifications",
156
- MESSAGES: "/user/messages",
157
156
  /** Plan §10 — claimed-coupons wallet (Active / Expired / Used tabs). */
158
157
  CLAIMED_COUPONS: "/user/coupons",
159
158
  BECOME_SELLER: "/user/become-seller",
@@ -179,7 +178,6 @@ export const DEFAULT_ROUTE_MAP = {
179
178
  },
180
179
  STORE: {
181
180
  DASHBOARD: "/store",
182
- MESSAGES: "/store/messages",
183
181
  PRODUCTS: "/store/products",
184
182
  PRODUCTS_NEW: "/store/products/new",
185
183
  PRODUCTS_EDIT: (id) => `/store/products/${id}/edit`,
@@ -215,6 +213,8 @@ export const DEFAULT_ROUTE_MAP = {
215
213
  FEATURES_NEW: "/store/features/new",
216
214
  FEATURES_EDIT: (id) => `/store/features/${id}/edit`,
217
215
  SLUG: "/store/slug",
216
+ /** Tickets raised ABOUT this store (W11). Read-only for the seller. */
217
+ SUPPORT: "/store/support",
218
218
  // SB1-J — bundles + prize draws
219
219
  BUNDLES: "/store/bundles",
220
220
  BUNDLES_NEW: "/store/bundles/new",
@@ -296,6 +296,14 @@ export const DEFAULT_ROUTE_MAP = {
296
296
  CAROUSELS_EDIT: (id) => `/admin/carousels/${id}/edit`,
297
297
  SECTIONS: "/admin/sections",
298
298
  NAVIGATION: "/admin/navigation",
299
+ /*
300
+ * The action index (W7 / D7) — one control plane for every page, setting
301
+ * and toggle a user can reach. It supersedes NAVIGATION and
302
+ * SETTINGS_NAVIGATION, neither of whose data ever reached a sidebar:
303
+ * `filterNavItems` short-circuits on a missing `id`, and no nav item had
304
+ * one until W6.
305
+ */
306
+ ACTION_INDEX: "/admin/action-index",
299
307
  NAVIGATION_NEW: "/admin/navigation/new",
300
308
  NAVIGATION_EDIT: (id) => `/admin/navigation/${id}/edit`,
301
309
  CATEGORIES: "/admin/categories",
@@ -348,7 +356,6 @@ export const DEFAULT_ROUTE_MAP = {
348
356
  EVENT_ENTRIES: (id) => `/admin/events/${id}/entries`,
349
357
  STORES: "/admin/stores",
350
358
  STORE_DETAIL: (id) => `/admin/stores/${id}/view`,
351
- FEATURE_FLAGS: "/admin/feature-flags",
352
359
  COPILOT: "/admin/copilot",
353
360
  ADS: "/admin/ads",
354
361
  ADS_NEW: "/admin/ads/new",
@@ -71,8 +71,10 @@ export const firebaseSessionProvider = {
71
71
  await getAdminAuthLite().revokeRefreshTokens(decoded.uid);
72
72
  }
73
73
  catch (_err) {
74
+ // Best-effort teardown: an expired/revoked/malformed cookie cannot be
75
+ // verified, and that is the state destroySession is trying to reach —
76
+ // reporting it would alarm on the success case.
74
77
  void normalizeError(_err);
75
- // Best-effort: if cookie is already invalid, treat as already destroyed
76
78
  }
77
79
  },
78
80
  };
@@ -1,4 +1,9 @@
1
1
  import { initializeApp, getApps, cert } from "firebase-admin/app";
2
+ // One resolver, not a second copy — this file duplicated admin.ts's URL
3
+ // logic byte-for-byte, so the region-wrong fallback bug existed twice.
4
+ // Imported from its own dependency-free module, NOT from ./admin, because the
5
+ // whole point of admin-app-lite is not pulling the full admin module in.
6
+ import { resolveRtdbUrl } from "./rtdb-url";
2
7
  function nodePath() { return require("path"); }
3
8
  function nodeFs() { return require("fs"); }
4
9
  // process.cwd() is Node.js-only; access via module.require so the Edge
@@ -26,17 +31,14 @@ export function getAdminAppLite() {
26
31
  let app;
27
32
  if (nodeFs().existsSync(keyPath)) {
28
33
  const sa = JSON.parse(nodeFs().readFileSync(keyPath, "utf8"));
29
- const dbUrl = process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL ??
30
- `https://${sa.project_id}-default-rtdb.firebaseio.com`;
34
+ const dbUrl = resolveRtdbUrl();
31
35
  app = initializeApp({ credential: cert(keyPath), databaseURL: dbUrl, ...(storageBucket && { storageBucket }) });
32
36
  }
33
37
  else if (process.env.FIREBASE_ADMIN_PROJECT_ID &&
34
38
  process.env.FIREBASE_ADMIN_CLIENT_EMAIL &&
35
39
  process.env.FIREBASE_ADMIN_PRIVATE_KEY) {
36
40
  const projectId = process.env.FIREBASE_ADMIN_PROJECT_ID.trim();
37
- const dbUrl = process.env.FIREBASE_ADMIN_DATABASE_URL?.trim() ??
38
- process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL?.trim() ??
39
- `https://${projectId}-default-rtdb.firebaseio.com`;
41
+ const dbUrl = resolveRtdbUrl();
40
42
  app = initializeApp({
41
43
  credential: cert({
42
44
  projectId,
@@ -63,9 +65,7 @@ export function getAdminAppLite() {
63
65
  : {};
64
66
  const projectId = firebaseConfig.projectId ?? process.env.GCLOUD_PROJECT ?? "";
65
67
  const dbUrl = firebaseConfig.databaseURL ??
66
- process.env.FIREBASE_ADMIN_DATABASE_URL ??
67
- process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL ??
68
- (projectId ? `https://${projectId}-default-rtdb.firebaseio.com` : undefined);
68
+ resolveRtdbUrl();
69
69
  app = initializeApp({
70
70
  ...(dbUrl && { databaseURL: dbUrl }),
71
71
  ...(storageBucket && { storageBucket }),
@@ -1,4 +1,5 @@
1
1
  import { normalizeError } from "../../errors/normalize";
2
+ import { resolveRtdbUrl } from "./rtdb-url";
2
3
  function nodePath() { return require("path"); }
3
4
  function nodeFs() { return require("fs"); }
4
5
  // process.cwd() is Node.js-only; access via module.require so the Edge
@@ -63,23 +64,36 @@ export function getAdminApp() {
63
64
  return existing;
64
65
  }
65
66
  const keyPath = nodePath().join(nodeCwd(), "firebase-admin-key.json");
66
- const storageBucket = process.env.FIREBASE_ADMIN_STORAGE_BUCKET?.trim() ??
67
+ /*
68
+ * 🛑 `||`, not `??`.
69
+ *
70
+ * A Vercel env var that EXISTS but is empty yields `""`, and `""` is not
71
+ * nullish — so `??` short-circuits, the NEXT_PUBLIC fallback never runs, and
72
+ * `...(storageBucket && …)` then drops the key entirely. The app initialises
73
+ * with NO bucket and every own-bucket media request 500s with
74
+ * "Bucket name not specified".
75
+ *
76
+ * Invisible locally: `.env.local` does not define FIREBASE_ADMIN_STORAGE_BUCKET
77
+ * at all, so the fallback always runs here. `scripts/test-storage-flow.mjs`
78
+ * and `scripts/test-storage.mjs` both already use `||` for this same
79
+ * expression — this was the odd one out.
80
+ */
81
+ const storageBucket = process.env.FIREBASE_ADMIN_STORAGE_BUCKET?.trim() ||
67
82
  process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET?.trim();
68
83
  let app;
69
84
  try {
70
85
  if (nodeFs().existsSync(keyPath)) {
71
86
  const sa = JSON.parse(nodeFs().readFileSync(keyPath, "utf8"));
72
- const dbUrl = process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL ??
73
- `https://${sa.project_id}-default-rtdb.firebaseio.com`;
87
+ // Was NEXT_PUBLIC-only here while the other two branches honoured
88
+ // FIREBASE_ADMIN_DATABASE_URL, so setting it had no effect on this path.
89
+ const dbUrl = resolveRtdbUrl();
74
90
  app = initializeApp({ credential: cert(keyPath), databaseURL: dbUrl, ...(storageBucket && { storageBucket }) });
75
91
  }
76
92
  else if (process.env.FIREBASE_ADMIN_PROJECT_ID &&
77
93
  process.env.FIREBASE_ADMIN_CLIENT_EMAIL &&
78
94
  process.env.FIREBASE_ADMIN_PRIVATE_KEY) {
79
95
  const projectId = process.env.FIREBASE_ADMIN_PROJECT_ID.trim();
80
- const dbUrl = process.env.FIREBASE_ADMIN_DATABASE_URL?.trim() ??
81
- process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL?.trim() ??
82
- `https://${projectId}-default-rtdb.firebaseio.com`;
96
+ const dbUrl = resolveRtdbUrl();
83
97
  app = initializeApp({
84
98
  credential: cert({
85
99
  projectId,
@@ -105,12 +119,9 @@ export function getAdminApp() {
105
119
  ? JSON.parse(process.env.FIREBASE_CONFIG)
106
120
  : {};
107
121
  const projectId = firebaseConfig.projectId ?? process.env.GCLOUD_PROJECT ?? "";
108
- const dbUrl = firebaseConfig.databaseURL ??
109
- process.env.FIREBASE_ADMIN_DATABASE_URL ??
110
- process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL ??
111
- (projectId
112
- ? `https://${projectId}-default-rtdb.firebaseio.com`
113
- : undefined);
122
+ // FIREBASE_CONFIG is injected by the Functions runtime and is
123
+ // authoritative there; env vars are the fallback for other runtimes.
124
+ const dbUrl = firebaseConfig.databaseURL || resolveRtdbUrl();
114
125
  app = initializeApp({
115
126
  ...(dbUrl && { databaseURL: dbUrl }),
116
127
  ...(storageBucket && { storageBucket }),
@@ -153,8 +164,11 @@ export function getAdminDb() {
153
164
  db.settings({ ignoreUndefinedProperties: true });
154
165
  }
155
166
  catch (_err) {
167
+ // Firestore rejects a second settings() call on an already-initialised
168
+ // instance, which is the only way this throws (HMR reload / duplicate
169
+ // module instance re-entering the memoised bootstrap). The instance is
170
+ // fully usable either way, so there is nothing degraded to report.
156
171
  void normalizeError(_err);
157
- // Already configured — safe to ignore.
158
172
  }
159
173
  set("__mohasinac_firebase_admin_db__", db);
160
174
  return db;
@@ -22,17 +22,7 @@ export declare function prepareForFirestore(data: any): any;
22
22
  export declare function deserializeTimestamps<T>(data: any): T;
23
23
  export declare const FirebaseRepository: any;
24
24
  export declare const FirebaseSieveRepository: any;
25
- export declare const FirebaseRealtimeRepository: any;
26
25
  export declare const firebaseDbProvider: any;
27
- export declare const RTDB_PATHS: {
28
- readonly PRESENCE: "presence";
29
- readonly CHAT: "chat";
30
- readonly NOTIFICATIONS: "notifications";
31
- readonly LIVE_UPDATES: "live_updates";
32
- readonly AUTH_EVENTS: "auth_events";
33
- readonly PAYMENT_EVENTS: "payment_events";
34
- readonly BULK_EVENTS: "bulk_events";
35
- readonly SEED_EVENTS: "seed_events";
36
- };
26
+ export { RTDB_PATHS } from "./rtdb-paths";
37
27
  export { buildFirebaseClientConfig, normalizeFirebaseConfigValue } from './client-config';
38
28
  export type { FirebaseClientConfig } from './client-config';
@@ -40,17 +40,12 @@ export function deserializeTimestamps(data) {
40
40
  }
41
41
  export const FirebaseRepository = null;
42
42
  export const FirebaseSieveRepository = null;
43
- export const FirebaseRealtimeRepository = null;
44
43
  export const firebaseDbProvider = null;
45
- export const RTDB_PATHS = {
46
- PRESENCE: "presence",
47
- CHAT: "chat",
48
- NOTIFICATIONS: "notifications",
49
- LIVE_UPDATES: "live_updates",
50
- AUTH_EVENTS: "auth_events",
51
- PAYMENT_EVENTS: "payment_events",
52
- BULK_EVENTS: "bulk_events",
53
- SEED_EVENTS: "seed_events",
54
- };
44
+ // Re-exported, NOT re-declared. This file is the `browser` resolution target, so
45
+ // the byte-for-byte copy that used to live here meant client code and server
46
+ // code read two independently-maintained definitions of the same constant, with
47
+ // nothing guarding the drift. `rtdb-paths.ts` has no imports, so it is safe to
48
+ // pull into a browser bundle directly.
49
+ export { RTDB_PATHS } from "./rtdb-paths";
55
50
  // Client config builder � safe in all environments
56
51
  export { buildFirebaseClientConfig, normalizeFirebaseConfigValue } from './client-config';
@@ -20,7 +20,6 @@ export type { DocumentSnapshot } from "firebase-admin/firestore";
20
20
  export { FirebaseRepository } from "./base";
21
21
  export { BaseRepository } from "./base.repository";
22
22
  export { FirebaseSieveRepository } from "./sieve";
23
- export { FirebaseRealtimeRepository } from "./realtime";
24
23
  export { RTDB_PATHS } from "./rtdb-paths";
25
24
  import type { IDbProvider } from "../../contracts";
26
25
  export declare const firebaseDbProvider: IDbProvider;
@@ -27,7 +27,6 @@ export { firebaseFieldOps } from "./field-ops";
27
27
  export { FirebaseRepository } from "./base";
28
28
  export { BaseRepository } from "./base.repository";
29
29
  export { FirebaseSieveRepository } from "./sieve";
30
- export { FirebaseRealtimeRepository } from "./realtime";
31
30
  // Re-export RTDB paths
32
31
  export { RTDB_PATHS } from "./rtdb-paths";
33
32
  import { FirebaseRepository as _FirebaseRepository } from "./base";
@@ -1,13 +1,22 @@
1
1
  /**
2
- * Shared Realtime Database path constants for auth/payment/bulk event channels.
2
+ * Shared Realtime Database path constants for the auth/payment/bulk event channels.
3
+ *
4
+ * 🛑 Only paths that are actually referenced through this constant belong here.
5
+ * Five keys were removed on 2026-08-29 — `PRESENCE`, `CHAT`, `NOTIFICATIONS`,
6
+ * `LIVE_UPDATES`, `SEED_EVENTS` — every one with **zero consumers**, because
7
+ * each live call site hardcodes its path string instead. A constant nobody uses
8
+ * is not a source of truth; it is a second place for the value to be wrong, and
9
+ * three of those five named RTDB nodes that no longer exist at all.
10
+ *
11
+ * If you add a key, migrate the call sites to it in the same change.
12
+ *
13
+ * This module has NO imports on purpose — that is what lets `browser-stub.ts`
14
+ * re-export it rather than keep the byte-for-byte duplicate it used to carry.
15
+ * The stub is the `browser` resolution target, so that duplicate meant client
16
+ * code and server code were reading two independently-maintained copies.
3
17
  */
4
18
  export declare const RTDB_PATHS: {
5
- readonly PRESENCE: "presence";
6
- readonly CHAT: "chat";
7
- readonly NOTIFICATIONS: "notifications";
8
- readonly LIVE_UPDATES: "live_updates";
9
19
  readonly AUTH_EVENTS: "auth_events";
10
20
  readonly PAYMENT_EVENTS: "payment_events";
11
21
  readonly BULK_EVENTS: "bulk_events";
12
- readonly SEED_EVENTS: "seed_events";
13
22
  };
@@ -1,13 +1,22 @@
1
1
  /**
2
- * Shared Realtime Database path constants for auth/payment/bulk event channels.
2
+ * Shared Realtime Database path constants for the auth/payment/bulk event channels.
3
+ *
4
+ * 🛑 Only paths that are actually referenced through this constant belong here.
5
+ * Five keys were removed on 2026-08-29 — `PRESENCE`, `CHAT`, `NOTIFICATIONS`,
6
+ * `LIVE_UPDATES`, `SEED_EVENTS` — every one with **zero consumers**, because
7
+ * each live call site hardcodes its path string instead. A constant nobody uses
8
+ * is not a source of truth; it is a second place for the value to be wrong, and
9
+ * three of those five named RTDB nodes that no longer exist at all.
10
+ *
11
+ * If you add a key, migrate the call sites to it in the same change.
12
+ *
13
+ * This module has NO imports on purpose — that is what lets `browser-stub.ts`
14
+ * re-export it rather than keep the byte-for-byte duplicate it used to carry.
15
+ * The stub is the `browser` resolution target, so that duplicate meant client
16
+ * code and server code were reading two independently-maintained copies.
3
17
  */
4
18
  export const RTDB_PATHS = {
5
- PRESENCE: "presence",
6
- CHAT: "chat",
7
- NOTIFICATIONS: "notifications",
8
- LIVE_UPDATES: "live_updates",
9
19
  AUTH_EVENTS: "auth_events",
10
20
  PAYMENT_EVENTS: "payment_events",
11
21
  BULK_EVENTS: "bulk_events",
12
- SEED_EVENTS: "seed_events",
13
22
  };
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Resolve the Realtime Database URL from the environment.
3
+ *
4
+ * Its own module, with **no imports**, because both `admin.ts` and
5
+ * `admin-app-lite.ts` need it and `admin-app-lite` exists precisely to avoid
6
+ * pulling in the full admin module. They previously carried byte-for-byte
7
+ * duplicate resolution logic, which meant the bug below existed twice.
8
+ *
9
+ * 🛑 Returns `undefined` rather than guessing.
10
+ *
11
+ * All six copies used to fall back to `https://${projectId}-default-rtdb.firebaseio.com`.
12
+ * That is the **us-central1** URL shape; this project's instance lives at
13
+ * `…-default-rtdb.asia-southeast1.firebasedatabase.app`. So whenever the env var
14
+ * was missing, every server RTDB write silently targeted a database that does
15
+ * not exist — and since all nine RTDB writers wrap their call in a swallowing
16
+ * try/catch, messaging, bids, job status and payment signalling would every one
17
+ * of them degrade to "nothing ever updates", with clean warn-level logs.
18
+ *
19
+ * A guessed URL cannot be correct for a non-default region, so guessing buys
20
+ * nothing and costs the ability to notice. With no `databaseURL`,
21
+ * `getAdminRealtimeDb()` fails loudly at first use instead, which is the
22
+ * outcome you want.
23
+ *
24
+ * `||` not `??`: an env var that is present but empty must fall through, and
25
+ * `??` only falls through on null/undefined.
26
+ */
27
+ export declare function resolveRtdbUrl(): string | undefined;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Resolve the Realtime Database URL from the environment.
3
+ *
4
+ * Its own module, with **no imports**, because both `admin.ts` and
5
+ * `admin-app-lite.ts` need it and `admin-app-lite` exists precisely to avoid
6
+ * pulling in the full admin module. They previously carried byte-for-byte
7
+ * duplicate resolution logic, which meant the bug below existed twice.
8
+ *
9
+ * 🛑 Returns `undefined` rather than guessing.
10
+ *
11
+ * All six copies used to fall back to `https://${projectId}-default-rtdb.firebaseio.com`.
12
+ * That is the **us-central1** URL shape; this project's instance lives at
13
+ * `…-default-rtdb.asia-southeast1.firebasedatabase.app`. So whenever the env var
14
+ * was missing, every server RTDB write silently targeted a database that does
15
+ * not exist — and since all nine RTDB writers wrap their call in a swallowing
16
+ * try/catch, messaging, bids, job status and payment signalling would every one
17
+ * of them degrade to "nothing ever updates", with clean warn-level logs.
18
+ *
19
+ * A guessed URL cannot be correct for a non-default region, so guessing buys
20
+ * nothing and costs the ability to notice. With no `databaseURL`,
21
+ * `getAdminRealtimeDb()` fails loudly at first use instead, which is the
22
+ * outcome you want.
23
+ *
24
+ * `||` not `??`: an env var that is present but empty must fall through, and
25
+ * `??` only falls through on null/undefined.
26
+ */
27
+ export function resolveRtdbUrl() {
28
+ // 🛑 Emulator first.
29
+ //
30
+ // `firebase.json` has declared a database emulator on port 9000 for a long
31
+ // time and NOTHING ever connected to it. Client writes were shielded only
32
+ // because every rule is `.write: false`; server writes use the Admin SDK and
33
+ // bypass rules entirely — so `npm run dev` wrote to PRODUCTION. A local bid
34
+ // overwrote the prod `auction-bids` node that live auction pages subscribe to,
35
+ // and a local message send wrote prod `chats/**`.
36
+ //
37
+ // `FIREBASE_DATABASE_EMULATOR_HOST` is the standard variable the Firebase CLI
38
+ // exports for exactly this, so honouring it costs one branch and makes
39
+ // `firebase emulators:start` do what everyone already assumed it did.
40
+ const emulatorHost = process.env.FIREBASE_DATABASE_EMULATOR_HOST?.trim();
41
+ if (emulatorHost) {
42
+ const ns = process.env.FIREBASE_ADMIN_PROJECT_ID?.trim() ||
43
+ process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID?.trim() ||
44
+ "default";
45
+ return `http://${emulatorHost}?ns=${ns}`;
46
+ }
47
+ return (process.env.FIREBASE_ADMIN_DATABASE_URL?.trim() ||
48
+ process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL?.trim() ||
49
+ undefined);
50
+ }
@@ -117,6 +117,28 @@ export interface SieveOptions {
117
117
  */
118
118
  aliases?: SieveFilterAliases;
119
119
  }
120
+ /**
121
+ * 🛑 THE canonical list envelope. Every repository returns this shape.
122
+ *
123
+ * A list endpoint should emit it unchanged — `return successResponse(result)` —
124
+ * and a listing view should read `response.items`. Where a route instead
125
+ * destructures `result.items` and re-emits it as `products` / `orders` /
126
+ * `tickets`, the view has to rename it back in `mapRows`, and the two renames
127
+ * are a pair that can drift. Fifteen such keys exist; `audit-list-envelope`
128
+ * names them and refuses a sixteenth.
129
+ *
130
+ * Nothing type-errors when they drift, which is why they accumulated:
131
+ * `ListingViewConfig<TResponse, TRow>` treats `TResponse` as opaque and
132
+ * delegates the read to a per-view callback.
133
+ *
134
+ * **`pageSize`, never `perPage`.** Three other spellings existed and all three
135
+ * were dead on 2026-08-31 — `GenericListResponse` (which declared BOTH, each
136
+ * optional, so a value could supply neither), appkit's `AdminListResponse`, and
137
+ * the whole `pagination.helper.ts` module. All deleted. `PagedResult` in
138
+ * contracts/repository.ts still spells it `perPage` and is genuinely live in 14
139
+ * repositories via `IReadRepository.findAll`; converging that is a change to the
140
+ * repository contract itself, not to an envelope.
141
+ */
120
142
  export interface SieveResult<T> {
121
143
  items: T[];
122
144
  total: number;
@@ -11,7 +11,27 @@ export interface FirebaseClientRealtimeConfig {
11
11
  export declare class FirebaseClientRealtimeProvider implements IClientRealtimeProvider {
12
12
  private app;
13
13
  private db;
14
+ private readonly config;
15
+ private readonly appName;
16
+ private readonly scoped;
14
17
  constructor(config: FirebaseClientRealtimeConfig);
18
+ /**
19
+ * A provider bound to its OWN Firebase app for this claim scope.
20
+ *
21
+ * 🛑 This is what makes concurrent channels safe. Firebase Auth state is
22
+ * per-app, so with one shared app every `signInWithToken` REPLACED the claims
23
+ * of every other live subscriber: a bulk job signing in with a
24
+ * `{ bulkJobId }`-only token instantly stripped `conversationIds` from an open
25
+ * messages subscription, and vice versa. Whoever signed in last won.
26
+ *
27
+ * Reference-counting fixed only the sign-OUT half of that (a finishing job no
28
+ * longer ends someone else's session). Sign-IN needed separate apps, because
29
+ * there is nothing to coordinate — two channels legitimately need two
30
+ * different claim sets at the same time.
31
+ *
32
+ * Apps are cached per scope and reused, so a remount does not leak one.
33
+ */
34
+ forScope(scope: string): IClientRealtimeProvider;
15
35
  signInWithToken(token: string): Promise<void>;
16
36
  signOut(): Promise<void>;
17
37
  subscribe(path: string, onData: (snapshot: RealtimeSnapshot) => void, onError?: (error: Error) => void): Unsubscribe;
@@ -7,12 +7,44 @@ import { getAuth, signInWithCustomToken, signOut } from "firebase/auth";
7
7
  */
8
8
  export class FirebaseClientRealtimeProvider {
9
9
  constructor(config) {
10
+ this.scoped = new Map();
10
11
  const appName = config.appName ?? "appkit-realtime";
12
+ this.config = config;
13
+ this.appName = appName;
11
14
  this.app =
12
15
  getApps().find((a) => a.name === appName) ??
13
16
  initializeApp(config.firebaseConfig, appName);
14
17
  this.db = getDatabase(this.app);
15
18
  }
19
+ /**
20
+ * A provider bound to its OWN Firebase app for this claim scope.
21
+ *
22
+ * 🛑 This is what makes concurrent channels safe. Firebase Auth state is
23
+ * per-app, so with one shared app every `signInWithToken` REPLACED the claims
24
+ * of every other live subscriber: a bulk job signing in with a
25
+ * `{ bulkJobId }`-only token instantly stripped `conversationIds` from an open
26
+ * messages subscription, and vice versa. Whoever signed in last won.
27
+ *
28
+ * Reference-counting fixed only the sign-OUT half of that (a finishing job no
29
+ * longer ends someone else's session). Sign-IN needed separate apps, because
30
+ * there is nothing to coordinate — two channels legitimately need two
31
+ * different claim sets at the same time.
32
+ *
33
+ * Apps are cached per scope and reused, so a remount does not leak one.
34
+ */
35
+ forScope(scope) {
36
+ const existing = this.scoped.get(scope);
37
+ if (existing)
38
+ return existing;
39
+ // Firebase app names are freeform, but keep them predictable in devtools.
40
+ const safe = scope.replace(/[^a-zA-Z0-9_-]/g, "-");
41
+ const child = new FirebaseClientRealtimeProvider({
42
+ ...this.config,
43
+ appName: `${this.appName}-${safe}`,
44
+ });
45
+ this.scoped.set(scope, child);
46
+ return child;
47
+ }
16
48
  async signInWithToken(token) {
17
49
  await signInWithCustomToken(getAuth(this.app), token);
18
50
  }
@@ -21,8 +53,9 @@ export class FirebaseClientRealtimeProvider {
21
53
  await signOut(getAuth(this.app));
22
54
  }
23
55
  catch (_err) {
56
+ // A secondary Firebase app that was never signed in has nothing to sign
57
+ // out of; the caller's goal (no credential on this app) already holds.
24
58
  void normalizeError(_err);
25
- // no-op — signing out of a secondary app can fail harmlessly
26
59
  }
27
60
  }
28
61
  subscribe(path, onData, onError) {
@@ -12,7 +12,7 @@
12
12
  export { registerProviders, getProviders } from "./contracts/index";
13
13
  export { configureMarketDefaults } from "./core/baseline-resolver";
14
14
  export { firebaseAuthProvider, firebaseSessionProvider, createSessionCookieFromToken, createSessionCookie, verifyIdToken, verifySessionCookie, createMiddlewareAuthChain, requireAuth, requireRole, requireAuthUser, requireRoleUser, getUserFromRequest, requireAuthFromRequest, requireRoleFromRequest, revokeUserTokens, } from "./providers/auth-firebase/index";
15
- export { firebaseDbProvider, getAdminApp, getAdminAuth, getAdminDb, getAdminStorage, getAdminRealtimeDb, _resetAdminSingletons, FirebaseRepository, BaseRepository, FirebaseSieveRepository, FirebaseRealtimeRepository, RTDB_PATHS, firebaseFieldOps, removeUndefined, prepareForFirestore, deserializeTimestamps, } from "./providers/db-firebase/index";
15
+ export { firebaseDbProvider, getAdminApp, getAdminAuth, getAdminDb, getAdminStorage, getAdminRealtimeDb, _resetAdminSingletons, FirebaseRepository, BaseRepository, FirebaseSieveRepository, RTDB_PATHS, firebaseFieldOps, removeUndefined, prepareForFirestore, deserializeTimestamps, } from "./providers/db-firebase/index";
16
16
  export type { DocumentSnapshot } from "firebase-admin/firestore";
17
17
  export { firebaseStorageProvider } from "./providers/storage-firebase/index";
18
18
  export { createResendProvider } from "./providers/email-resend/index";