@mohasinac/appkit 3.6.5 → 3.7.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 (276) hide show
  1. package/dist/_internal/client/features/layout/DashboardLayoutClient.d.ts +17 -3
  2. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +7 -2
  3. package/dist/_internal/client/features/tour/TourProvider.d.ts +5 -2
  4. package/dist/_internal/client/features/tour/TourProvider.js +125 -12
  5. package/dist/_internal/client/theme/ThemeProvider.js +1 -1
  6. package/dist/_internal/server/features/faqs/og.js +5 -1
  7. package/dist/_internal/server/features/reviews/og.js +5 -1
  8. package/dist/_internal/server/features/seo/manifest.js +2 -1
  9. package/dist/_internal/server/features/seo/og.js +7 -1
  10. package/dist/_internal/server/features/tester/visibility.d.ts +13 -0
  11. package/dist/_internal/server/features/tester/visibility.js +28 -0
  12. package/dist/_internal/server/functions/scheduled.d.ts +2 -1
  13. package/dist/_internal/server/functions/scheduled.js +9 -1
  14. package/dist/_internal/server/jobs/core/jobRunners.js +5 -0
  15. package/dist/_internal/server/jobs/core/resetOtpVerification.d.ts +17 -0
  16. package/dist/_internal/server/jobs/core/resetOtpVerification.js +88 -0
  17. package/dist/_internal/server/jobs/core/testerSandboxCleanup.d.ts +6 -0
  18. package/dist/_internal/server/jobs/core/testerSandboxCleanup.js +35 -0
  19. package/dist/_internal/server/jobs/handlers/_helpers.d.ts +6 -0
  20. package/dist/_internal/server/jobs/handlers/_helpers.js +12 -0
  21. package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
  22. package/dist/_internal/server/jobs/handlers/index.js +2 -0
  23. package/dist/_internal/server/jobs/handlers/messages.d.ts +2 -0
  24. package/dist/_internal/server/jobs/handlers/messages.js +2 -0
  25. package/dist/_internal/server/jobs/handlers/testerSandboxCleanup.d.ts +2 -0
  26. package/dist/_internal/server/jobs/handlers/testerSandboxCleanup.js +2 -0
  27. package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
  28. package/dist/_internal/shared/actions/action-registry.js +48 -0
  29. package/dist/_internal/shared/tokens/index.d.ts +12 -12
  30. package/dist/client.d.ts +15 -3
  31. package/dist/client.js +10 -2
  32. package/dist/constants/api-endpoints.d.ts +36 -12
  33. package/dist/constants/api-endpoints.js +16 -8
  34. package/dist/constants/field-names.d.ts +9 -0
  35. package/dist/constants/field-names.js +12 -0
  36. package/dist/constants/index.d.ts +1 -1
  37. package/dist/constants/index.js +1 -1
  38. package/dist/features/account/components/LinkedAccountsSection.d.ts +11 -0
  39. package/dist/features/account/components/LinkedAccountsSection.js +11 -0
  40. package/dist/features/account/components/UserSidebar.d.ts +3 -1
  41. package/dist/features/account/components/UserSidebar.js +9 -13
  42. package/dist/features/account/hooks/useCollapsedSections.d.ts +20 -0
  43. package/dist/features/account/hooks/useCollapsedSections.js +63 -0
  44. package/dist/features/account/hooks/useProfile.d.ts +8 -0
  45. package/dist/features/account/index.d.ts +1 -0
  46. package/dist/features/account/index.js +1 -0
  47. package/dist/features/admin/components/AdminAddressEditorView.js +2 -2
  48. package/dist/features/admin/components/AdminCarouselView.js +2 -2
  49. package/dist/features/admin/components/AdminCategoryEditorView.js +2 -2
  50. package/dist/features/admin/components/AdminProductEditorView.js +5 -2
  51. package/dist/features/admin/components/AdminSectionsView.js +3 -18
  52. package/dist/features/admin/components/AdminSidebar.js +8 -6
  53. package/dist/features/admin/components/AdminSiteSettingsView.js +133 -127
  54. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.d.ts +9 -0
  55. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +129 -0
  56. package/dist/features/admin/components/AdminTesterChecklistView.d.ts +6 -0
  57. package/dist/features/admin/components/AdminTesterChecklistView.js +93 -0
  58. package/dist/features/admin/components/AdminUserEditorView.d.ts +3 -1
  59. package/dist/features/admin/components/AdminUserEditorView.js +7 -1
  60. package/dist/features/admin/components/AdminUsersView.js +1 -1
  61. package/dist/features/admin/components/DataListingView.js +2 -2
  62. package/dist/features/admin/components/analytics/AdminPageViewsReportView.d.ts +8 -0
  63. package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +41 -0
  64. package/dist/features/admin/components/index.d.ts +6 -0
  65. package/dist/features/admin/components/index.js +3 -0
  66. package/dist/features/admin/schemas/firestore.d.ts +0 -7
  67. package/dist/features/admin/schemas/firestore.js +6 -6
  68. package/dist/features/analytics/components/PageViewTracker.d.ts +12 -0
  69. package/dist/features/analytics/components/PageViewTracker.js +22 -0
  70. package/dist/features/analytics/repository/page-views.repository.d.ts +32 -0
  71. package/dist/features/analytics/repository/page-views.repository.js +43 -0
  72. package/dist/features/analytics/types.d.ts +6 -0
  73. package/dist/features/analytics/types.js +13 -0
  74. package/dist/features/auth/components/SocialAuthButtons.js +1 -1
  75. package/dist/features/auth/hooks/useAuth.d.ts +12 -0
  76. package/dist/features/auth/hooks/useAuth.js +109 -0
  77. package/dist/features/auth/permissions/constants.d.ts +1 -1
  78. package/dist/features/auth/schemas/firestore.d.ts +17 -1
  79. package/dist/features/auth/schemas/firestore.js +2 -0
  80. package/dist/features/blog/components/BlogIndexListing.js +2 -2
  81. package/dist/features/blog/schemas/firestore.d.ts +4 -0
  82. package/dist/features/cart/actions/cart-actions.js +20 -2
  83. package/dist/features/categories/components/CategoriesIndexListing.js +2 -2
  84. package/dist/features/categories/components/CategoryBundlesListing.js +2 -2
  85. package/dist/features/categories/components/CategoryDetailPageView.js +3 -1
  86. package/dist/features/categories/components/CategoryProductsListing.js +2 -2
  87. package/dist/features/categories/schemas/firestore.d.ts +4 -0
  88. package/dist/features/classified/components/ClassifiedIndexListing.js +2 -2
  89. package/dist/features/digital-codes/components/DigitalCodesIndexListing.js +2 -2
  90. package/dist/features/email/primitives.d.ts +2 -2
  91. package/dist/features/email/primitives.js +2 -2
  92. package/dist/features/events/components/EventsIndexListing.js +2 -2
  93. package/dist/features/events/schemas/firestore.d.ts +4 -0
  94. package/dist/features/layout/BackToTop.d.ts +6 -1
  95. package/dist/features/layout/BackToTop.js +31 -6
  96. package/dist/features/live/components/LiveItemsIndexListing.js +2 -2
  97. package/dist/features/media/MediaVideo.js +5 -1
  98. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +2 -2
  99. package/dist/features/products/components/AuctionsIndexListing.js +2 -2
  100. package/dist/features/products/components/PrizeDrawsIndexListing.js +2 -2
  101. package/dist/features/products/components/ProductsIndexListing.js +2 -2
  102. package/dist/features/products/constants/action-defs.d.ts +2 -0
  103. package/dist/features/products/constants/action-defs.js +2 -0
  104. package/dist/features/products/schemas/firestore.d.ts +4 -0
  105. package/dist/features/promotions/components/CouponsIndexListing.js +2 -2
  106. package/dist/features/reviews/components/ReviewsIndexListing.js +2 -2
  107. package/dist/features/seller/actions/seller-actions.js +11 -6
  108. package/dist/features/seller/components/SellerAddressesView.js +2 -2
  109. package/dist/features/seller/components/SellerBidsView.js +2 -2
  110. package/dist/features/seller/components/SellerOrdersView.js +2 -2
  111. package/dist/features/seller/components/SellerProductsView.js +2 -2
  112. package/dist/features/seller/components/SellerSidebar.d.ts +3 -1
  113. package/dist/features/seller/components/SellerSidebar.js +9 -8
  114. package/dist/features/seller/components/SellerStoreCategoriesView.js +2 -2
  115. package/dist/features/seller/components/SellerTemplatesView.js +2 -2
  116. package/dist/features/shell/StepForm.js +4 -4
  117. package/dist/features/stores/actions/store-query-actions.d.ts +5 -4
  118. package/dist/features/stores/actions/store-query-actions.js +11 -8
  119. package/dist/features/stores/components/StoreAuctionsListing.js +2 -2
  120. package/dist/features/stores/components/StoreClassifiedsListing.js +2 -2
  121. package/dist/features/stores/components/StoreDigitalCodesListing.js +2 -2
  122. package/dist/features/stores/components/StoreLiveItemsListing.js +2 -2
  123. package/dist/features/stores/components/StorePreOrdersListing.js +2 -2
  124. package/dist/features/stores/components/StoreProductsListing.js +2 -2
  125. package/dist/features/stores/components/StoreReviewsListing.js +2 -2
  126. package/dist/features/stores/components/StoresIndexListing.js +2 -2
  127. package/dist/features/stores/schemas/firestore.d.ts +4 -0
  128. package/dist/features/tester/actions/checklist-item-actions.d.ts +69 -0
  129. package/dist/features/tester/actions/checklist-item-actions.js +42 -0
  130. package/dist/features/tester/actions/index.d.ts +1 -0
  131. package/dist/features/tester/actions/index.js +1 -0
  132. package/dist/features/tester/components/AdminTesterFeedbackIssuesView.d.ts +2 -0
  133. package/dist/features/tester/components/AdminTesterFeedbackIssuesView.js +22 -0
  134. package/dist/features/tester/components/AdminTesterFeedbackListView.d.ts +3 -0
  135. package/dist/features/tester/components/AdminTesterFeedbackListView.js +100 -0
  136. package/dist/features/tester/components/AdminTesterFeedbackReportView.d.ts +2 -0
  137. package/dist/features/tester/components/AdminTesterFeedbackReportView.js +30 -0
  138. package/dist/features/tester/components/AdminTesterFeedbackView.d.ts +2 -0
  139. package/dist/features/tester/components/AdminTesterFeedbackView.js +9 -0
  140. package/dist/features/tester/components/TesterChecklistStepRow.d.ts +18 -0
  141. package/dist/features/tester/components/TesterChecklistStepRow.js +29 -0
  142. package/dist/features/tester/components/TesterFeedbackChart.d.ts +14 -0
  143. package/dist/features/tester/components/TesterFeedbackChart.js +18 -0
  144. package/dist/features/tester/components/TesterHubView.d.ts +5 -0
  145. package/dist/features/tester/components/TesterHubView.js +71 -0
  146. package/dist/features/tester/components/index.d.ts +11 -0
  147. package/dist/features/tester/components/index.js +7 -0
  148. package/dist/features/tester/index.d.ts +2 -0
  149. package/dist/features/tester/index.js +2 -0
  150. package/dist/features/tester/repository/index.d.ts +2 -0
  151. package/dist/features/tester/repository/index.js +2 -0
  152. package/dist/features/tester/repository/tester-checklist-item.repository.d.ts +13 -0
  153. package/dist/features/tester/repository/tester-checklist-item.repository.js +55 -0
  154. package/dist/features/tester/repository/tester-checklist-response.repository.d.ts +42 -0
  155. package/dist/features/tester/repository/tester-checklist-response.repository.js +98 -0
  156. package/dist/features/tester/schemas/firestore.d.ts +85 -0
  157. package/dist/features/tester/schemas/firestore.js +93 -0
  158. package/dist/features/tester/schemas/index.d.ts +1 -0
  159. package/dist/features/tester/schemas/index.js +1 -0
  160. package/dist/features/tester/seed-data/blog-tester-seed-data.d.ts +2 -0
  161. package/dist/features/tester/seed-data/blog-tester-seed-data.js +40 -0
  162. package/dist/features/tester/seed-data/categories-tester-seed-data.d.ts +2 -0
  163. package/dist/features/tester/seed-data/categories-tester-seed-data.js +177 -0
  164. package/dist/features/tester/seed-data/events-tester-seed-data.d.ts +2 -0
  165. package/dist/features/tester/seed-data/events-tester-seed-data.js +50 -0
  166. package/dist/features/tester/seed-data/index.d.ts +6 -0
  167. package/dist/features/tester/seed-data/index.js +6 -0
  168. package/dist/features/tester/seed-data/products-tester-seed-data.d.ts +2 -0
  169. package/dist/features/tester/seed-data/products-tester-seed-data.js +151 -0
  170. package/dist/features/tester/seed-data/stores-tester-seed-data.d.ts +2 -0
  171. package/dist/features/tester/seed-data/stores-tester-seed-data.js +40 -0
  172. package/dist/features/tester/seed-data/tester-checklist-seed-data.d.ts +2 -0
  173. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +248 -0
  174. package/dist/features/tester/seed-data/tester-ttl.d.ts +4 -0
  175. package/dist/features/tester/seed-data/tester-ttl.js +6 -0
  176. package/dist/features/tester/server.d.ts +9 -0
  177. package/dist/features/tester/server.js +8 -0
  178. package/dist/index.d.ts +28 -2
  179. package/dist/index.js +51 -1
  180. package/dist/next/api/api-response.js +5 -1
  181. package/dist/next/api/routeHandler.js +10 -1
  182. package/dist/next/middleware/chain.js +1 -1
  183. package/dist/next/routing/route-map.d.ts +6 -7
  184. package/dist/next/routing/route-map.js +3 -7
  185. package/dist/providers/payment-manual/index.d.ts +2 -2
  186. package/dist/providers/payment-manual/index.js +2 -2
  187. package/dist/react/contexts/SessionContext.d.ts +4 -0
  188. package/dist/react/contexts/SessionContext.js +4 -0
  189. package/dist/repositories/index.d.ts +4 -0
  190. package/dist/repositories/index.js +3 -0
  191. package/dist/security/pii-encrypt.js +12 -2
  192. package/dist/seed/addresses-seed-data.js +1 -1
  193. package/dist/seed/bids-seed-data.js +1 -1
  194. package/dist/seed/blog-posts-seed-data.js +1 -1
  195. package/dist/seed/carousel-slides-seed-data.js +22 -16
  196. package/dist/seed/carousels-seed-data.js +1 -1
  197. package/dist/seed/cart-seed-data.js +1 -1
  198. package/dist/seed/categories-seed-data.js +1 -1
  199. package/dist/seed/claimed-coupons-seed-data.js +1 -1
  200. package/dist/seed/conversations-seed-data.js +1 -1
  201. package/dist/seed/coupon-usage-seed-data.js +1 -1
  202. package/dist/seed/coupons-seed-data.js +1 -1
  203. package/dist/seed/events-seed-data.js +1 -1
  204. package/dist/seed/faq-seed-data.js +119 -3
  205. package/dist/seed/grouped-listings-seed-data.d.ts +2 -0
  206. package/dist/seed/grouped-listings-seed-data.js +1 -1
  207. package/dist/seed/history-seed-data.js +1 -1
  208. package/dist/seed/homepage-sections-seed-data.js +1 -1
  209. package/dist/seed/index.d.ts +2 -2
  210. package/dist/seed/index.js +7 -3
  211. package/dist/seed/lottery-entries-seed-data.js +1 -1
  212. package/dist/seed/manifest.d.ts +4 -3
  213. package/dist/seed/manifest.js +13 -6
  214. package/dist/seed/notifications-seed-data.js +1 -1
  215. package/dist/seed/offers-seed-data.js +1 -1
  216. package/dist/seed/orders-seed-data.js +1 -1
  217. package/dist/seed/payouts-seed-data.js +1 -1
  218. package/dist/seed/products-art-seed-data.js +1 -1
  219. package/dist/seed/products-auctions-seed-data.js +1 -1
  220. package/dist/seed/products-classifieds-seed-data.js +1 -1
  221. package/dist/seed/products-digital-codes-seed-data.js +1 -1
  222. package/dist/seed/products-live-items-seed-data.js +1 -1
  223. package/dist/seed/products-preorders-seed-data.d.ts +2 -0
  224. package/dist/seed/products-preorders-seed-data.js +1 -1
  225. package/dist/seed/products-prize-draws-seed-data.js +1 -1
  226. package/dist/seed/products-standard-seed-data.js +1 -1
  227. package/dist/seed/products-stickers-seed-data.js +1 -1
  228. package/dist/seed/reviews-seed-data.js +1 -1
  229. package/dist/seed/scammers-seed-data.js +1 -1
  230. package/dist/seed/sessions-seed-data.js +1 -1
  231. package/dist/seed/site-settings-seed-data.js +22 -16
  232. package/dist/seed/store-addresses-seed-data.js +1 -1
  233. package/dist/seed/store-extensions-seed-data.js +1 -1
  234. package/dist/seed/stores-seed-data.js +1 -1
  235. package/dist/seed/support-tickets-seed-data.js +1 -1
  236. package/dist/seed/tester-checklist-seed-data.d.ts +2 -0
  237. package/dist/seed/tester-checklist-seed-data.js +248 -0
  238. package/dist/seed/users-seed-data.js +1 -1
  239. package/dist/seed/wishlists-seed-data.js +1 -1
  240. package/dist/server.d.ts +7 -2
  241. package/dist/server.js +19 -12
  242. package/dist/styles.css +163 -147
  243. package/dist/tailwind-utilities.css +1 -1
  244. package/dist/tokens/color-pairs.d.ts +46 -0
  245. package/dist/tokens/color-pairs.js +93 -0
  246. package/dist/tokens/index.d.ts +60 -60
  247. package/dist/tokens/index.js +30 -30
  248. package/dist/tokens/themes/cobalt-night.d.ts +3 -2
  249. package/dist/tokens/themes/cobalt-night.js +3 -2
  250. package/dist/tokens/themes/default-dark.d.ts +4 -1
  251. package/dist/tokens/themes/default-dark.js +44 -41
  252. package/dist/tokens/themes/default-light.d.ts +5 -1
  253. package/dist/tokens/themes/default-light.js +39 -35
  254. package/dist/tokens/themes/sunset.js +4 -4
  255. package/dist/tokens/tokens.css +110 -104
  256. package/dist/ui/components/CollapsibleSection.d.ts +15 -0
  257. package/dist/ui/components/CollapsibleSection.js +13 -0
  258. package/dist/ui/components/ListingToolbar.js +2 -1
  259. package/dist/ui/components/Semantic.style.css +3 -3
  260. package/dist/ui/components/SideDrawer.style.css +19 -19
  261. package/dist/ui/components/Slider.js +1 -1
  262. package/dist/ui/components/StickyToolbar.d.ts +36 -7
  263. package/dist/ui/components/StickyToolbar.js +63 -5
  264. package/dist/ui/components/Tabs.js +17 -1
  265. package/dist/ui/components/Tabs.style.css +10 -0
  266. package/dist/ui/components/Typography.js +7 -0
  267. package/dist/ui/components/surface-tokens.d.ts +0 -7
  268. package/dist/ui/components/surface-tokens.js +7 -0
  269. package/dist/ui/index.d.ts +6 -0
  270. package/dist/ui/index.js +3 -0
  271. package/dist/ui/rich-text/RichText.style.css +20 -20
  272. package/dist/utils/id-generators.d.ts +13 -0
  273. package/dist/utils/id-generators.js +17 -0
  274. package/package.json +1 -1
  275. package/scripts/seed-cli-loader.mjs +15 -0
  276. package/scripts/seed-cli.mjs +71 -17
@@ -27,6 +27,10 @@ export interface SessionUser {
27
27
  sessionId?: string;
28
28
  phoneVerified?: boolean;
29
29
  avatarMetadata?: AvatarMetadataShape | null;
30
+ /** Set when this account owns a store — drives the admin sidebar's "Go to my Store" cross-nav link. */
31
+ storeId?: string;
32
+ /** Tester program flag — orthogonal to `role`. Unlocks the Tester Hub nav item/page. */
33
+ isTester?: boolean;
30
34
  publicProfile?: FirestoreDocument;
31
35
  stats?: FirestoreDocument;
32
36
  metadata?: FirestoreDocument;
@@ -62,6 +62,8 @@ function buildSessionUser(authUser, serverData) {
62
62
  : undefined,
63
63
  sessionId: currentSessionId || undefined,
64
64
  phoneVerified: serverData.phoneVerified,
65
+ storeId: serverData.storeId,
66
+ isTester: serverData.isTester,
65
67
  avatarMetadata: serverData.avatarMetadata?.url
66
68
  ? {
67
69
  url: serverData.avatarMetadata.url,
@@ -130,6 +132,8 @@ export function SessionProvider({ children, initialUser, endpoints: endpointOver
130
132
  updatedAt: data.updatedAt ? new Date(data.updatedAt) : undefined,
131
133
  sessionId: currentSessionId || undefined,
132
134
  phoneVerified: data.phoneVerified,
135
+ storeId: data.storeId,
136
+ isTester: data.isTester,
133
137
  avatarMetadata: data.avatarMetadata?.url
134
138
  ? {
135
139
  url: data.avatarMetadata.url,
@@ -27,6 +27,8 @@ export { couponsRepository } from "../features/promotions/repository/coupons.rep
27
27
  export { ClaimedCouponsRepository, claimedCouponsRepository, } from "../features/promotions/repository/claimed-coupons.repository";
28
28
  export type { ClaimedCouponCreateInput } from "../features/promotions/repository/claimed-coupons.repository";
29
29
  export { FAQsRepository, FirebaseFAQsRepository, faqsRepository, } from "../features/faq/repository/faqs.repository";
30
+ export { TesterChecklistItemRepository, testerChecklistItemRepository, } from "../features/tester/repository/tester-checklist-item.repository";
31
+ export { TesterChecklistResponseRepository, testerChecklistResponseRepository, } from "../features/tester/repository/tester-checklist-response.repository";
30
32
  export { BlogRepository, blogRepository, } from "../features/blog/repository/blog.repository";
31
33
  export { payoutRepository } from "../features/payments/repository/payout.repository";
32
34
  export { jobsRepository, JobsRepository } from "../features/jobs/repository/jobs.repository";
@@ -58,3 +60,5 @@ export { loadProductFeaturesForStore } from "../features/products/repository/loa
58
60
  export { LotteryEntryRepository, lotteryEntryRepository, } from "../features/lottery/repository/lottery-entry.repository";
59
61
  export { MediaAssetsRepository, mediaAssetsRepository, } from "../features/media/repository/media-assets.repository";
60
62
  export type { MediaAssetDocument, MediaAssetCreateInput, } from "../features/media/repository/media-assets.repository";
63
+ export { PageViewsRepository, pageViewsRepository, PAGE_VIEW_ENTITY_TYPES, } from "../features/analytics/repository/page-views.repository";
64
+ export type { PageViewDocument, PageViewEntityType, RecordPageViewInput, } from "../features/analytics/repository/page-views.repository";
@@ -33,6 +33,8 @@ export { CategoriesRepository, categoriesRepository, } from "../features/categor
33
33
  export { couponsRepository } from "../features/promotions/repository/coupons.repository";
34
34
  export { ClaimedCouponsRepository, claimedCouponsRepository, } from "../features/promotions/repository/claimed-coupons.repository";
35
35
  export { FAQsRepository, FirebaseFAQsRepository, faqsRepository, } from "../features/faq/repository/faqs.repository";
36
+ export { TesterChecklistItemRepository, testerChecklistItemRepository, } from "../features/tester/repository/tester-checklist-item.repository";
37
+ export { TesterChecklistResponseRepository, testerChecklistResponseRepository, } from "../features/tester/repository/tester-checklist-response.repository";
36
38
  export { BlogRepository, blogRepository, } from "../features/blog/repository/blog.repository";
37
39
  export { payoutRepository } from "../features/payments/repository/payout.repository";
38
40
  export { jobsRepository, JobsRepository } from "../features/jobs/repository/jobs.repository";
@@ -69,3 +71,4 @@ export { loadProductFeaturesForStore } from "../features/products/repository/loa
69
71
  export { LotteryEntryRepository, lotteryEntryRepository, } from "../features/lottery/repository/lottery-entry.repository";
70
72
  // Media assets — short ID → storagePath mapping for SEO-friendly /media/{id} URLs
71
73
  export { MediaAssetsRepository, mediaAssetsRepository, } from "../features/media/repository/media-assets.repository";
74
+ export { PageViewsRepository, pageViewsRepository, PAGE_VIEW_ENTITY_TYPES, } from "../features/analytics/repository/page-views.repository";
@@ -9,9 +9,19 @@
9
9
  * Ciphertext format: "enc:v1:<iv_b64>:<ciphertext_b64>:<authtag_b64>"
10
10
  * Blind index format: "hmac-sha256:<sha256_hex>"
11
11
  */
12
+ import { createRequire } from "node:module";
12
13
  // crypto is a Node.js built-in. Use require() to keep it out of the static
13
- // import graph so Next.js Edge bundler does not warn about this file.
14
- function nodeCrypto() { return require("crypto"); }
14
+ // import graph so Next.js Edge bundler does not warn about this file. A bare
15
+ // top-level `require(...)` call only works when the compiled dist output is
16
+ // loaded via CommonJS (or a bundler that polyfills `require`) — under a
17
+ // plain Node ESM `import()` (e.g. appkit/scripts/seed-cli.mjs and any other
18
+ // standalone script importing @mohasinac/appkit directly), there is no
19
+ // ambient `require` global, so that call threw `ReferenceError: require is
20
+ // not defined`. createRequire(import.meta.url) works in both: it's still a
21
+ // runtime function call a bundler's static analysis won't follow into the
22
+ // client graph, but it resolves correctly under Node's own ESM loader too.
23
+ const nodeRequire = createRequire(import.meta.url);
24
+ function nodeCrypto() { return nodeRequire("crypto"); }
15
25
  const ALGO = "aes-256-gcm";
16
26
  export const ENC_PREFIX = "enc:v1:";
17
27
  export const HMAC_PREFIX = "hmac-sha256:";
@@ -14,7 +14,7 @@
14
14
  * @tag layer:seed
15
15
  * @tag pattern:none
16
16
  * @tag access:server-only
17
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
17
+ * @tag consumers:seed/index.ts,seed/runner.ts
18
18
  * @tag sideEffects:none
19
19
  */
20
20
  const NOW = new Date();
@@ -9,7 +9,7 @@
9
9
  * @tag layer:seed
10
10
  * @tag pattern:none
11
11
  * @tag access:server-only
12
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
12
+ * @tag consumers:seed/index.ts,seed/runner.ts
13
13
  * @tag sideEffects:none
14
14
  */
15
15
  const NOW = new Date();
@@ -10,7 +10,7 @@
10
10
  * @tag layer:seed
11
11
  * @tag pattern:none
12
12
  * @tag access:server-only
13
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
13
+ * @tag consumers:seed/index.ts,seed/runner.ts
14
14
  * @tag sideEffects:none
15
15
  */
16
16
  import { seedExtMedia } from "./_helpers/media";
@@ -1,6 +1,11 @@
1
1
  /*
2
- * WHY: Seeds 6 carousel slides for YGO marketplace homepage hero carousel.
3
- * WHAT: 5 active + 1 inactive. YGO card art backgrounds with dim overlay, CTAs for shop/auctions/bundles/pre-orders/graded.
2
+ * WHY: Seeds 6 carousel slides for the marketplace homepage hero carousel.
3
+ * WHAT: 5 active + 1 inactive. Picsum.photos placeholder backgrounds (deterministic,
4
+ * free, no API key) with dim overlay, CTAs for shop/auctions/bundles/pre-orders/graded.
5
+ * One slide (slide-blue-eyes-auction) uses background.type:"video" with a direct,
6
+ * Creative-Commons-licensed MP4 URL — HeroCarousel renders video backgrounds via a
7
+ * native <video> element (MediaVideo), not a YouTube iframe embed, so this needs a
8
+ * playable video file URL rather than a YouTube video ID.
4
9
  *
5
10
  * EXPORTS:
6
11
  * carouselSlidesSeedData — Array of Partial<CarouselSlideDocument> for seed runner
@@ -9,7 +14,7 @@
9
14
  * @tag layer:seed
10
15
  * @tag pattern:none
11
16
  * @tag access:server-only
12
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
17
+ * @tag consumers:seed/index.ts,seed/runner.ts
13
18
  * @tag sideEffects:none
14
19
  */
15
20
  import { seedExtMedia } from "./_helpers/media";
@@ -19,12 +24,12 @@ const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
19
24
  const _rawSlides = [
20
25
  {
21
26
  id: "slide-hero-homepage",
22
- title: "India's #1 YGO Collectibles Marketplace",
27
+ title: "India's Largest Collectibles Marketplace",
23
28
  order: 1,
24
29
  active: true,
25
30
  background: {
26
31
  type: "image",
27
- url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/46986414.jpg"),
32
+ url: seedExtMedia("https://picsum.photos/seed/carousel-hero-homepage-20260101/1600/700"),
28
33
  dimOverlay: { enabled: true, opacity: 0.5 },
29
34
  },
30
35
  settings: { autoplayDelayMs: 5000, height: "tall" },
@@ -34,12 +39,13 @@ const _rawSlides = [
34
39
  },
35
40
  {
36
41
  id: "slide-blue-eyes-auction",
37
- title: "Blue-Eyes White Dragon Auctions Live",
42
+ title: "Rare Auctions Live Now",
38
43
  order: 2,
39
44
  active: true,
40
45
  background: {
41
- type: "image",
42
- url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/89631139.jpg"),
46
+ type: "video",
47
+ url: seedExtMedia("https://storage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"),
48
+ thumbnail: seedExtMedia("https://picsum.photos/seed/carousel-auctions-live-20260101/1600/700"),
43
49
  dimOverlay: { enabled: true, opacity: 0.4 },
44
50
  },
45
51
  link: { url: String(ROUTES.PUBLIC.AUCTIONS), openInNewTab: false },
@@ -50,15 +56,15 @@ const _rawSlides = [
50
56
  },
51
57
  {
52
58
  id: "slide-exodia-hunt",
53
- title: "Complete Your Exodia Set",
59
+ title: "Complete Your Collection",
54
60
  order: 3,
55
61
  active: true,
56
62
  background: {
57
63
  type: "image",
58
- url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"),
64
+ url: seedExtMedia("https://picsum.photos/seed/carousel-complete-collection-20260101/1600/700"),
59
65
  dimOverlay: { enabled: true, opacity: 0.45 },
60
66
  },
61
- link: { url: `${String(ROUTES.PUBLIC.PRODUCTS)}?q=exodia`, openInNewTab: false },
67
+ link: { url: String(ROUTES.PUBLIC.PRODUCTS), openInNewTab: false },
62
68
  settings: { autoplayDelayMs: 5000, height: "tall" },
63
69
  createdBy: "user-admin-letitrip",
64
70
  createdAt: daysAgo(50),
@@ -66,12 +72,12 @@ const _rawSlides = [
66
72
  },
67
73
  {
68
74
  id: "slide-gx-era",
69
- title: "GX Era Pre-Orders Now Open",
75
+ title: "Pre-Orders Now Open",
70
76
  order: 4,
71
77
  active: true,
72
78
  background: {
73
79
  type: "image",
74
- url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/89943723.jpg"),
80
+ url: seedExtMedia("https://picsum.photos/seed/carousel-preorders-open-20260101/1600/700"),
75
81
  dimOverlay: { enabled: true, opacity: 0.4 },
76
82
  },
77
83
  link: { url: "/pre-orders", openInNewTab: false },
@@ -82,12 +88,12 @@ const _rawSlides = [
82
88
  },
83
89
  {
84
90
  id: "slide-psa-graded",
85
- title: "PSA Graded Slabs — Authenticated Cards",
91
+ title: "Graded Slabs — Authenticated Collectibles",
86
92
  order: 5,
87
93
  active: true,
88
94
  background: {
89
95
  type: "image",
90
- url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/38033121.jpg"),
96
+ url: seedExtMedia("https://picsum.photos/seed/carousel-graded-slabs-20260101/1600/700"),
91
97
  dimOverlay: { enabled: true, opacity: 0.5 },
92
98
  },
93
99
  link: { url: "/categories/category-graded-cards", openInNewTab: false },
@@ -103,7 +109,7 @@ const _rawSlides = [
103
109
  active: false,
104
110
  background: {
105
111
  type: "image",
106
- url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/83764718.jpg"),
112
+ url: seedExtMedia("https://picsum.photos/seed/carousel-tournament-promo-20260101/1600/700"),
107
113
  dimOverlay: { enabled: true, opacity: 0.5 },
108
114
  },
109
115
  settings: { autoplayDelayMs: 5000, height: "tall" },
@@ -6,7 +6,7 @@
6
6
  * @tag layer:seed
7
7
  * @tag pattern:none
8
8
  * @tag access:server-only
9
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
9
+ * @tag consumers:seed/index.ts,seed/runner.ts
10
10
  * @tag sideEffects:none
11
11
  */
12
12
  function daysAgo(n) {
@@ -9,7 +9,7 @@
9
9
  * @tag layer:seed
10
10
  * @tag pattern:none
11
11
  * @tag access:server-only
12
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
12
+ * @tag consumers:seed/index.ts,seed/runner.ts
13
13
  * @tag sideEffects:none
14
14
  */
15
15
  import { getDefaultCurrency } from "./seed-market-config";
@@ -15,7 +15,7 @@
15
15
  * @tag layer:seed
16
16
  * @tag pattern:none
17
17
  * @tag access:server-only
18
- * @tag consumers:seed/runner.ts,SeedPanel
18
+ * @tag consumers:seed/runner.ts
19
19
  * @tag sideEffects:none
20
20
  */
21
21
  import { CATEGORY_FIELDS } from "../constants/field-names";
@@ -9,7 +9,7 @@
9
9
  * @tag layer:seed
10
10
  * @tag pattern:none
11
11
  * @tag access:server-only
12
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
12
+ * @tag consumers:seed/index.ts,seed/runner.ts
13
13
  * @tag sideEffects:none
14
14
  */
15
15
  import { createClaimedCouponId } from "../features/promotions/schemas";
@@ -9,7 +9,7 @@
9
9
  * @tag layer:seed
10
10
  * @tag pattern:none
11
11
  * @tag access:server-only
12
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
12
+ * @tag consumers:seed/index.ts,seed/runner.ts
13
13
  * @tag sideEffects:none
14
14
  */
15
15
  const NOW = new Date();
@@ -10,7 +10,7 @@
10
10
  * @tag layer:seed
11
11
  * @tag pattern:none
12
12
  * @tag access:server-only
13
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
13
+ * @tag consumers:seed/index.ts,seed/runner.ts
14
14
  * @tag sideEffects:none
15
15
  */
16
16
  const NOW = new Date();
@@ -9,7 +9,7 @@
9
9
  * @tag layer:seed
10
10
  * @tag pattern:none
11
11
  * @tag access:server-only
12
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
12
+ * @tag consumers:seed/index.ts,seed/runner.ts
13
13
  * @tag sideEffects:none
14
14
  */
15
15
  import { COUPON_FIELDS } from "../constants/field-names";
@@ -10,7 +10,7 @@
10
10
  * @tag layer:seed
11
11
  * @tag pattern:none
12
12
  * @tag access:server-only
13
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
13
+ * @tag consumers:seed/index.ts,seed/runner.ts
14
14
  * @tag sideEffects:none
15
15
  */
16
16
  import { EVENT_FIELDS, EVENT_ENTRY_FIELDS } from "../features/events/schemas";
@@ -1,8 +1,10 @@
1
1
  /*
2
- * WHY: Seeds 55 FAQs for LetItRip collectibles marketplace — covers general platform, shipping,
2
+ * WHY: Seeds 61 FAQs for LetItRip collectibles marketplace — covers general platform, shipping,
3
3
  * returns, payments, auctions, pre-orders, product info, account/security, scam awareness.
4
4
  * WHAT: Mix of broad collectibles marketplace FAQs + category-specific FAQs (trading cards, action figures,
5
- * diecast, Beyblade, model kits, grading, authenticity, bundles, prize draws).
5
+ * diecast, Beyblade, model kits, grading, authenticity, bundles, prize draws), plus (Phase 17,
6
+ * 2026-08-17) the verified-badge trust system, classifieds, digital codes, live items, personal
7
+ * catalogue, and seller procurement shipments — features shipped since the FAQs were last written.
6
8
  *
7
9
  * EXPORTS:
8
10
  * faqSeedData — Array of Partial<FAQDocument> for seed runner
@@ -11,7 +13,7 @@
11
13
  * @tag layer:seed
12
14
  * @tag pattern:none
13
15
  * @tag access:server-only
14
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
16
+ * @tag consumers:seed/index.ts,seed/runner.ts
15
17
  * @tag sideEffects:none
16
18
  */
17
19
  const NOW = new Date();
@@ -1094,4 +1096,118 @@ export const faqSeedData = [
1094
1096
  createdAt: daysAgo(40),
1095
1097
  updatedAt: daysAgo(6),
1096
1098
  },
1099
+ {
1100
+ id: "faq-what-is-verified-badge",
1101
+ question: "What does the verified seller badge mean?",
1102
+ answer: html(`<p>A verified badge means LetItRip has manually confirmed the seller's identity and store details before they were allowed to list. Verified sellers have passed our onboarding review — it doesn't guarantee every listing is accurate, but it does mean the seller is a real, accountable business we can act on if something goes wrong. Look for the badge on the store page next to the seller's name.</p>`),
1103
+ category: "account_security",
1104
+ showOnHomepage: false,
1105
+ showInFooter: false,
1106
+ isPinned: false,
1107
+ order: 56,
1108
+ priority: 6,
1109
+ tags: ["verified", "badge", "trust", "seller"],
1110
+ relatedFAQs: ["faq-spot-a-scam-listing", "faq-report-a-scammer"],
1111
+ stats: makeStats(900, 45),
1112
+ seo: { slug: "faq-what-is-verified-badge", metaTitle: "What Is the Verified Seller Badge?", metaDescription: "How LetItRip's seller verification works and what the badge means." },
1113
+ isActive: true,
1114
+ createdBy: "user-admin-letitrip",
1115
+ createdAt: daysAgo(20),
1116
+ updatedAt: daysAgo(2),
1117
+ },
1118
+ {
1119
+ id: "faq-what-are-classifieds",
1120
+ question: "What are Classified listings?",
1121
+ answer: html(`<p>Classifieds are listings for items that don't ship — local meetups, trades, or collections too large/fragile to post. A classified listing shows the seller's general area (not their exact address) and lets buyers message to arrange an in-person exchange or local pickup. LetItRip's escrow payment protection does not apply to classifieds — agree on payment terms directly with the seller and meet in a safe, public location.</p>`),
1122
+ category: "product_information",
1123
+ showOnHomepage: false,
1124
+ showInFooter: false,
1125
+ isPinned: false,
1126
+ order: 57,
1127
+ priority: 5,
1128
+ tags: ["classifieds", "local", "meetup", "listing-type"],
1129
+ relatedFAQs: ["faq-off-platform-payment-warning"],
1130
+ stats: makeStats(650, 30),
1131
+ seo: { slug: "faq-what-are-classifieds", metaTitle: "What Are Classified Listings?", metaDescription: "How local, no-shipping classified listings work on LetItRip." },
1132
+ isActive: true,
1133
+ createdBy: "user-admin-letitrip",
1134
+ createdAt: daysAgo(18),
1135
+ updatedAt: daysAgo(2),
1136
+ },
1137
+ {
1138
+ id: "faq-what-are-digital-codes",
1139
+ question: "How do digital code listings work?",
1140
+ answer: html(`<p>Digital code listings sell redeemable codes — game keys, gift cards, DLC unlocks — with no physical shipping. After payment, the code is revealed to you directly in your order. Because codes can't be "returned" once revealed, digital code purchases are final once you've viewed the code; make sure you're buying from a seller with a strong review history.</p>`),
1141
+ category: "product_information",
1142
+ showOnHomepage: false,
1143
+ showInFooter: false,
1144
+ isPinned: false,
1145
+ order: 58,
1146
+ priority: 5,
1147
+ tags: ["digital-codes", "game-keys", "listing-type"],
1148
+ relatedFAQs: ["faq-what-are-classifieds"],
1149
+ stats: makeStats(700, 35),
1150
+ seo: { slug: "faq-what-are-digital-codes", metaTitle: "How Digital Code Listings Work", metaDescription: "Buying and redeeming digital code listings on LetItRip." },
1151
+ isActive: true,
1152
+ createdBy: "user-admin-letitrip",
1153
+ createdAt: daysAgo(18),
1154
+ updatedAt: daysAgo(2),
1155
+ },
1156
+ {
1157
+ id: "faq-what-are-live-items",
1158
+ question: "What are Live listings?",
1159
+ answer: html(`<p>Live listings are for living animals sold by verified exotic-pet and breeder sellers — axolotls, reptiles, and similar. Every live listing requires the seller to specify safe-handling and shipping/pickup instructions, and buyers should confirm care requirements before purchasing. Live-animal sales follow the same escrow protection as physical goods, but delivery timing is coordinated directly with the seller due to live-animal shipping constraints.</p>`),
1160
+ category: "product_information",
1161
+ showOnHomepage: false,
1162
+ showInFooter: false,
1163
+ isPinned: false,
1164
+ order: 59,
1165
+ priority: 4,
1166
+ tags: ["live-items", "live-animals", "listing-type"],
1167
+ relatedFAQs: [],
1168
+ stats: makeStats(420, 20),
1169
+ seo: { slug: "faq-what-are-live-items", metaTitle: "What Are Live Listings?", metaDescription: "Buying live-animal listings safely on LetItRip." },
1170
+ isActive: true,
1171
+ createdBy: "user-admin-letitrip",
1172
+ createdAt: daysAgo(15),
1173
+ updatedAt: daysAgo(2),
1174
+ },
1175
+ {
1176
+ id: "faq-what-is-personal-catalogue",
1177
+ question: "What is My Catalogue?",
1178
+ answer: html(`<p>My Catalogue is a private space to track your own collection — items you own, whether or not they're for sale. Add items with photos and notes, and optionally submit any of them for review to convert into a real listing without re-entering the details. It's a personal inventory tool first, a fast path to listing second.</p>`),
1179
+ category: "product_information",
1180
+ showOnHomepage: false,
1181
+ showInFooter: false,
1182
+ isPinned: false,
1183
+ order: 60,
1184
+ priority: 4,
1185
+ tags: ["catalogue", "collection", "personal", "inventory"],
1186
+ relatedFAQs: [],
1187
+ stats: makeStats(380, 18),
1188
+ seo: { slug: "faq-what-is-personal-catalogue", metaTitle: "What Is My Catalogue?", metaDescription: "Track your personal collectibles collection with My Catalogue on LetItRip." },
1189
+ isActive: true,
1190
+ createdBy: "user-admin-letitrip",
1191
+ createdAt: daysAgo(12),
1192
+ updatedAt: daysAgo(1),
1193
+ },
1194
+ {
1195
+ id: "faq-what-are-procurement-shipments",
1196
+ question: "What is the Procurement / Shipments tool for sellers?",
1197
+ answer: html(`<p>Procurement Shipments is a seller-side tool for bulk-buying and processing inventory lots. Log a shipment (what you bought, the labor hours spent sorting/categorizing/listing it), and LetItRip computes the labor cost and estimated processing time automatically from your Payout Settings' hourly rate. It's for sellers who buy collections in bulk and turn them into individual listings, not a buyer-facing feature.</p>`),
1198
+ category: "general",
1199
+ showOnHomepage: false,
1200
+ showInFooter: false,
1201
+ isPinned: false,
1202
+ order: 61,
1203
+ priority: 3,
1204
+ tags: ["procurement", "shipments", "seller", "bulk"],
1205
+ relatedFAQs: [],
1206
+ stats: makeStats(210, 10),
1207
+ seo: { slug: "faq-what-are-procurement-shipments", metaTitle: "Procurement Shipments for Sellers", metaDescription: "How LetItRip's seller procurement shipment tracking tool works." },
1208
+ isActive: true,
1209
+ createdBy: "user-admin-letitrip",
1210
+ createdAt: daysAgo(10),
1211
+ updatedAt: daysAgo(1),
1212
+ },
1097
1213
  ];
@@ -3,6 +3,8 @@ export declare const groupedListingsSeedData: {
3
3
  title?: string | undefined;
4
4
  description?: string | undefined;
5
5
  slug?: string | undefined;
6
+ isTestData?: boolean | undefined;
7
+ testDataExpiresAt?: Date | undefined;
6
8
  seoTitle?: string | undefined;
7
9
  seoDescription?: string | undefined;
8
10
  seoKeywords?: string[] | undefined;
@@ -9,7 +9,7 @@
9
9
  * @tag layer:seed
10
10
  * @tag pattern:none
11
11
  * @tag access:server-only
12
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
12
+ * @tag consumers:seed/index.ts,seed/runner.ts
13
13
  * @tag sideEffects:none
14
14
  */
15
15
  import { PRODUCT_FIELDS } from "../constants/field-names";
@@ -9,7 +9,7 @@
9
9
  * @tag layer:seed
10
10
  * @tag pattern:none
11
11
  * @tag access:server-only
12
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
12
+ * @tag consumers:seed/index.ts,seed/runner.ts
13
13
  * @tag sideEffects:none
14
14
  */
15
15
  const NOW = new Date();
@@ -9,7 +9,7 @@
9
9
  * @tag layer:seed
10
10
  * @tag pattern:none
11
11
  * @tag access:server-only
12
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
12
+ * @tag consumers:seed/index.ts,seed/runner.ts
13
13
  * @tag sideEffects:none
14
14
  */
15
15
  import { seedExtMedia } from "./_helpers/media";
@@ -1,7 +1,6 @@
1
1
  export type { SeedCollection, SeedConfig, SeedResult } from "./types";
2
2
  export type { SeedLocaleData } from "./seed-market-config";
3
3
  export { registerSeedLocale, getSeedLocale, formatSeedPrice, makeSeedPhone, } from "./seed-market-config";
4
- export type { SeedCollectionName, SeedOperationResult, } from "./actions/demo-seed-actions";
5
4
  export type { SeedBaseUserDocument } from "./factories/user.factory";
6
5
  export { makeUser, makeFullUser, USER_FIXTURES, } from "./factories/user.factory";
7
6
  export type { SeedBaseProductDocument } from "./factories/product.factory";
@@ -80,10 +79,11 @@ export { conversationsSeedData } from "./conversations-seed-data";
80
79
  export { groupedListingsSeedData } from "./grouped-listings-seed-data";
81
80
  export { scammersSeedData } from "./scammers-seed-data";
82
81
  export { supportTicketsSeedData } from "./support-tickets-seed-data";
82
+ export { testerChecklistSeedData, storesTesterSeedData, categoriesTesterSeedData, productsTesterSeedData, blogTesterSeedData, eventsTesterSeedData, } from "../features/tester/seed-data";
83
83
  export { productFeaturesSeedData } from "./product-features-seed-data";
84
84
  export { offersSeedData } from "./offers-seed-data";
85
85
  export { payoutMethodsSeedData, shippingConfigsSeedData, analyticsCardsSeedData, analyticsAlertsSeedData, storeCategoriesSeedData, listingTemplatesSeedData, moderationQueueSeedData, reportsSeedData, itemRequestsSeedData, storeWhatsAppConfigSeedData, storeGoogleConfigSeedData, } from "./store-extensions-seed-data";
86
- export type { SeedManifest, SeedManifestEntry } from "./manifest";
86
+ export type { SeedManifest, SeedManifestEntry, SeedCollectionName } from "./manifest";
87
87
  export { SEED_MANIFEST } from "./manifest";
88
88
  export type { FirestoreIndexConfig } from "./firestore-indexes";
89
89
  export { mergeFirestoreIndices, generateMergedFirestoreIndexFile, } from "./firestore-indexes";
@@ -1,8 +1,9 @@
1
1
  // appkit/src/seed/index.ts
2
2
  //
3
- // Pure fixture data + factories. Server-only seed runner / demoSeed action
4
- // live in `./server.ts` so client-bundles that touch the main appkit barrel
5
- // for fixtures do not transitively reach firebase-admin via the runner.
3
+ // Pure fixture data + factories, consumed by appkit/scripts/seed-cli.mjs
4
+ // (direct-to-Firestore CLI seeding, no web route). The admin seed-panel web
5
+ // UI + its API route were removed see CLAUDE.md Phase 4 (demo seed panel
6
+ // removal).
6
7
  export { registerSeedLocale, getSeedLocale, formatSeedPrice, makeSeedPhone, } from "./seed-market-config";
7
8
  export { makeUser, makeFullUser, USER_FIXTURES, } from "./factories/user.factory";
8
9
  export { makeProduct, makeFullProduct, PRODUCT_FIXTURES, } from "./factories/product.factory";
@@ -67,6 +68,9 @@ export { conversationsSeedData } from "./conversations-seed-data";
67
68
  export { groupedListingsSeedData } from "./grouped-listings-seed-data";
68
69
  export { scammersSeedData } from "./scammers-seed-data";
69
70
  export { supportTicketsSeedData } from "./support-tickets-seed-data";
71
+ // Tester sandbox seed fixtures live in ../features/tester/seed-data (isolated from this
72
+ // folder on purpose) — re-exported here so every other seed consumer keeps one import surface.
73
+ export { testerChecklistSeedData, storesTesterSeedData, categoriesTesterSeedData, productsTesterSeedData, blogTesterSeedData, eventsTesterSeedData, } from "../features/tester/seed-data";
70
74
  export { productFeaturesSeedData } from "./product-features-seed-data";
71
75
  export { offersSeedData } from "./offers-seed-data";
72
76
  // S-STORE Extensions (Tier S-STORE) — 11 new collections
@@ -9,7 +9,7 @@
9
9
  * @tag layer:seed
10
10
  * @tag pattern:none
11
11
  * @tag access:server-only
12
- * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
12
+ * @tag consumers:seed/index.ts,seed/runner.ts
13
13
  * @tag sideEffects:none
14
14
  */
15
15
  const NOW = new Date();
@@ -1,15 +1,16 @@
1
1
  /**
2
2
  * Seed Manifest
3
3
  *
4
- * Lightweight index of every seeded document across all collections.
5
- * Imported by SeedPanel to render previews without loading full seed data.
4
+ * Lightweight index of every seeded document across all collections
5
+ * name/id pairs without loading the full seed data payload.
6
6
  * Auto-derived from the live seed data files — stays in sync automatically.
7
7
  */
8
- import type { SeedCollectionName } from "./actions/demo-seed-actions";
9
8
  export interface SeedManifestEntry {
10
9
  id: string;
11
10
  name: string;
12
11
  type?: string;
13
12
  }
13
+ /** Every collection name the CLI seeder (appkit/scripts/seed-cli.mjs) and this manifest cover. */
14
+ export type SeedCollectionName = "users" | "addresses" | "categories" | "stores" | "products" | "orders" | "reviews" | "bids" | "coupons" | "carousels" | "carouselSlides" | "homepageSections" | "siteSettings" | "faqs" | "notifications" | "payouts" | "blogPosts" | "events" | "eventEntries" | "sessions" | "carts" | "wishlists" | "history" | "conversations" | "groupedListings" | "scammerProfiles" | "supportTickets" | "productFeatures" | "offers" | "couponUsage" | "claimedCoupons" | "payoutMethods" | "shippingConfigs" | "analyticsCards" | "analyticsAlerts" | "storeCategories" | "listingTemplates" | "moderationQueue" | "reports" | "itemRequests" | "storeWhatsAppConfig" | "storeGoogleConfig" | "roleOverrides" | "customRoles" | "adminNotifications" | "lotteryEntries" | "shipments" | "shipmentLots" | "shipmentItems" | "catalogueItems" | "testerChecklistItems";
14
15
  export type SeedManifest = Record<SeedCollectionName, SeedManifestEntry[]>;
15
16
  export declare const SEED_MANIFEST: SeedManifest;
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Seed Manifest
3
3
  *
4
- * Lightweight index of every seeded document across all collections.
5
- * Imported by SeedPanel to render previews without loading full seed data.
4
+ * Lightweight index of every seeded document across all collections
5
+ * name/id pairs without loading the full seed data payload.
6
6
  * Auto-derived from the live seed data files — stays in sync automatically.
7
7
  */
8
8
  import { payoutMethodsSeedData, shippingConfigsSeedData, analyticsCardsSeedData, analyticsAlertsSeedData, storeCategoriesSeedData, listingTemplatesSeedData, moderationQueueSeedData, reportsSeedData, itemRequestsSeedData, storeWhatsAppConfigSeedData, storeGoogleConfigSeedData, } from "./store-extensions-seed-data";
@@ -50,6 +50,8 @@ import { productFeaturesSeedData } from "./product-features-seed-data";
50
50
  import { offersSeedData } from "./offers-seed-data";
51
51
  import { couponUsageSeedData } from "./coupon-usage-seed-data";
52
52
  import { claimedCouponsSeedData } from "./claimed-coupons-seed-data";
53
+ // Tester sandbox seed fixtures live in ../features/tester/seed-data (isolated on purpose).
54
+ import { testerChecklistSeedData, storesTesterSeedData, categoriesTesterSeedData, productsTesterSeedData, blogTesterSeedData, eventsTesterSeedData, } from "../features/tester/seed-data";
53
55
  function asArr(items) {
54
56
  return items ?? [];
55
57
  }
@@ -76,12 +78,12 @@ const LISTING_TYPE_TO_MANIFEST_TAG = {
76
78
  stickers: "stickers",
77
79
  };
78
80
  export const SEED_MANIFEST = {
79
- categories: pick(asArr(categoriesSeedData)),
81
+ categories: pick([...asArr(categoriesSeedData), ...asArr(categoriesTesterSeedData)]),
80
82
  users: pick(asArr(usersSeedData).map((u) => ({
81
83
  ...u,
82
84
  name: u.displayName ?? u.email ?? u.uid,
83
85
  }))),
84
- stores: pick(asArr(storesSeedData).map((s) => ({
86
+ stores: pick([...asArr(storesSeedData), ...asArr(storesTesterSeedData)].map((s) => ({
85
87
  ...s,
86
88
  name: s.storeName ?? s.id,
87
89
  }))),
@@ -95,6 +97,7 @@ export const SEED_MANIFEST = {
95
97
  ...asArr(productsLiveItemsSeedData),
96
98
  ...asArr(productsArtSeedData),
97
99
  ...asArr(productsStickersSeedData),
100
+ ...asArr(productsTesterSeedData),
98
101
  ].map((p) => ({
99
102
  ...p,
100
103
  type: p.listingType === "bundle"
@@ -134,11 +137,11 @@ export const SEED_MANIFEST = {
134
137
  shipmentLots: pick(asArr(shipmentLotsSeedData), "lotName"),
135
138
  shipmentItems: pick(asArr(shipmentItemsSeedData), "title"),
136
139
  catalogueItems: pick(asArr(catalogueSeedData), "title"),
137
- blogPosts: pick(asArr(blogPostsSeedData).map((p) => ({
140
+ blogPosts: pick([...asArr(blogPostsSeedData), ...asArr(blogTesterSeedData)].map((p) => ({
138
141
  ...p,
139
142
  name: p.title ?? p.id,
140
143
  }))),
141
- events: pick(asArr(eventsSeedData).map((e) => ({
144
+ events: pick([...asArr(eventsSeedData), ...asArr(eventsTesterSeedData)].map((e) => ({
142
145
  ...e,
143
146
  name: e.title ?? e.id,
144
147
  }))),
@@ -224,4 +227,8 @@ export const SEED_MANIFEST = {
224
227
  roleOverrides: [],
225
228
  customRoles: [],
226
229
  adminNotifications: [],
230
+ testerChecklistItems: pick(asArr(testerChecklistSeedData).map((c) => ({
231
+ ...c,
232
+ name: c.label ?? c.id,
233
+ }))),
227
234
  };