@mohasinac/appkit 2.1.3 → 2.3.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 (820) hide show
  1. package/README.md +80 -30
  2. package/dist/index.d.ts +3124 -0
  3. package/dist/index.js +5836 -0
  4. package/package.json +67 -383
  5. package/src/cli/index.ts +0 -221
  6. package/src/contracts/auth.ts +0 -63
  7. package/src/contracts/config.ts +0 -58
  8. package/src/contracts/email.ts +0 -37
  9. package/src/contracts/extend.ts +0 -195
  10. package/src/contracts/feature.ts +0 -60
  11. package/src/contracts/index.ts +0 -122
  12. package/src/contracts/infra.ts +0 -50
  13. package/src/contracts/payment.ts +0 -50
  14. package/src/contracts/registry.ts +0 -44
  15. package/src/contracts/repository.ts +0 -87
  16. package/src/contracts/search.ts +0 -49
  17. package/src/contracts/shipping.ts +0 -77
  18. package/src/contracts/storage.ts +0 -37
  19. package/src/contracts/style.ts +0 -25
  20. package/src/contracts/table.ts +0 -148
  21. package/src/core/CacheManager.ts +0 -85
  22. package/src/core/EventBus.ts +0 -89
  23. package/src/core/Logger.ts +0 -209
  24. package/src/core/Queue.ts +0 -126
  25. package/src/core/StorageManager.ts +0 -167
  26. package/src/core/copilot-log.repository.ts +0 -106
  27. package/src/core/index.ts +0 -39
  28. package/src/core/newsletter.repository.ts +0 -193
  29. package/src/core/site-config.ts +0 -109
  30. package/src/errors/api-error.ts +0 -7
  31. package/src/errors/authentication-error.ts +0 -7
  32. package/src/errors/authorization-error.ts +0 -7
  33. package/src/errors/base-error.ts +0 -30
  34. package/src/errors/database-error.ts +0 -7
  35. package/src/errors/error-codes.ts +0 -106
  36. package/src/errors/error-handler.ts +0 -74
  37. package/src/errors/index.ts +0 -11
  38. package/src/errors/not-found-error.ts +0 -7
  39. package/src/errors/validation-error.ts +0 -7
  40. package/src/features/about/components/AboutView.tsx +0 -142
  41. package/src/features/about/components/index.ts +0 -7
  42. package/src/features/about/index.ts +0 -7
  43. package/src/features/account/api/[userId]/addresses/route.ts +0 -131
  44. package/src/features/account/api/[userId]/route.ts +0 -107
  45. package/src/features/account/columns/index.ts +0 -61
  46. package/src/features/account/components/AddressBook.tsx +0 -109
  47. package/src/features/account/components/BecomeSellerView.tsx +0 -44
  48. package/src/features/account/components/ChatList.tsx +0 -43
  49. package/src/features/account/components/ChatWindow.tsx +0 -52
  50. package/src/features/account/components/MessagesView.tsx +0 -60
  51. package/src/features/account/components/OrderDetailView.tsx +0 -50
  52. package/src/features/account/components/ProfileView.tsx +0 -40
  53. package/src/features/account/components/UserAccountHubView.tsx +0 -40
  54. package/src/features/account/components/UserAddressesView.tsx +0 -44
  55. package/src/features/account/components/UserNotificationsView.tsx +0 -52
  56. package/src/features/account/components/UserOffersView.tsx +0 -37
  57. package/src/features/account/components/UserOrderTrackView.tsx +0 -36
  58. package/src/features/account/components/UserOrdersView.tsx +0 -45
  59. package/src/features/account/components/UserSettingsView.tsx +0 -48
  60. package/src/features/account/components/index.ts +0 -54
  61. package/src/features/account/hooks/useAccount.ts +0 -25
  62. package/src/features/account/index.ts +0 -7
  63. package/src/features/account/manifest.ts +0 -29
  64. package/src/features/account/messages/en.json +0 -12
  65. package/src/features/account/repository/account.repository.ts +0 -28
  66. package/src/features/account/schemas/index.ts +0 -56
  67. package/src/features/account/types/index.ts +0 -124
  68. package/src/features/admin/api/bids/route.ts +0 -63
  69. package/src/features/admin/api/coupons/route.ts +0 -63
  70. package/src/features/admin/api/products/route.ts +0 -64
  71. package/src/features/admin/api/reviews/route.ts +0 -63
  72. package/src/features/admin/components/AdminAnalyticsView.tsx +0 -124
  73. package/src/features/admin/components/AdminBidsView.tsx +0 -29
  74. package/src/features/admin/components/AdminBlogView.tsx +0 -32
  75. package/src/features/admin/components/AdminCarouselView.tsx +0 -57
  76. package/src/features/admin/components/AdminCategoriesView.tsx +0 -57
  77. package/src/features/admin/components/AdminCouponsView.tsx +0 -32
  78. package/src/features/admin/components/AdminDashboardView.tsx +0 -50
  79. package/src/features/admin/components/AdminFaqsView.tsx +0 -29
  80. package/src/features/admin/components/AdminFeatureFlagsView.tsx +0 -33
  81. package/src/features/admin/components/AdminMediaView.tsx +0 -57
  82. package/src/features/admin/components/AdminNavigationView.tsx +0 -57
  83. package/src/features/admin/components/AdminOrdersView.tsx +0 -29
  84. package/src/features/admin/components/AdminPayoutsView.tsx +0 -29
  85. package/src/features/admin/components/AdminProductsView.tsx +0 -32
  86. package/src/features/admin/components/AdminReviewsView.tsx +0 -38
  87. package/src/features/admin/components/AdminSectionsView.tsx +0 -57
  88. package/src/features/admin/components/AdminSessionsManager.tsx +0 -28
  89. package/src/features/admin/components/AdminSidebar.tsx +0 -28
  90. package/src/features/admin/components/AdminSiteView.tsx +0 -34
  91. package/src/features/admin/components/AdminStoresView.tsx +0 -29
  92. package/src/features/admin/components/AdminTopBar.tsx +0 -22
  93. package/src/features/admin/components/AdminUsersView.tsx +0 -32
  94. package/src/features/admin/components/DashboardStats.tsx +0 -95
  95. package/src/features/admin/components/DataTable.tsx +0 -115
  96. package/src/features/admin/components/DemoSeedView.tsx +0 -22
  97. package/src/features/admin/components/QuickActionsPanel.tsx +0 -62
  98. package/src/features/admin/components/analytics/AdminAnalyticsCharts.tsx +0 -114
  99. package/src/features/admin/components/analytics/AdminStatCard.tsx +0 -36
  100. package/src/features/admin/components/analytics/AdminTopProductsTable.tsx +0 -61
  101. package/src/features/admin/components/analytics/index.ts +0 -3
  102. package/src/features/admin/components/index.ts +0 -71
  103. package/src/features/admin/hooks/useAdmin.ts +0 -19
  104. package/src/features/admin/index.ts +0 -5
  105. package/src/features/admin/manifest.ts +0 -15
  106. package/src/features/admin/messages/en.json +0 -13
  107. package/src/features/admin/permission-map.ts +0 -27
  108. package/src/features/admin/server.ts +0 -10
  109. package/src/features/admin/types/index.ts +0 -75
  110. package/src/features/auctions/api/route.ts +0 -83
  111. package/src/features/auctions/columns/index.ts +0 -91
  112. package/src/features/auctions/components/AuctionCard.tsx +0 -149
  113. package/src/features/auctions/components/index.ts +0 -1
  114. package/src/features/auctions/hooks/useAuctions.ts +0 -145
  115. package/src/features/auctions/hooks/usePlaceBid.ts +0 -48
  116. package/src/features/auctions/hooks/useRealtimeBids.ts +0 -100
  117. package/src/features/auctions/index.ts +0 -9
  118. package/src/features/auctions/manifest.ts +0 -19
  119. package/src/features/auctions/messages/en.json +0 -18
  120. package/src/features/auctions/repository/auctions.repository.ts +0 -57
  121. package/src/features/auctions/schemas/index.ts +0 -69
  122. package/src/features/auctions/server.ts +0 -7
  123. package/src/features/auctions/types/index.ts +0 -90
  124. package/src/features/auth/api/route.ts +0 -63
  125. package/src/features/auth/components/AuthStatusPanel.tsx +0 -67
  126. package/src/features/auth/components/ForgotPasswordView.tsx +0 -114
  127. package/src/features/auth/components/Guards.tsx +0 -60
  128. package/src/features/auth/components/LoginForm.tsx +0 -180
  129. package/src/features/auth/components/RegisterForm.tsx +0 -232
  130. package/src/features/auth/components/ResetPasswordView.tsx +0 -144
  131. package/src/features/auth/components/SocialAuthButtons.tsx +0 -60
  132. package/src/features/auth/components/VerifyEmailView.tsx +0 -118
  133. package/src/features/auth/components/index.ts +0 -13
  134. package/src/features/auth/hooks/useAuth.ts +0 -33
  135. package/src/features/auth/index.ts +0 -5
  136. package/src/features/auth/manifest.ts +0 -23
  137. package/src/features/auth/messages/en.json +0 -13
  138. package/src/features/auth/schemas/index.ts +0 -48
  139. package/src/features/auth/server.ts +0 -17
  140. package/src/features/auth/types/index.ts +0 -36
  141. package/src/features/before-after/api/[id]/route.ts +0 -143
  142. package/src/features/before-after/api/route.ts +0 -104
  143. package/src/features/before-after/columns/index.ts +0 -72
  144. package/src/features/before-after/components/BeforeAfterGallery.tsx +0 -41
  145. package/src/features/before-after/components/BeforeAfterSlider.tsx +0 -89
  146. package/src/features/before-after/components/index.ts +0 -2
  147. package/src/features/before-after/hooks/useBeforeAfter.ts +0 -33
  148. package/src/features/before-after/index.ts +0 -7
  149. package/src/features/before-after/manifest.ts +0 -12
  150. package/src/features/before-after/messages/en.json +0 -8
  151. package/src/features/before-after/repository/before-after.repository.ts +0 -44
  152. package/src/features/before-after/schemas/index.ts +0 -25
  153. package/src/features/before-after/types/index.ts +0 -19
  154. package/src/features/blog/api/[slug]/route.ts +0 -73
  155. package/src/features/blog/api/route.ts +0 -81
  156. package/src/features/blog/columns/index.ts +0 -68
  157. package/src/features/blog/components/BlogFeaturedCard.tsx +0 -108
  158. package/src/features/blog/components/BlogListView.tsx +0 -219
  159. package/src/features/blog/components/BlogPostForm.tsx +0 -254
  160. package/src/features/blog/components/BlogPostView.tsx +0 -221
  161. package/src/features/blog/components/index.ts +0 -12
  162. package/src/features/blog/hooks/useBlog.ts +0 -67
  163. package/src/features/blog/index.ts +0 -7
  164. package/src/features/blog/manifest.ts +0 -16
  165. package/src/features/blog/messages/en.json +0 -14
  166. package/src/features/blog/repository/blog.repository.ts +0 -73
  167. package/src/features/blog/schemas/index.ts +0 -74
  168. package/src/features/blog/server.ts +0 -9
  169. package/src/features/blog/types/index.ts +0 -58
  170. package/src/features/cart/api/[id]/route.ts +0 -98
  171. package/src/features/cart/api/route.ts +0 -104
  172. package/src/features/cart/columns/index.ts +0 -73
  173. package/src/features/cart/components/CartDrawer.tsx +0 -183
  174. package/src/features/cart/components/CartSummary.tsx +0 -43
  175. package/src/features/cart/components/CartView.tsx +0 -47
  176. package/src/features/cart/components/CheckoutAddressStep.tsx +0 -68
  177. package/src/features/cart/components/CheckoutOtpModal.tsx +0 -39
  178. package/src/features/cart/components/CheckoutSuccessView.tsx +0 -31
  179. package/src/features/cart/components/CheckoutView.tsx +0 -70
  180. package/src/features/cart/components/index.ts +0 -16
  181. package/src/features/cart/hooks/useCart.ts +0 -30
  182. package/src/features/cart/hooks/useCartQuery.ts +0 -22
  183. package/src/features/cart/hooks/useCheckoutReadQueries.ts +0 -34
  184. package/src/features/cart/hooks/useOrder.ts +0 -35
  185. package/src/features/cart/index.ts +0 -11
  186. package/src/features/cart/manifest.ts +0 -12
  187. package/src/features/cart/messages/en.json +0 -10
  188. package/src/features/cart/repository/cart.repository.ts +0 -50
  189. package/src/features/cart/schemas/index.ts +0 -36
  190. package/src/features/cart/types/index.ts +0 -29
  191. package/src/features/cart/utils/guest-cart.ts +0 -149
  192. package/src/features/categories/api/[id]/route.ts +0 -144
  193. package/src/features/categories/api/route.ts +0 -253
  194. package/src/features/categories/columns/index.ts +0 -51
  195. package/src/features/categories/components/BreadcrumbTrail.tsx +0 -80
  196. package/src/features/categories/components/CategoriesListView.tsx +0 -77
  197. package/src/features/categories/components/CategoryGrid.tsx +0 -93
  198. package/src/features/categories/components/CategoryProductsView.tsx +0 -116
  199. package/src/features/categories/components/CategoryTree.tsx +0 -156
  200. package/src/features/categories/components/ConcernCard.tsx +0 -45
  201. package/src/features/categories/components/ConcernGrid.tsx +0 -25
  202. package/src/features/categories/components/index.ts +0 -17
  203. package/src/features/categories/hooks/useCategories.ts +0 -72
  204. package/src/features/categories/index.ts +0 -7
  205. package/src/features/categories/manifest.ts +0 -22
  206. package/src/features/categories/messages/en.json +0 -14
  207. package/src/features/categories/repository/categories.repository.ts +0 -76
  208. package/src/features/categories/schemas/index.ts +0 -74
  209. package/src/features/categories/server.ts +0 -12
  210. package/src/features/categories/types/index.ts +0 -60
  211. package/src/features/checkout/components/CheckoutStepper.tsx +0 -45
  212. package/src/features/checkout/components/index.ts +0 -1
  213. package/src/features/checkout/hooks/useCheckout.ts +0 -38
  214. package/src/features/checkout/index.ts +0 -4
  215. package/src/features/checkout/manifest.ts +0 -19
  216. package/src/features/checkout/messages/en.json +0 -10
  217. package/src/features/checkout/types/index.ts +0 -62
  218. package/src/features/cms/index.ts +0 -6
  219. package/src/features/collections/api/[slug]/route.ts +0 -167
  220. package/src/features/collections/api/route.ts +0 -104
  221. package/src/features/collections/columns/index.ts +0 -77
  222. package/src/features/collections/components/CollectionCard.tsx +0 -61
  223. package/src/features/collections/components/index.ts +0 -1
  224. package/src/features/collections/hooks/useCollections.ts +0 -31
  225. package/src/features/collections/index.ts +0 -7
  226. package/src/features/collections/manifest.ts +0 -18
  227. package/src/features/collections/messages/en.json +0 -10
  228. package/src/features/collections/repository/collections.repository.ts +0 -19
  229. package/src/features/collections/schemas/index.ts +0 -36
  230. package/src/features/collections/types/index.ts +0 -26
  231. package/src/features/consultation/api/[id]/route.ts +0 -143
  232. package/src/features/consultation/api/route.ts +0 -104
  233. package/src/features/consultation/columns/index.ts +0 -76
  234. package/src/features/consultation/components/ConsultationForm.tsx +0 -161
  235. package/src/features/consultation/components/index.ts +0 -1
  236. package/src/features/consultation/hooks/useBookConsultation.ts +0 -19
  237. package/src/features/consultation/index.ts +0 -7
  238. package/src/features/consultation/manifest.ts +0 -14
  239. package/src/features/consultation/messages/en.json +0 -25
  240. package/src/features/consultation/repository/consultations.repository.ts +0 -35
  241. package/src/features/consultation/schemas/index.ts +0 -51
  242. package/src/features/consultation/types/index.ts +0 -36
  243. package/src/features/contact/components/ContactForm.tsx +0 -202
  244. package/src/features/contact/components/ContactInfoSidebar.tsx +0 -85
  245. package/src/features/contact/components/index.ts +0 -7
  246. package/src/features/contact/index.ts +0 -1
  247. package/src/features/copilot/components/AdminCopilotView.tsx +0 -157
  248. package/src/features/copilot/components/index.ts +0 -2
  249. package/src/features/copilot/hooks/useCopilotChat.ts +0 -86
  250. package/src/features/copilot/index.ts +0 -2
  251. package/src/features/corporate/api/[id]/route.ts +0 -149
  252. package/src/features/corporate/api/route.ts +0 -108
  253. package/src/features/corporate/columns/index.ts +0 -76
  254. package/src/features/corporate/components/CorporateInquiryForm.tsx +0 -155
  255. package/src/features/corporate/components/index.ts +0 -1
  256. package/src/features/corporate/hooks/useSubmitCorporateInquiry.ts +0 -19
  257. package/src/features/corporate/index.ts +0 -7
  258. package/src/features/corporate/manifest.ts +0 -14
  259. package/src/features/corporate/messages/en.json +0 -26
  260. package/src/features/corporate/repository/corporate.repository.ts +0 -39
  261. package/src/features/corporate/schemas/index.ts +0 -53
  262. package/src/features/corporate/types/index.ts +0 -40
  263. package/src/features/cron/firebase-adapters.ts +0 -117
  264. package/src/features/cron/index.ts +0 -28
  265. package/src/features/cron/jobs/auction-expiry.job.ts +0 -76
  266. package/src/features/cron/jobs/preorder-reminder.job.ts +0 -64
  267. package/src/features/cron/registry.ts +0 -115
  268. package/src/features/cron/types.ts +0 -83
  269. package/src/features/events/api/[id]/route.ts +0 -123
  270. package/src/features/events/api/route.ts +0 -110
  271. package/src/features/events/columns/index.ts +0 -54
  272. package/src/features/events/components/AdminEventEntriesView.tsx +0 -39
  273. package/src/features/events/components/AdminEventsView.tsx +0 -47
  274. package/src/features/events/components/EventCard.tsx +0 -88
  275. package/src/features/events/components/EventDetailView.tsx +0 -51
  276. package/src/features/events/components/EventFormDrawer.tsx +0 -47
  277. package/src/features/events/components/EventLeaderboard.tsx +0 -76
  278. package/src/features/events/components/EventParticipateView.tsx +0 -48
  279. package/src/features/events/components/EventStatusBadge.tsx +0 -28
  280. package/src/features/events/components/EventsListView.tsx +0 -100
  281. package/src/features/events/components/index.ts +0 -15
  282. package/src/features/events/hooks/useEvent.ts +0 -94
  283. package/src/features/events/hooks/useEvents.ts +0 -59
  284. package/src/features/events/index.ts +0 -11
  285. package/src/features/events/manifest.ts +0 -26
  286. package/src/features/events/messages/en.json +0 -28
  287. package/src/features/events/repository/events.repository.ts +0 -110
  288. package/src/features/events/schemas/index.ts +0 -98
  289. package/src/features/events/server.ts +0 -8
  290. package/src/features/events/types/index.ts +0 -185
  291. package/src/features/faq/api/route.ts +0 -61
  292. package/src/features/faq/columns/index.ts +0 -60
  293. package/src/features/faq/components/ContactCTA.tsx +0 -115
  294. package/src/features/faq/components/FAQAccordion.tsx +0 -150
  295. package/src/features/faq/components/FAQCategorySidebar.tsx +0 -124
  296. package/src/features/faq/components/FAQHelpfulButtons.tsx +0 -110
  297. package/src/features/faq/components/FAQPageContent.tsx +0 -217
  298. package/src/features/faq/components/FAQSortDropdown.tsx +0 -43
  299. package/src/features/faq/components/RelatedFAQs.tsx +0 -74
  300. package/src/features/faq/components/index.ts +0 -9
  301. package/src/features/faq/hooks/useFAQs.ts +0 -50
  302. package/src/features/faq/hooks/useFaqList.ts +0 -53
  303. package/src/features/faq/index.ts +0 -8
  304. package/src/features/faq/manifest.ts +0 -12
  305. package/src/features/faq/messages/en.json +0 -14
  306. package/src/features/faq/repository/faqs.repository.ts +0 -61
  307. package/src/features/faq/schemas/index.ts +0 -69
  308. package/src/features/faq/server.ts +0 -7
  309. package/src/features/faq/types/index.ts +0 -63
  310. package/src/features/filters/FilterFacetSection.tsx +0 -205
  311. package/src/features/filters/FilterPanel.tsx +0 -227
  312. package/src/features/filters/RangeFilter.tsx +0 -291
  313. package/src/features/filters/SwitchFilter.tsx +0 -143
  314. package/src/features/filters/filterUtils.ts +0 -24
  315. package/src/features/filters/index.ts +0 -28
  316. package/src/features/forms/Checkbox.tsx +0 -100
  317. package/src/features/forms/Form.tsx +0 -105
  318. package/src/features/forms/Input.tsx +0 -127
  319. package/src/features/forms/Radio.tsx +0 -126
  320. package/src/features/forms/Select.tsx +0 -101
  321. package/src/features/forms/Slider.tsx +0 -119
  322. package/src/features/forms/Textarea.tsx +0 -99
  323. package/src/features/forms/Toggle.tsx +0 -110
  324. package/src/features/forms/index.ts +0 -34
  325. package/src/features/forms/utils.ts +0 -25
  326. package/src/features/homepage/api/[id]/route.ts +0 -145
  327. package/src/features/homepage/api/carousel/[id]/route.ts +0 -169
  328. package/src/features/homepage/api/carousel/route.ts +0 -188
  329. package/src/features/homepage/api/route.ts +0 -167
  330. package/src/features/homepage/api/sections/[id]/route.ts +0 -143
  331. package/src/features/homepage/api/sections/route.ts +0 -104
  332. package/src/features/homepage/components/AdvertisementBanner.tsx +0 -202
  333. package/src/features/homepage/components/BeforeAfterCard.tsx +0 -147
  334. package/src/features/homepage/components/CharacterHotspot.tsx +0 -742
  335. package/src/features/homepage/components/CharacterHotspotForm.tsx +0 -1002
  336. package/src/features/homepage/components/CustomerReviewsSection.tsx +0 -108
  337. package/src/features/homepage/components/FAQSection.tsx +0 -154
  338. package/src/features/homepage/components/FeaturedResultsSection.tsx +0 -97
  339. package/src/features/homepage/components/HeroBanner.tsx +0 -283
  340. package/src/features/homepage/components/HeroCarousel.tsx +0 -442
  341. package/src/features/homepage/components/HeroSection.tsx +0 -50
  342. package/src/features/homepage/components/HomepageSkeleton.tsx +0 -88
  343. package/src/features/homepage/components/HomepageView.tsx +0 -77
  344. package/src/features/homepage/components/HowItWorksInfoView.tsx +0 -161
  345. package/src/features/homepage/components/HowItWorksSection.tsx +0 -194
  346. package/src/features/homepage/components/NewsletterBanner.tsx +0 -130
  347. package/src/features/homepage/components/NewsletterSection.tsx +0 -85
  348. package/src/features/homepage/components/PromoGrid.tsx +0 -130
  349. package/src/features/homepage/components/SectionCarousel.tsx +0 -284
  350. package/src/features/homepage/components/SecurityHighlightsSection.tsx +0 -149
  351. package/src/features/homepage/components/SiteFeaturesSection.tsx +0 -86
  352. package/src/features/homepage/components/StatsCounterSection.tsx +0 -118
  353. package/src/features/homepage/components/TestimonialsCarousel.tsx +0 -96
  354. package/src/features/homepage/components/TrustBadges.tsx +0 -155
  355. package/src/features/homepage/components/TrustFeaturesSection.tsx +0 -168
  356. package/src/features/homepage/components/TrustIndicatorsSection.tsx +0 -59
  357. package/src/features/homepage/components/WelcomeSection.tsx +0 -178
  358. package/src/features/homepage/components/WhatsAppCommunitySection.tsx +0 -187
  359. package/src/features/homepage/components/index.ts +0 -91
  360. package/src/features/homepage/hooks/useBlogArticles.ts +0 -46
  361. package/src/features/homepage/hooks/useFeaturedAuctions.ts +0 -39
  362. package/src/features/homepage/hooks/useFeaturedPreOrders.ts +0 -39
  363. package/src/features/homepage/hooks/useFeaturedProducts.ts +0 -44
  364. package/src/features/homepage/hooks/useHeroCarousel.ts +0 -19
  365. package/src/features/homepage/hooks/useHomepage.ts +0 -25
  366. package/src/features/homepage/hooks/useTopBrands.ts +0 -17
  367. package/src/features/homepage/hooks/useTopCategories.ts +0 -19
  368. package/src/features/homepage/index.ts +0 -10
  369. package/src/features/homepage/manifest.ts +0 -16
  370. package/src/features/homepage/messages/en.json +0 -6
  371. package/src/features/homepage/repository/homepage.repository.ts +0 -38
  372. package/src/features/homepage/server.ts +0 -14
  373. package/src/features/homepage/types/index.ts +0 -183
  374. package/src/features/layout/AutoBreadcrumbs.tsx +0 -143
  375. package/src/features/layout/BackToTop.tsx +0 -58
  376. package/src/features/layout/BottomNavItem.tsx +0 -71
  377. package/src/features/layout/BottomNavLayout.tsx +0 -34
  378. package/src/features/layout/BottomSheet.tsx +0 -120
  379. package/src/features/layout/Breadcrumbs.tsx +0 -83
  380. package/src/features/layout/FooterLayout.tsx +0 -215
  381. package/src/features/layout/ListingLayout.tsx +0 -383
  382. package/src/features/layout/LocaleSwitcher.tsx +0 -44
  383. package/src/features/layout/NavbarLayout.tsx +0 -108
  384. package/src/features/layout/SidebarLayout.tsx +0 -75
  385. package/src/features/layout/TitleBarLayout.tsx +0 -285
  386. package/src/features/layout/index.ts +0 -46
  387. package/src/features/loyalty/api/admin/loyalty/grant/route.ts +0 -51
  388. package/src/features/loyalty/api/balance/route.ts +0 -53
  389. package/src/features/loyalty/api/earn/route.ts +0 -51
  390. package/src/features/loyalty/api/history/route.ts +0 -74
  391. package/src/features/loyalty/api/redeem/route.ts +0 -51
  392. package/src/features/loyalty/columns/index.ts +0 -61
  393. package/src/features/loyalty/components/CoinsDisplay.tsx +0 -36
  394. package/src/features/loyalty/components/index.ts +0 -1
  395. package/src/features/loyalty/hooks/useLoyaltyBalance.ts +0 -17
  396. package/src/features/loyalty/index.ts +0 -7
  397. package/src/features/loyalty/manifest.ts +0 -18
  398. package/src/features/loyalty/messages/en.json +0 -19
  399. package/src/features/loyalty/repository/loyalty.repository.ts +0 -29
  400. package/src/features/loyalty/schemas/index.ts +0 -44
  401. package/src/features/loyalty/types/index.ts +0 -43
  402. package/src/features/loyalty/types/loyalty-math.ts +0 -36
  403. package/src/features/media/MediaAvatar.tsx +0 -37
  404. package/src/features/media/MediaImage.tsx +0 -119
  405. package/src/features/media/MediaLightbox.tsx +0 -520
  406. package/src/features/media/MediaVideo.tsx +0 -94
  407. package/src/features/media/components/MediaSlider.tsx +0 -53
  408. package/src/features/media/hooks/useMedia.ts +0 -118
  409. package/src/features/media/index.ts +0 -74
  410. package/src/features/media/messages/en.json +0 -63
  411. package/src/features/media/modals/ImageCropModal.tsx +0 -270
  412. package/src/features/media/modals/VideoThumbnailSelector.tsx +0 -117
  413. package/src/features/media/modals/VideoTrimModal.tsx +0 -193
  414. package/src/features/media/types/index.ts +0 -69
  415. package/src/features/media/upload/CameraCapture.tsx +0 -150
  416. package/src/features/media/upload/ImageUpload.tsx +0 -358
  417. package/src/features/media/upload/MediaUploadField.tsx +0 -442
  418. package/src/features/media/upload/MediaUploadList.tsx +0 -255
  419. package/src/features/orders/columns/index.ts +0 -47
  420. package/src/features/orders/components/OrdersList.tsx +0 -168
  421. package/src/features/orders/components/index.ts +0 -1
  422. package/src/features/orders/hooks/useOrders.ts +0 -53
  423. package/src/features/orders/index.ts +0 -8
  424. package/src/features/orders/manifest.ts +0 -20
  425. package/src/features/orders/messages/en.json +0 -15
  426. package/src/features/orders/repository/orders.repository.ts +0 -47
  427. package/src/features/orders/schemas/index.ts +0 -82
  428. package/src/features/orders/types/index.ts +0 -97
  429. package/src/features/orders/utils/order-splitter.ts +0 -48
  430. package/src/features/payments/columns/index.ts +0 -67
  431. package/src/features/payments/components/index.ts +0 -1
  432. package/src/features/payments/hooks/usePayments.ts +0 -23
  433. package/src/features/payments/index.ts +0 -6
  434. package/src/features/payments/manifest.ts +0 -14
  435. package/src/features/payments/messages/en.json +0 -11
  436. package/src/features/payments/repository/payments.repository.ts +0 -57
  437. package/src/features/payments/schemas/index.ts +0 -47
  438. package/src/features/payments/types/index.ts +0 -50
  439. package/src/features/pre-orders/api/[id]/route.ts +0 -143
  440. package/src/features/pre-orders/api/[slug]/route.ts +0 -61
  441. package/src/features/pre-orders/api/admin/[id]/route.ts +0 -105
  442. package/src/features/pre-orders/api/admin/route.ts +0 -69
  443. package/src/features/pre-orders/api/route.ts +0 -96
  444. package/src/features/pre-orders/columns/index.ts +0 -90
  445. package/src/features/pre-orders/components/PreOrderBadge.tsx +0 -52
  446. package/src/features/pre-orders/components/PreorderCard.tsx +0 -90
  447. package/src/features/pre-orders/components/index.ts +0 -1
  448. package/src/features/pre-orders/hooks/usePreOrders.ts +0 -31
  449. package/src/features/pre-orders/index.ts +0 -7
  450. package/src/features/pre-orders/manifest.ts +0 -19
  451. package/src/features/pre-orders/messages/en.json +0 -13
  452. package/src/features/pre-orders/repository/pre-orders.repository.ts +0 -75
  453. package/src/features/pre-orders/repository/preorders.repository.ts +0 -24
  454. package/src/features/pre-orders/schemas/index.ts +0 -28
  455. package/src/features/pre-orders/server.ts +0 -12
  456. package/src/features/pre-orders/types/index.ts +0 -49
  457. package/src/features/products/api/[id]/route.ts +0 -200
  458. package/src/features/products/api/route.ts +0 -242
  459. package/src/features/products/columns/index.ts +0 -90
  460. package/src/features/products/components/AuctionDetailView.tsx +0 -58
  461. package/src/features/products/components/AuctionsView.tsx +0 -48
  462. package/src/features/products/components/BidHistory.tsx +0 -83
  463. package/src/features/products/components/BuyBar.tsx +0 -36
  464. package/src/features/products/components/MakeOfferForm.tsx +0 -43
  465. package/src/features/products/components/PlaceBidForm.tsx +0 -42
  466. package/src/features/products/components/PreOrderDetailView.tsx +0 -50
  467. package/src/features/products/components/PreOrdersView.tsx +0 -39
  468. package/src/features/products/components/ProductDetailView.tsx +0 -52
  469. package/src/features/products/components/ProductFeatureBadges.tsx +0 -192
  470. package/src/features/products/components/ProductGrid.tsx +0 -424
  471. package/src/features/products/components/ProductInfo.tsx +0 -44
  472. package/src/features/products/components/ProductTabs.tsx +0 -84
  473. package/src/features/products/components/ProductsView.tsx +0 -48
  474. package/src/features/products/components/RelatedProducts.tsx +0 -51
  475. package/src/features/products/components/index.ts +0 -28
  476. package/src/features/products/hooks/useProductDetail.ts +0 -44
  477. package/src/features/products/hooks/useProducts.ts +0 -112
  478. package/src/features/products/index.ts +0 -9
  479. package/src/features/products/manifest.ts +0 -18
  480. package/src/features/products/messages/en.json +0 -11
  481. package/src/features/products/repository/products.repository.ts +0 -83
  482. package/src/features/products/schemas/index.ts +0 -185
  483. package/src/features/products/server.ts +0 -12
  484. package/src/features/products/types/index.ts +0 -142
  485. package/src/features/products/utils/listing-type.ts +0 -12
  486. package/src/features/promotions/api/route.ts +0 -105
  487. package/src/features/promotions/columns/index.ts +0 -60
  488. package/src/features/promotions/components/CouponCard.tsx +0 -79
  489. package/src/features/promotions/components/PromotionsView.tsx +0 -129
  490. package/src/features/promotions/components/index.ts +0 -7
  491. package/src/features/promotions/hooks/usePromotions.ts +0 -59
  492. package/src/features/promotions/index.ts +0 -7
  493. package/src/features/promotions/manifest.ts +0 -16
  494. package/src/features/promotions/messages/en.json +0 -20
  495. package/src/features/promotions/repository/promotions.repository.ts +0 -62
  496. package/src/features/promotions/schemas/index.ts +0 -63
  497. package/src/features/promotions/server.ts +0 -7
  498. package/src/features/promotions/types/index.ts +0 -65
  499. package/src/features/reviews/api/[id]/route.ts +0 -163
  500. package/src/features/reviews/api/route.ts +0 -216
  501. package/src/features/reviews/columns/index.ts +0 -57
  502. package/src/features/reviews/components/ReviewModal.tsx +0 -133
  503. package/src/features/reviews/components/ReviewSummary.tsx +0 -82
  504. package/src/features/reviews/components/ReviewsList.tsx +0 -182
  505. package/src/features/reviews/components/ReviewsListView.tsx +0 -100
  506. package/src/features/reviews/components/index.ts +0 -11
  507. package/src/features/reviews/hooks/useReviews.ts +0 -67
  508. package/src/features/reviews/index.ts +0 -7
  509. package/src/features/reviews/manifest.ts +0 -12
  510. package/src/features/reviews/messages/en.json +0 -10
  511. package/src/features/reviews/repository/reviews.repository.ts +0 -69
  512. package/src/features/reviews/schemas/index.ts +0 -74
  513. package/src/features/reviews/server.ts +0 -12
  514. package/src/features/reviews/types/index.ts +0 -68
  515. package/src/features/search/api/route.ts +0 -100
  516. package/src/features/search/columns/index.ts +0 -70
  517. package/src/features/search/components/SearchFiltersRow.tsx +0 -118
  518. package/src/features/search/components/SearchResultsSection.tsx +0 -195
  519. package/src/features/search/components/SearchView.tsx +0 -99
  520. package/src/features/search/components/index.ts +0 -6
  521. package/src/features/search/hooks/useSearch.ts +0 -41
  522. package/src/features/search/index.ts +0 -7
  523. package/src/features/search/manifest.ts +0 -12
  524. package/src/features/search/messages/en.json +0 -15
  525. package/src/features/search/repository/search.repository.ts +0 -64
  526. package/src/features/search/schemas/index.ts +0 -36
  527. package/src/features/search/server.ts +0 -3
  528. package/src/features/search/types/index.ts +0 -59
  529. package/src/features/seller/api/coupons/route.ts +0 -57
  530. package/src/features/seller/api/offers/route.ts +0 -73
  531. package/src/features/seller/api/products/route.ts +0 -75
  532. package/src/features/seller/api/store/route.ts +0 -41
  533. package/src/features/seller/columns/index.ts +0 -103
  534. package/src/features/seller/components/SellerAddressesView.tsx +0 -32
  535. package/src/features/seller/components/SellerAnalyticsView.tsx +0 -38
  536. package/src/features/seller/components/SellerAuctionsView.tsx +0 -48
  537. package/src/features/seller/components/SellerCouponsView.tsx +0 -48
  538. package/src/features/seller/components/SellerCreateProductView.tsx +0 -27
  539. package/src/features/seller/components/SellerDashboardView.tsx +0 -41
  540. package/src/features/seller/components/SellerEditProductView.tsx +0 -27
  541. package/src/features/seller/components/SellerGuideView.tsx +0 -34
  542. package/src/features/seller/components/SellerOffersView.tsx +0 -46
  543. package/src/features/seller/components/SellerOrdersView.tsx +0 -46
  544. package/src/features/seller/components/SellerPayoutHistoryTable.tsx +0 -44
  545. package/src/features/seller/components/SellerPayoutSettingsView.tsx +0 -27
  546. package/src/features/seller/components/SellerPayoutStats.tsx +0 -24
  547. package/src/features/seller/components/SellerPayoutsView.tsx +0 -46
  548. package/src/features/seller/components/SellerProductsView.tsx +0 -51
  549. package/src/features/seller/components/SellerShippingView.tsx +0 -30
  550. package/src/features/seller/components/SellerSidebar.tsx +0 -84
  551. package/src/features/seller/components/SellerStatCard.tsx +0 -44
  552. package/src/features/seller/components/SellerStoreSetupView.tsx +0 -31
  553. package/src/features/seller/components/SellerStoreView.tsx +0 -27
  554. package/src/features/seller/components/SellerStorefrontView.tsx +0 -49
  555. package/src/features/seller/components/SellersListView.tsx +0 -43
  556. package/src/features/seller/components/analytics/SellerAnalyticsStats.tsx +0 -87
  557. package/src/features/seller/components/analytics/SellerRevenueChart.tsx +0 -99
  558. package/src/features/seller/components/analytics/SellerTopProducts.tsx +0 -76
  559. package/src/features/seller/components/analytics/index.ts +0 -3
  560. package/src/features/seller/components/index.ts +0 -47
  561. package/src/features/seller/hooks/useSellerPayouts.ts +0 -51
  562. package/src/features/seller/hooks/useSellerStore.ts +0 -60
  563. package/src/features/seller/index.ts +0 -12
  564. package/src/features/seller/manifest.ts +0 -76
  565. package/src/features/seller/messages/en.json +0 -32
  566. package/src/features/seller/permission-map.ts +0 -18
  567. package/src/features/seller/repository/seller.repository.ts +0 -100
  568. package/src/features/seller/schemas/index.ts +0 -113
  569. package/src/features/seller/server.ts +0 -10
  570. package/src/features/seller/types/index.ts +0 -185
  571. package/src/features/stores/api/[storeSlug]/auctions/route.ts +0 -134
  572. package/src/features/stores/api/[storeSlug]/products/route.ts +0 -139
  573. package/src/features/stores/api/[storeSlug]/reviews/route.ts +0 -155
  574. package/src/features/stores/api/[storeSlug]/route.ts +0 -120
  575. package/src/features/stores/api/route.ts +0 -128
  576. package/src/features/stores/columns/index.ts +0 -58
  577. package/src/features/stores/components/StoreAboutView.tsx +0 -134
  578. package/src/features/stores/components/StoreAuctionsView.tsx +0 -46
  579. package/src/features/stores/components/StoreHeader.tsx +0 -115
  580. package/src/features/stores/components/StoreNavTabs.tsx +0 -77
  581. package/src/features/stores/components/StoreProductsView.tsx +0 -77
  582. package/src/features/stores/components/StoreReviewsView.tsx +0 -45
  583. package/src/features/stores/components/StoresListView.tsx +0 -142
  584. package/src/features/stores/components/index.ts +0 -12
  585. package/src/features/stores/hooks/useStores.ts +0 -130
  586. package/src/features/stores/index.ts +0 -7
  587. package/src/features/stores/manifest.ts +0 -37
  588. package/src/features/stores/messages/en.json +0 -21
  589. package/src/features/stores/repository/stores.repository.ts +0 -51
  590. package/src/features/stores/schemas/index.ts +0 -42
  591. package/src/features/stores/server.ts +0 -11
  592. package/src/features/stores/types/index.ts +0 -123
  593. package/src/features/user/components/BecomeSellerView.tsx +0 -36
  594. package/src/features/user/components/MessagesView.tsx +0 -37
  595. package/src/features/user/components/OrderDetailView.tsx +0 -36
  596. package/src/features/user/components/ProfileView.tsx +0 -33
  597. package/src/features/user/components/UserAccountHub.tsx +0 -30
  598. package/src/features/user/components/UserAddressesView.tsx +0 -32
  599. package/src/features/user/components/UserNotificationsView.tsx +0 -38
  600. package/src/features/user/components/UserOffersView.tsx +0 -35
  601. package/src/features/user/components/UserOrdersView.tsx +0 -39
  602. package/src/features/user/components/UserSettingsView.tsx +0 -31
  603. package/src/features/user/components/UserSidebar.tsx +0 -27
  604. package/src/features/user/components/index.ts +0 -22
  605. package/src/features/user/index.ts +0 -1
  606. package/src/features/whatsapp-bot/api/send-status/route.ts +0 -48
  607. package/src/features/whatsapp-bot/api/webhook/route.ts +0 -55
  608. package/src/features/whatsapp-bot/components/WhatsAppChatButton.tsx +0 -38
  609. package/src/features/whatsapp-bot/components/index.ts +0 -1
  610. package/src/features/whatsapp-bot/helpers/whatsapp.ts +0 -137
  611. package/src/features/whatsapp-bot/index.ts +0 -4
  612. package/src/features/whatsapp-bot/manifest.ts +0 -15
  613. package/src/features/whatsapp-bot/messages/en.json +0 -7
  614. package/src/features/whatsapp-bot/types/index.ts +0 -61
  615. package/src/features/wishlist/columns/index.ts +0 -65
  616. package/src/features/wishlist/components/WishlistPage.tsx +0 -118
  617. package/src/features/wishlist/components/WishlistToggleButton.tsx +0 -68
  618. package/src/features/wishlist/components/WishlistView.tsx +0 -150
  619. package/src/features/wishlist/components/index.ts +0 -4
  620. package/src/features/wishlist/hooks/useUserWishlist.ts +0 -39
  621. package/src/features/wishlist/hooks/useWishlist.ts +0 -31
  622. package/src/features/wishlist/index.ts +0 -8
  623. package/src/features/wishlist/manifest.ts +0 -14
  624. package/src/features/wishlist/messages/en.json +0 -7
  625. package/src/features/wishlist/repository/wishlist.repository.ts +0 -43
  626. package/src/features/wishlist/schemas/index.ts +0 -25
  627. package/src/features/wishlist/types/index.ts +0 -17
  628. package/src/http/ApiClient.ts +0 -247
  629. package/src/http/index.ts +0 -10
  630. package/src/index.ts +0 -22
  631. package/src/instrumentation/index.ts +0 -77
  632. package/src/monitoring/cache-metrics.ts +0 -105
  633. package/src/monitoring/client-logger.ts +0 -83
  634. package/src/monitoring/error-tracking.ts +0 -115
  635. package/src/monitoring/index.ts +0 -52
  636. package/src/monitoring/performance.ts +0 -64
  637. package/src/monitoring/runtime.ts +0 -33
  638. package/src/monitoring/server-logger.ts +0 -93
  639. package/src/next/IAuthVerifier.ts +0 -56
  640. package/src/next/api/api-response.ts +0 -72
  641. package/src/next/api/apiHandler.ts +0 -178
  642. package/src/next/api/errorHandler.ts +0 -125
  643. package/src/next/api/routeHandler.ts +0 -175
  644. package/src/next/cache-middleware.ts +0 -112
  645. package/src/next/components/ErrorView.tsx +0 -73
  646. package/src/next/components/GlobalError.tsx +0 -75
  647. package/src/next/components/NotFoundView.tsx +0 -56
  648. package/src/next/components/UnauthorizedView.tsx +0 -61
  649. package/src/next/index.ts +0 -82
  650. package/src/next/middleware/chain.ts +0 -117
  651. package/src/next/middleware/index.ts +0 -14
  652. package/src/next/middleware/pii-redactor.ts +0 -112
  653. package/src/next/middleware/pii-scrubber.ts +0 -56
  654. package/src/next/middleware/types.ts +0 -26
  655. package/src/next/request-helpers.ts +0 -76
  656. package/src/next/routing/route-map.ts +0 -221
  657. package/src/providers/auth-firebase/browser-stub.ts +0 -32
  658. package/src/providers/auth-firebase/helpers.ts +0 -150
  659. package/src/providers/auth-firebase/index.ts +0 -26
  660. package/src/providers/auth-firebase/provider.ts +0 -163
  661. package/src/providers/auth-firebase/session.ts +0 -111
  662. package/src/providers/db-firebase/admin-app-lite.ts +0 -66
  663. package/src/providers/db-firebase/admin-auth-lite.ts +0 -16
  664. package/src/providers/db-firebase/admin-storage-lite.ts +0 -19
  665. package/src/providers/db-firebase/admin.ts +0 -217
  666. package/src/providers/db-firebase/base.ts +0 -243
  667. package/src/providers/db-firebase/browser-stub.ts +0 -47
  668. package/src/providers/db-firebase/helpers.ts +0 -88
  669. package/src/providers/db-firebase/index.ts +0 -60
  670. package/src/providers/db-firebase/realtime.ts +0 -185
  671. package/src/providers/db-firebase/sieve.ts +0 -136
  672. package/src/providers/email-resend/index.ts +0 -16
  673. package/src/providers/email-resend/provider.ts +0 -103
  674. package/src/providers/payment-razorpay/index.ts +0 -165
  675. package/src/providers/shipping-shiprocket/index.ts +0 -402
  676. package/src/providers/storage-firebase/index.ts +0 -17
  677. package/src/providers/storage-firebase/provider.ts +0 -131
  678. package/src/react/ErrorBoundary.tsx +0 -130
  679. package/src/react/hooks/useBreakpoint.ts +0 -41
  680. package/src/react/hooks/useBulkAction.ts +0 -161
  681. package/src/react/hooks/useBulkSelection.ts +0 -119
  682. package/src/react/hooks/useCamera.ts +0 -191
  683. package/src/react/hooks/useClickOutside.ts +0 -87
  684. package/src/react/hooks/useContainerGrid.ts +0 -77
  685. package/src/react/hooks/useCountdown.ts +0 -73
  686. package/src/react/hooks/useGesture.ts +0 -255
  687. package/src/react/hooks/useKeyPress.ts +0 -113
  688. package/src/react/hooks/useLongPress.ts +0 -62
  689. package/src/react/hooks/useMediaQuery.ts +0 -40
  690. package/src/react/hooks/usePendingFilters.ts +0 -138
  691. package/src/react/hooks/usePendingTable.ts +0 -84
  692. package/src/react/hooks/usePullToRefresh.ts +0 -111
  693. package/src/react/hooks/useSwipe.ts +0 -240
  694. package/src/react/hooks/useUnsavedChanges.ts +0 -104
  695. package/src/react/hooks/useUrlTable.ts +0 -189
  696. package/src/react/hooks/useVisibleItems.ts +0 -110
  697. package/src/react/index.ts +0 -99
  698. package/src/react/useModalStack.ts +0 -86
  699. package/src/security/authorization.ts +0 -92
  700. package/src/security/csp.ts +0 -44
  701. package/src/security/index.ts +0 -50
  702. package/src/security/pii-encrypt.ts +0 -117
  703. package/src/security/pii-redact.ts +0 -133
  704. package/src/security/rate-limit.ts +0 -170
  705. package/src/security/rbac/Can.tsx +0 -50
  706. package/src/security/rbac/default-roles.ts +0 -86
  707. package/src/security/rbac/hook.ts +0 -55
  708. package/src/security/rbac/index.ts +0 -14
  709. package/src/security/rbac/middleware.ts +0 -103
  710. package/src/security/rbac/resolver.ts +0 -69
  711. package/src/security/rbac/server.ts +0 -52
  712. package/src/security/rbac/types.ts +0 -27
  713. package/src/seed/defaults/categories.ts +0 -13
  714. package/src/seed/defaults/faqs.ts +0 -40
  715. package/src/seed/defaults/homepage-sections.ts +0 -63
  716. package/src/seed/factories/address.factory.ts +0 -106
  717. package/src/seed/factories/bid.factory.ts +0 -50
  718. package/src/seed/factories/blog-post.factory.ts +0 -40
  719. package/src/seed/factories/carousel.factory.ts +0 -30
  720. package/src/seed/factories/cart.factory.ts +0 -66
  721. package/src/seed/factories/category.factory.ts +0 -30
  722. package/src/seed/factories/coupon.factory.ts +0 -67
  723. package/src/seed/factories/faq.factory.ts +0 -28
  724. package/src/seed/factories/homepage-section.factory.ts +0 -35
  725. package/src/seed/factories/notification.factory.ts +0 -68
  726. package/src/seed/factories/order.factory.ts +0 -43
  727. package/src/seed/factories/payout.factory.ts +0 -62
  728. package/src/seed/factories/product.factory.ts +0 -120
  729. package/src/seed/factories/review.factory.ts +0 -67
  730. package/src/seed/factories/session.factory.ts +0 -49
  731. package/src/seed/factories/store.factory.ts +0 -69
  732. package/src/seed/factories/user.factory.ts +0 -88
  733. package/src/seed/index.ts +0 -84
  734. package/src/seed/runner.ts +0 -57
  735. package/src/seed/test-utils.ts +0 -155
  736. package/src/seed/types.ts +0 -40
  737. package/src/seo/index.ts +0 -2
  738. package/src/seo/json-ld.ts +0 -241
  739. package/src/seo/metadata.ts +0 -302
  740. package/src/style/tailwind/index.ts +0 -66
  741. package/src/style/vanilla/index.ts +0 -57
  742. package/src/tokens/index.ts +0 -864
  743. package/src/tokens/tokens.css +0 -221
  744. package/src/ui/DataTable.tsx +0 -655
  745. package/src/ui/animation.helper.ts +0 -20
  746. package/src/ui/color.helper.ts +0 -37
  747. package/src/ui/components/Accordion.tsx +0 -189
  748. package/src/ui/components/ActiveFilterChips.tsx +0 -81
  749. package/src/ui/components/Alert.tsx +0 -167
  750. package/src/ui/components/Badge.tsx +0 -65
  751. package/src/ui/components/Breadcrumb.tsx +0 -61
  752. package/src/ui/components/BulkActionBar.tsx +0 -246
  753. package/src/ui/components/Button.tsx +0 -75
  754. package/src/ui/components/CountdownDisplay.tsx +0 -87
  755. package/src/ui/components/DescriptionField.tsx +0 -55
  756. package/src/ui/components/Div.tsx +0 -29
  757. package/src/ui/components/Divider.tsx +0 -52
  758. package/src/ui/components/Drawer.tsx +0 -178
  759. package/src/ui/components/Form.tsx +0 -25
  760. package/src/ui/components/FormGrid.tsx +0 -82
  761. package/src/ui/components/HorizontalScroller.tsx +0 -183
  762. package/src/ui/components/IconButton.tsx +0 -71
  763. package/src/ui/components/ImageLightbox.tsx +0 -187
  764. package/src/ui/components/Input.tsx +0 -17
  765. package/src/ui/components/ItemRow.tsx +0 -38
  766. package/src/ui/components/Layout.tsx +0 -391
  767. package/src/ui/components/ListingLayout.tsx +0 -514
  768. package/src/ui/components/Modal.tsx +0 -162
  769. package/src/ui/components/Pagination.tsx +0 -182
  770. package/src/ui/components/PriceDisplay.tsx +0 -63
  771. package/src/ui/components/Progress.tsx +0 -154
  772. package/src/ui/components/RatingDisplay.tsx +0 -56
  773. package/src/ui/components/Select.tsx +0 -221
  774. package/src/ui/components/Semantic.tsx +0 -257
  775. package/src/ui/components/SideModal.tsx +0 -137
  776. package/src/ui/components/Skeleton.tsx +0 -82
  777. package/src/ui/components/Slider.tsx +0 -35
  778. package/src/ui/components/SortDropdown.tsx +0 -43
  779. package/src/ui/components/Spinner.tsx +0 -48
  780. package/src/ui/components/StarRating.tsx +0 -85
  781. package/src/ui/components/StatsGrid.tsx +0 -56
  782. package/src/ui/components/StatusBadge.tsx +0 -130
  783. package/src/ui/components/StepperNav.tsx +0 -89
  784. package/src/ui/components/SummaryCard.tsx +0 -66
  785. package/src/ui/components/TabStrip.tsx +0 -142
  786. package/src/ui/components/TablePagination.tsx +0 -134
  787. package/src/ui/components/TagInput.tsx +0 -133
  788. package/src/ui/components/TextLink.tsx +0 -68
  789. package/src/ui/components/Textarea.tsx +0 -17
  790. package/src/ui/components/Tooltip.tsx +0 -190
  791. package/src/ui/components/Typography.tsx +0 -270
  792. package/src/ui/components/ViewToggle.tsx +0 -133
  793. package/src/ui/index.ts +0 -248
  794. package/src/ui/rich-text/RichText.tsx +0 -243
  795. package/src/ui/rich-text/index.ts +0 -2
  796. package/src/ui/style.helper.ts +0 -18
  797. package/src/utils/animation.helper.ts +0 -22
  798. package/src/utils/array.helper.ts +0 -73
  799. package/src/utils/color.helper.ts +0 -57
  800. package/src/utils/cookie.converter.ts +0 -32
  801. package/src/utils/date.formatter.ts +0 -228
  802. package/src/utils/event-manager.ts +0 -168
  803. package/src/utils/filter.helper.ts +0 -24
  804. package/src/utils/id-generators.ts +0 -629
  805. package/src/utils/index.ts +0 -31
  806. package/src/utils/media-field.ts +0 -13
  807. package/src/utils/number.formatter.ts +0 -107
  808. package/src/utils/object.helper.ts +0 -111
  809. package/src/utils/pagination.helper.ts +0 -46
  810. package/src/utils/sorting.helper.ts +0 -21
  811. package/src/utils/string.formatter.ts +0 -178
  812. package/src/utils/type.converter.ts +0 -86
  813. package/src/validation/email.validator.ts +0 -37
  814. package/src/validation/index.ts +0 -17
  815. package/src/validation/input.validator.ts +0 -38
  816. package/src/validation/password.validator.ts +0 -97
  817. package/src/validation/phone.validator.ts +0 -38
  818. package/src/validation/schemas.ts +0 -106
  819. package/src/validation/url.validator.ts +0 -46
  820. package/src/validation/zod-error-map.ts +0 -96
@@ -1,111 +0,0 @@
1
- /**
2
- * firebaseSessionProvider — ISessionProvider
3
- *
4
- * Implements `@mohasinac/contracts` `ISessionProvider` using Firebase Admin SDK
5
- * session cookies (HTTP-only, 5-day TTL by default).
6
- *
7
- * Server-side only.
8
- */
9
-
10
- import type { ISessionProvider, AuthPayload } from "../../contracts";
11
- import { getAdminAuthLite } from "../db-firebase/admin-auth-lite";
12
-
13
- /** Default session duration: 5 days (in milliseconds). */
14
- const DEFAULT_EXPIRES_IN_MS = 60 * 60 * 24 * 5 * 1000;
15
-
16
- const EXPECTED_SESSION_CODES = new Set([
17
- "auth/session-cookie-expired",
18
- "auth/session-cookie-revoked",
19
- "auth/user-disabled",
20
- "auth/user-not-found",
21
- "auth/argument-error",
22
- ]);
23
-
24
- export const firebaseSessionProvider: ISessionProvider = {
25
- /**
26
- * `payload` must be an `AuthPayload` from a freshly verified ID token.
27
- * The underlying Firebase API expects an ID token string, not just a UID.
28
- * If you have the raw ID token, use `createSessionCookieFromToken()` instead.
29
- *
30
- * Here we create a custom token → exchange for an effective session.
31
- * In practice, callers should use `createSessionCookieFromToken()`.
32
- */
33
- async createSession(payload: AuthPayload): Promise<string> {
34
- void payload;
35
- // Custom tokens cannot be used to mint a session cookie directly —
36
- // createSession via ISessionProvider is called at the point where
37
- // the caller already has a verified payload. We delegate to a helper
38
- // that is invoked in the auth API route where the raw ID token is available.
39
- throw new Error(
40
- "Use createSessionCookieFromToken(idToken) instead of createSession(payload). " +
41
- "Firebase session cookies must be created from a raw ID token string.",
42
- );
43
- },
44
-
45
- async verifySession(cookie: string): Promise<AuthPayload> {
46
- try {
47
- const decoded = await getAdminAuthLite().verifySessionCookie(
48
- cookie,
49
- true,
50
- );
51
- return {
52
- uid: decoded.uid,
53
- email: decoded.email ?? null,
54
- role: (decoded.role as string | undefined) ?? "user",
55
- emailVerified: decoded.email_verified ?? false,
56
- claims: Object.fromEntries(
57
- Object.entries(decoded).filter(
58
- ([k]) =>
59
- ![
60
- "uid",
61
- "email",
62
- "email_verified",
63
- "iat",
64
- "exp",
65
- "aud",
66
- "iss",
67
- "sub",
68
- "auth_time",
69
- "firebase",
70
- ].includes(k),
71
- ),
72
- ),
73
- };
74
- } catch (err) {
75
- if (!EXPECTED_SESSION_CODES.has((err as { code?: string }).code ?? "")) {
76
- console.error(
77
- "[@mohasinac/auth-firebase] Session cookie verification failed:",
78
- err,
79
- );
80
- }
81
- throw err;
82
- }
83
- },
84
-
85
- async destroySession(cookie: string): Promise<void> {
86
- try {
87
- const decoded = await getAdminAuthLite().verifySessionCookie(
88
- cookie,
89
- false,
90
- );
91
- await getAdminAuthLite().revokeRefreshTokens(decoded.uid);
92
- } catch {
93
- // Best-effort: if cookie is already invalid, treat as already destroyed
94
- }
95
- },
96
- };
97
-
98
- /**
99
- * Mint a Firebase session cookie from a raw Firebase ID token string.
100
- *
101
- * Use this in your `POST /api/auth/session` route handler.
102
- *
103
- * @param idToken The ID token from `firebase.auth().currentUser.getIdToken()`.
104
- * @param expiresIn Cookie duration in milliseconds (default: 5 days).
105
- */
106
- export async function createSessionCookieFromToken(
107
- idToken: string,
108
- expiresIn: number = DEFAULT_EXPIRES_IN_MS,
109
- ): Promise<string> {
110
- return getAdminAuthLite().createSessionCookie(idToken, { expiresIn });
111
- }
@@ -1,66 +0,0 @@
1
- import { initializeApp, getApps, cert, type App } from "firebase-admin/app";
2
- import * as path from "path";
3
- import * as fs from "fs";
4
-
5
- function parsePrivateKey(raw: string): string {
6
- return raw
7
- .replace(/^["']|["']$/g, "")
8
- .replace(/\\n/g, "\n")
9
- .replace(/\r\n/g, "\n")
10
- .trim();
11
- }
12
-
13
- declare global {
14
- // eslint-disable-next-line no-var
15
- var __mohasinac_firebase_admin_app_lite__: App | null | undefined;
16
- }
17
-
18
- export function getAdminAppLite(): App {
19
- if (globalThis.__mohasinac_firebase_admin_app_lite__) {
20
- return globalThis.__mohasinac_firebase_admin_app_lite__;
21
- }
22
-
23
- if (getApps().length) {
24
- const existing = getApps()[0];
25
- globalThis.__mohasinac_firebase_admin_app_lite__ = existing;
26
- return existing;
27
- }
28
-
29
- const keyPath = path.join(process.cwd(), "firebase-admin-key.json");
30
- let app: App;
31
-
32
- if (fs.existsSync(keyPath)) {
33
- const sa = JSON.parse(fs.readFileSync(keyPath, "utf8"));
34
- const dbUrl =
35
- process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL ??
36
- `https://${sa.project_id}-default-rtdb.firebaseio.com`;
37
-
38
- app = initializeApp({ credential: cert(keyPath), databaseURL: dbUrl });
39
- } else if (
40
- process.env.FIREBASE_ADMIN_PROJECT_ID &&
41
- process.env.FIREBASE_ADMIN_CLIENT_EMAIL &&
42
- process.env.FIREBASE_ADMIN_PRIVATE_KEY
43
- ) {
44
- const projectId = process.env.FIREBASE_ADMIN_PROJECT_ID.trim();
45
- const dbUrl =
46
- process.env.FIREBASE_ADMIN_DATABASE_URL?.trim() ??
47
- process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL?.trim() ??
48
- `https://${projectId}-default-rtdb.firebaseio.com`;
49
-
50
- app = initializeApp({
51
- credential: cert({
52
- projectId,
53
- clientEmail: process.env.FIREBASE_ADMIN_CLIENT_EMAIL.trim(),
54
- privateKey: parsePrivateKey(process.env.FIREBASE_ADMIN_PRIVATE_KEY),
55
- }),
56
- databaseURL: dbUrl,
57
- });
58
- } else {
59
- throw new Error(
60
- "@mohasinac/db-firebase: Firebase Admin credentials not found.",
61
- );
62
- }
63
-
64
- globalThis.__mohasinac_firebase_admin_app_lite__ = app;
65
- return app;
66
- }
@@ -1,16 +0,0 @@
1
- import { getAuth, type Auth } from "firebase-admin/auth";
2
- import { getAdminAppLite } from "./admin-app-lite";
3
-
4
- declare global {
5
- // eslint-disable-next-line no-var
6
- var __mohasinac_firebase_admin_auth_lite__: Auth | null | undefined;
7
- }
8
-
9
- export function getAdminAuthLite(): Auth {
10
- if (globalThis.__mohasinac_firebase_admin_auth_lite__) {
11
- return globalThis.__mohasinac_firebase_admin_auth_lite__;
12
- }
13
- const auth = getAuth(getAdminAppLite());
14
- globalThis.__mohasinac_firebase_admin_auth_lite__ = auth;
15
- return auth;
16
- }
@@ -1,19 +0,0 @@
1
- import {
2
- getStorage as getFirebaseStorage,
3
- type Storage,
4
- } from "firebase-admin/storage";
5
- import { getAdminAppLite } from "./admin-app-lite";
6
-
7
- declare global {
8
- // eslint-disable-next-line no-var
9
- var __mohasinac_firebase_admin_storage_lite__: Storage | null | undefined;
10
- }
11
-
12
- export function getAdminStorageLite(): Storage {
13
- if (globalThis.__mohasinac_firebase_admin_storage_lite__) {
14
- return globalThis.__mohasinac_firebase_admin_storage_lite__;
15
- }
16
- const storage = getFirebaseStorage(getAdminAppLite());
17
- globalThis.__mohasinac_firebase_admin_storage_lite__ = storage;
18
- return storage;
19
- }
@@ -1,217 +0,0 @@
1
- /**
2
- * Firebase Admin SDK singletons.
3
- *
4
- * Supports two init methods (checked in order):
5
- * 1. `firebase-admin-key.json` in process.cwd() — development
6
- * 2. FIREBASE_ADMIN_PROJECT_ID / CLIENT_EMAIL / PRIVATE_KEY env vars — production
7
- *
8
- * All getters are lazy — the SDK is not touched until first use.
9
- */
10
- import "server-only";
11
-
12
- import type { App } from "firebase-admin/app";
13
- import type { Auth } from "firebase-admin/auth";
14
- import type { Firestore } from "firebase-admin/firestore";
15
- import type { Storage } from "firebase-admin/storage";
16
- import type { Database } from "firebase-admin/database";
17
- import * as path from "path";
18
- import * as fs from "fs";
19
-
20
- // Lazy loaders — prevents webpack from bundling firebase-admin into browser chunks.
21
- // (module as any).require() is used because webpack's static analysis does NOT trace
22
- // module.require() calls, unlike calls to the literal `require` or aliased `require`.
23
- /* eslint-disable @typescript-eslint/no-require-imports */
24
- /* eslint-disable @typescript-eslint/no-explicit-any */
25
- function loadApp() {
26
- return (module as any).require(
27
- "firebase-admin/app",
28
- ) as typeof import("firebase-admin/app");
29
- }
30
- function loadAuth() {
31
- return (module as any).require(
32
- "firebase-admin/auth",
33
- ) as typeof import("firebase-admin/auth");
34
- }
35
- function loadFirestore() {
36
- return (module as any).require(
37
- "firebase-admin/firestore",
38
- ) as typeof import("firebase-admin/firestore");
39
- }
40
- function loadStorage() {
41
- return (module as any).require(
42
- "firebase-admin/storage",
43
- ) as typeof import("firebase-admin/storage");
44
- }
45
- function loadDatabase() {
46
- return (module as any).require(
47
- "firebase-admin/database",
48
- ) as typeof import("firebase-admin/database");
49
- }
50
- /* eslint-enable @typescript-eslint/no-require-imports */
51
-
52
- // ─── Private key normalisation ────────────────────────────────────────────────
53
- //
54
- // Vercel (and other platforms) can store the private key in several formats:
55
- // 1. Literal \n sequences (common — copied from JSON value)
56
- // 2. Real newlines (set via CLI / multiline input)
57
- // 3. Windows \r\n endings (copied on Windows)
58
- // 4. Wrapped in double-quotes (pasted with JSON quotes intact)
59
- //
60
- // OpenSSL 3 (Node 18+) rejects malformed PEM — ensure the key is normalised
61
- // before passing it to `cert()`.
62
- //
63
- function parsePrivateKey(raw: string): string {
64
- return raw
65
- .replace(/^["']|["']$/g, "") // strip optional surrounding quotes
66
- .replace(/\\n/g, "\n") // literal \n → real newline
67
- .replace(/\r\n/g, "\n") // Windows CRLF → LF
68
- .trim();
69
- }
70
-
71
- // ─── Global singletons ────────────────────────────────────────────────────────
72
- // Stored on globalThis so all module instances (package-manager deduplication may create
73
- // multiple copies of this package in the same process) share one SDK instance.
74
-
75
- declare global {
76
- // eslint-disable-next-line no-var
77
- var __mohasinac_firebase_admin_app__: App | null | undefined;
78
- // eslint-disable-next-line no-var
79
- var __mohasinac_firebase_admin_auth__: Auth | null | undefined;
80
- // eslint-disable-next-line no-var
81
- var __mohasinac_firebase_admin_db__: Firestore | null | undefined;
82
- // eslint-disable-next-line no-var
83
- var __mohasinac_firebase_admin_storage__: Storage | null | undefined;
84
- // eslint-disable-next-line no-var
85
- var __mohasinac_firebase_admin_rtdb__: Database | null | undefined;
86
- }
87
-
88
- function get<T>(key: keyof typeof globalThis): T | null {
89
- return (globalThis[key] as T | null | undefined) ?? null;
90
- }
91
- function set<T>(key: keyof typeof globalThis, value: T): void {
92
- (globalThis as Record<string, unknown>)[key] = value;
93
- }
94
-
95
- // ─── App ──────────────────────────────────────────────────────────────────────
96
-
97
- export function getAdminApp(): App {
98
- const cached = get<App>("__mohasinac_firebase_admin_app__");
99
- if (cached) return cached;
100
-
101
- const { initializeApp, getApps, cert } = loadApp();
102
-
103
- if (getApps().length) {
104
- const existing = getApps()[0];
105
- set("__mohasinac_firebase_admin_app__", existing);
106
- return existing;
107
- }
108
-
109
- const keyPath = path.join(process.cwd(), "firebase-admin-key.json");
110
- let app: App;
111
-
112
- try {
113
- if (fs.existsSync(keyPath)) {
114
- const sa = JSON.parse(fs.readFileSync(keyPath, "utf8"));
115
- const dbUrl =
116
- process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL ??
117
- `https://${sa.project_id}-default-rtdb.firebaseio.com`;
118
-
119
- app = initializeApp({ credential: cert(keyPath), databaseURL: dbUrl });
120
- } else if (
121
- process.env.FIREBASE_ADMIN_PROJECT_ID &&
122
- process.env.FIREBASE_ADMIN_CLIENT_EMAIL &&
123
- process.env.FIREBASE_ADMIN_PRIVATE_KEY
124
- ) {
125
- const projectId = process.env.FIREBASE_ADMIN_PROJECT_ID.trim();
126
- const dbUrl =
127
- process.env.FIREBASE_ADMIN_DATABASE_URL?.trim() ??
128
- process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL?.trim() ??
129
- `https://${projectId}-default-rtdb.firebaseio.com`;
130
-
131
- app = initializeApp({
132
- credential: cert({
133
- projectId,
134
- clientEmail: process.env.FIREBASE_ADMIN_CLIENT_EMAIL.trim(),
135
- privateKey: parsePrivateKey(process.env.FIREBASE_ADMIN_PRIVATE_KEY),
136
- }),
137
- databaseURL: dbUrl,
138
- });
139
- } else {
140
- throw new Error(
141
- "@mohasinac/db-firebase: Firebase Admin credentials not found.\n" +
142
- "Add firebase-admin-key.json to project root, or set " +
143
- "FIREBASE_ADMIN_PROJECT_ID, FIREBASE_ADMIN_CLIENT_EMAIL, " +
144
- "FIREBASE_ADMIN_PRIVATE_KEY environment variables.",
145
- );
146
- }
147
- } catch (err) {
148
- console.error(
149
- "[@mohasinac/db-firebase] Failed to initialise Admin SDK:",
150
- err,
151
- );
152
- throw err;
153
- }
154
-
155
- set("__mohasinac_firebase_admin_app__", app);
156
- return app;
157
- }
158
-
159
- // ─── Auth ─────────────────────────────────────────────────────────────────────
160
-
161
- export function getAdminAuth(): Auth {
162
- const cached = get<Auth>("__mohasinac_firebase_admin_auth__");
163
- if (cached) return cached;
164
- const { getAuth } = loadAuth();
165
- const auth = getAuth(getAdminApp());
166
- set("__mohasinac_firebase_admin_auth__", auth);
167
- return auth;
168
- }
169
-
170
- // ─── Firestore ────────────────────────────────────────────────────────────────
171
-
172
- export function getAdminDb(): Firestore {
173
- const cached = get<Firestore>("__mohasinac_firebase_admin_db__");
174
- if (cached) return cached;
175
- const { getFirestore } = loadFirestore();
176
- const db = getFirestore(getAdminApp());
177
- try {
178
- // settings() can only be called once per Firestore instance — guard for
179
- // HMR reloads and duplicate module instances.
180
- db.settings({ ignoreUndefinedProperties: true });
181
- } catch {
182
- // Already configured — safe to ignore.
183
- }
184
- set("__mohasinac_firebase_admin_db__", db);
185
- return db;
186
- }
187
-
188
- // ─── Cloud Storage ────────────────────────────────────────────────────────────
189
-
190
- export function getAdminStorage(): Storage {
191
- const cached = get<Storage>("__mohasinac_firebase_admin_storage__");
192
- if (cached) return cached;
193
- const { getStorage: getFirebaseStorage } = loadStorage();
194
- const storage = getFirebaseStorage(getAdminApp());
195
- set("__mohasinac_firebase_admin_storage__", storage);
196
- return storage;
197
- }
198
-
199
- // ─── Realtime DB ──────────────────────────────────────────────────────────────
200
-
201
- export function getAdminRealtimeDb(): Database {
202
- const cached = get<Database>("__mohasinac_firebase_admin_rtdb__");
203
- if (cached) return cached;
204
- const { getDatabase } = loadDatabase();
205
- const rtdb = getDatabase(getAdminApp());
206
- set("__mohasinac_firebase_admin_rtdb__", rtdb);
207
- return rtdb;
208
- }
209
-
210
- /** Reset all singletons — useful in tests. */
211
- export function _resetAdminSingletons(): void {
212
- set("__mohasinac_firebase_admin_app__", null);
213
- set("__mohasinac_firebase_admin_auth__", null);
214
- set("__mohasinac_firebase_admin_db__", null);
215
- set("__mohasinac_firebase_admin_storage__", null);
216
- set("__mohasinac_firebase_admin_rtdb__", null);
217
- }
@@ -1,243 +0,0 @@
1
- /**
2
- * FirebaseRepository<T>
3
- *
4
- * Generic abstract base class implementing `IRepository<T>` from
5
- * `@mohasinac/contracts` against Firebase Firestore (Admin SDK).
6
- *
7
- * Usage:
8
- * ```ts
9
- * import { FirebaseRepository } from "@mohasinac/db-firebase";
10
- * import type { Product } from "@/types";
11
- *
12
- * export class ProductRepository extends FirebaseRepository<Product> {
13
- * constructor() { super("products"); }
14
- * }
15
- * ```
16
- *
17
- * `findAll(query?)` maps the provider-agnostic `SieveQuery` from
18
- * `@mohasinac/contracts` to Firestore native queries (no in-memory fan-out).
19
- */
20
-
21
- import type {
22
- CollectionReference,
23
- DocumentData,
24
- DocumentSnapshot,
25
- Firestore,
26
- Query,
27
- WriteBatch,
28
- } from "firebase-admin/firestore";
29
- import type {
30
- IRepository,
31
- PagedResult,
32
- SieveQuery,
33
- WhereOp,
34
- } from "../../contracts";
35
- import { getAdminDb } from "./admin";
36
- import { prepareForFirestore, deserializeTimestamps } from "./helpers";
37
-
38
- export class FirebaseRepository<
39
- T extends DocumentData,
40
- > implements IRepository<T> {
41
- protected readonly collection: string;
42
-
43
- constructor(collectionName: string) {
44
- this.collection = collectionName;
45
- }
46
-
47
- // ── Internals ──────────────────────────────────────────────────────────────
48
-
49
- protected get db(): Firestore {
50
- return getAdminDb();
51
- }
52
-
53
- protected getCollection(): CollectionReference {
54
- return this.db.collection(this.collection);
55
- }
56
-
57
- /** Single adapter boundary: DocumentSnapshot → typed entity. */
58
- protected mapDoc<D = T>(snap: DocumentSnapshot): D {
59
- return deserializeTimestamps({
60
- id: snap.id,
61
- ...(snap.data() ?? {}),
62
- }) as unknown as D;
63
- }
64
-
65
- // ── IReadRepository ────────────────────────────────────────────────────────
66
-
67
- async findById(id: string): Promise<T | null> {
68
- const snap = await this.getCollection().doc(id).get();
69
- if (!snap.exists) return null;
70
- return this.mapDoc(snap);
71
- }
72
-
73
- async findAll(query?: SieveQuery): Promise<PagedResult<T>> {
74
- const page = Math.max(1, query?.page ?? 1);
75
- const perPage = Math.max(1, Math.min(query?.perPage ?? 20, 500));
76
-
77
- let q: Query = this.getCollection();
78
-
79
- // ── Sort ──────────────────────────────────────────────────────────────────
80
- // SieveQuery.sort supports a leading "-" prefix for descending order
81
- // (e.g. "-createdAt" means ORDER BY createdAt DESC).
82
- if (query?.sort) {
83
- const rawSort = query.sort;
84
- const descPrefix = rawSort.startsWith("-");
85
- const sortField = descPrefix ? rawSort.slice(1) : rawSort;
86
- const sortDir = descPrefix
87
- ? "desc"
88
- : query.order === "desc"
89
- ? "desc"
90
- : "asc";
91
- q = q.orderBy(sortField, sortDir);
92
- }
93
-
94
- // ── Basic Sieve filter parsing ────────────────────────────────────────────
95
- // Supports: ==, !=, <, <=, >, >=, @= (array-contains)
96
- if (query?.filters) {
97
- const clauses = query.filters
98
- .split(",")
99
- .map((s) => s.trim())
100
- .filter(Boolean);
101
- for (const clause of clauses) {
102
- const match = clause.match(
103
- /^([^<>=!@]+)\s*(==|!=|<=|>=|<|>|@=)\s*(.+)$/,
104
- );
105
- if (!match) continue;
106
- const [, fieldRaw, opToken, valueRaw] = match;
107
- const field = fieldRaw.trim();
108
- const op = TOKEN_TO_OP[opToken.trim()] ?? "==";
109
- const value = coerceValue(valueRaw.trim());
110
- q = (q as Query).where(field, op, value);
111
- }
112
- }
113
-
114
- // ── Count ─────────────────────────────────────────────────────────────────
115
- const countSnap = await q.count().get();
116
- const total: number = countSnap.data().count;
117
-
118
- // ── Paginate ──────────────────────────────────────────────────────────────
119
- const offset = (page - 1) * perPage;
120
- const pagedSnap = await q.offset(offset).limit(perPage).get();
121
-
122
- const data = pagedSnap.docs.map((d) => this.mapDoc(d));
123
- const totalPages =
124
- total === 0 ? 0 : Math.max(1, Math.ceil(total / perPage));
125
-
126
- return { data, total, page, perPage, totalPages };
127
- }
128
-
129
- async findWhere(field: keyof T, op: WhereOp, value: unknown): Promise<T[]> {
130
- const snap = await (this.getCollection() as Query)
131
- .where(field as string, op, value)
132
- .get();
133
- return snap.docs.map((d) => this.mapDoc(d));
134
- }
135
-
136
- // ── IWriteRepository ───────────────────────────────────────────────────────
137
-
138
- async create(data: Omit<T, "id" | "createdAt" | "updatedAt">): Promise<T> {
139
- const now = new Date();
140
- const payload = prepareForFirestore({
141
- ...(data as Record<string, unknown>),
142
- createdAt: now,
143
- updatedAt: now,
144
- });
145
- const ref = await this.getCollection().add(payload);
146
- const snap = await ref.get();
147
- return this.mapDoc(snap);
148
- }
149
-
150
- async update(id: string, data: Partial<T>): Promise<T> {
151
- const payload = prepareForFirestore({
152
- ...(data as Record<string, unknown>),
153
- updatedAt: new Date(),
154
- });
155
- await this.getCollection()
156
- .doc(id)
157
- .update(payload as Record<string, unknown>);
158
- const snap = await this.getCollection().doc(id).get();
159
- if (!snap.exists) throw new Error(`Document not found after update: ${id}`);
160
- return this.mapDoc(snap);
161
- }
162
-
163
- async delete(id: string): Promise<void> {
164
- await this.getCollection().doc(id).delete();
165
- }
166
-
167
- async batchCreate(
168
- items: Array<Omit<T, "id" | "createdAt" | "updatedAt">>,
169
- ): Promise<T[]> {
170
- const now = new Date();
171
- const batch: WriteBatch = this.db.batch();
172
- const refs = items.map((item) => {
173
- const ref = this.getCollection().doc();
174
- const payload = prepareForFirestore({
175
- ...(item as Record<string, unknown>),
176
- createdAt: now,
177
- updatedAt: now,
178
- });
179
- batch.set(ref, payload);
180
- return ref;
181
- });
182
- await batch.commit();
183
-
184
- // Fetch created docs in one round-trip
185
- const snaps = await Promise.all(refs.map((r) => r.get()));
186
- return snaps.map((s) => this.mapDoc(s));
187
- }
188
-
189
- async batchDelete(ids: string[]): Promise<void> {
190
- const batch: WriteBatch = this.db.batch();
191
- for (const id of ids) {
192
- batch.delete(this.getCollection().doc(id));
193
- }
194
- await batch.commit();
195
- }
196
-
197
- // ── Extended helpers (not in IRepository contract) ────────────────────────
198
-
199
- /** Find by ID or throw `Error` with a descriptive message. */
200
- async findByIdOrFail(id: string): Promise<T> {
201
- const doc = await this.findById(id);
202
- if (!doc) throw new Error(`Document not found: ${this.collection}/${id}`);
203
- return doc;
204
- }
205
-
206
- /** Find first document where `field == value`. */
207
- async findOneBy(field: string, value: unknown): Promise<T | null> {
208
- const snap = await this.getCollection()
209
- .where(field, "==", value)
210
- .limit(1)
211
- .get();
212
- if (snap.empty) return null;
213
- return this.mapDoc(snap.docs[0]);
214
- }
215
-
216
- /** Count all documents in the collection. */
217
- async count(): Promise<number> {
218
- const snap = await this.getCollection().count().get();
219
- return snap.data().count;
220
- }
221
- }
222
-
223
- // ─── Internal helpers ─────────────────────────────────────────────────────────
224
-
225
- const TOKEN_TO_OP: Record<string, FirebaseFirestore.WhereFilterOp> = {
226
- "==": "==",
227
- "!=": "!=",
228
- "<": "<",
229
- "<=": "<=",
230
- ">": ">",
231
- ">=": ">=",
232
- "@=": "array-contains",
233
- };
234
-
235
- /** Best-effort scalar coercion for sieve filter values. */
236
- function coerceValue(raw: string): unknown {
237
- if (raw === "true") return true;
238
- if (raw === "false") return false;
239
- if (raw === "null") return null;
240
- const n = Number(raw);
241
- if (!Number.isNaN(n) && raw !== "") return n;
242
- return raw;
243
- }