@mohasinac/appkit 3.6.4 → 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 +11 -15
  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 +10 -8
  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 +11 -10
  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
@@ -167,6 +167,9 @@ const {
167
167
  wishlistsSeedData, historySeedData, conversationsSeedData,
168
168
  groupedListingsSeedData,
169
169
  scammersSeedData, productFeaturesSeedData,
170
+ testerChecklistSeedData,
171
+ storesTesterSeedData, categoriesTesterSeedData, productsTesterSeedData,
172
+ blogTesterSeedData, eventsTesterSeedData,
170
173
  // collection constants
171
174
  USER_COLLECTION, ADDRESS_SUBCOLLECTION, STORE_ADDRESS_SUBCOLLECTION,
172
175
  BRANDS_COLLECTION, CATEGORIES_COLLECTION, STORE_COLLECTION,
@@ -178,6 +181,7 @@ const {
178
181
  CART_COLLECTION, CONVERSATIONS_COLLECTION,
179
182
  GROUPED_LISTINGS_COLLECTION, SCAMMER_COLLECTION,
180
183
  WISHLIST_COLLECTION, HISTORY_COLLECTION, PRODUCT_FEATURES_COLLECTION,
184
+ TESTER_CHECKLIST_ITEM_COLLECTION,
181
185
  // PII helpers
182
186
  encryptPiiFields, addPiiIndices,
183
187
  encryptPayoutDetails, encryptPayoutBankAccount, encryptShippingConfig,
@@ -222,6 +226,7 @@ const COLLECTION_MAP = {
222
226
  groupedListings: GROUPED_LISTINGS_COLLECTION,
223
227
  scammerProfiles: SCAMMER_COLLECTION,
224
228
  productFeatures: PRODUCT_FEATURES_COLLECTION,
229
+ testerChecklistItems: TESTER_CHECKLIST_ITEM_COLLECTION,
225
230
  };
226
231
 
227
232
  const SEED_DATA_MAP = {
@@ -229,9 +234,9 @@ const SEED_DATA_MAP = {
229
234
  addresses: addressesSeedData,
230
235
  storeAddresses: storeAddressesSeedData,
231
236
  brands: brandsSeedData,
232
- categories: categoriesSeedData,
233
- stores: storesSeedData,
234
- products: [...(productsStandardSeedData || []), ...(productsAuctionsSeedData || []), ...(productsPreordersSeedData || [])],
237
+ categories: [...(categoriesSeedData || []), ...(categoriesTesterSeedData || [])],
238
+ stores: [...(storesSeedData || []), ...(storesTesterSeedData || [])],
239
+ products: [...(productsStandardSeedData || []), ...(productsAuctionsSeedData || []), ...(productsPreordersSeedData || []), ...(productsTesterSeedData || [])],
235
240
  orders: ordersSeedData,
236
241
  reviews: reviewsSeedData,
237
242
  bids: bidsSeedData,
@@ -244,8 +249,8 @@ const SEED_DATA_MAP = {
244
249
  faqs: faqSeedData,
245
250
  notifications: notificationsSeedData,
246
251
  payouts: payoutsSeedData,
247
- blogPosts: blogPostsSeedData,
248
- events: eventsSeedData,
252
+ blogPosts: [...(blogPostsSeedData || []), ...(blogTesterSeedData || [])],
253
+ events: [...(eventsSeedData || []), ...(eventsTesterSeedData || [])],
249
254
  eventEntries: eventEntriesSeedData,
250
255
  sessions: sessionsSeedData,
251
256
  carts: cartsSeedData,
@@ -255,6 +260,7 @@ const SEED_DATA_MAP = {
255
260
  groupedListings: groupedListingsSeedData,
256
261
  scammerProfiles: scammersSeedData,
257
262
  productFeatures: productFeaturesSeedData,
263
+ testerChecklistItems: testerChecklistSeedData,
258
264
  };
259
265
 
260
266
  const ALL_COLLECTIONS = Object.keys(COLLECTION_MAP);
@@ -323,15 +329,15 @@ async function countExisting(colName) {
323
329
  if (seed.length === 0) return 0;
324
330
 
325
331
  if (colName === "addresses") {
326
- const refs = seed.filter((d) => d.userId && d.id).map((d) =>
327
- db.collection(USER_COLLECTION).doc(d.userId).collection(ADDRESS_SUBCOLLECTION).doc(d.id));
332
+ // SB-UNI-A: top-level `addresses` collection, not users/{uid}/addresses.
333
+ const refs = seed.filter((d) => d.id).map((d) => db.collection("addresses").doc(d.id));
328
334
  if (refs.length === 0) return 0;
329
335
  const snaps = await db.getAll(...refs);
330
336
  return snaps.filter((s) => s.exists).length;
331
337
  }
332
338
  if (colName === "storeAddresses") {
333
- const refs = seed.filter((d) => d.storeSlug && d.id).map((d) =>
334
- db.collection(STORE_COLLECTION).doc(d.storeSlug).collection(STORE_ADDRESS_SUBCOLLECTION).doc(d.id));
339
+ // Also lands in the top-level `addresses` collection (see loadStoreAddresses).
340
+ const refs = seed.filter((d) => d.id).map((d) => db.collection("addresses").doc(d.id));
335
341
  if (refs.length === 0) return 0;
336
342
  const snaps = await db.getAll(...refs);
337
343
  return snaps.filter((s) => s.exists).length;
@@ -360,15 +366,18 @@ async function countExisting(colName) {
360
366
  return snaps.filter((s) => s.exists).length;
361
367
  }
362
368
  if (colName === "faqs") {
369
+ // Mirrors loadGeneric: prefer the explicit id (every current faq record has
370
+ // one), only derive via generateFAQId for a record that genuinely lacks one.
363
371
  const refs = seed.map((faq) => {
364
- const id = generateFAQId({ category: faq.category, question: faq.question });
372
+ const id = faq.id ?? generateFAQId({ category: faq.category, question: faq.question });
365
373
  return db.collection(COLLECTION_MAP[colName]).doc(id);
366
374
  });
367
375
  if (refs.length === 0) return 0;
368
376
  const snaps = await db.getAll(...refs);
369
377
  return snaps.filter((s) => s.exists).length;
370
378
  }
371
- const refs = seed.filter((d) => d.id).map((d) => db.collection(COLLECTION_MAP[colName]).doc(d.id));
379
+ // Mirrors loadGeneric's docId = id ?? slug resolution.
380
+ const refs = seed.filter((d) => d.id ?? d.slug).map((d) => db.collection(COLLECTION_MAP[colName]).doc(d.id ?? d.slug));
372
381
  if (refs.length === 0) return 0;
373
382
  const snaps = await db.getAll(...refs);
374
383
  return snaps.filter((s) => s.exists).length;
@@ -430,7 +439,18 @@ async function loadUsers(seed, stats) {
430
439
  const authUserData = { displayName, emailVerified, disabled };
431
440
  if (email && typeof email === "string") authUserData.email = email;
432
441
  if (phoneNumber && typeof phoneNumber === "string") authUserData.phoneNumber = phoneNumber;
433
- if (photoURL && typeof photoURL === "string" && photoURL.trim() !== "") authUserData.photoURL = photoURL;
442
+ // Firebase Auth's photoURL field requires an absolute URL. Seed data's
443
+ // photoURL is wrapped by seedExtMedia() into a relative /media/ext?url=...
444
+ // app-proxy path — valid for Firestore + the app's own avatar rendering,
445
+ // but auth.createUser()/updateUser() reject it with "must be a valid URL"
446
+ // and abort the WHOLE user record (Auth + Firestore both skipped) before
447
+ // ever reaching the Firestore write below. The app never reads Auth's own
448
+ // photoURL copy anyway — it always resolves avatars via the Firestore
449
+ // users doc — so just skip setting it on the Auth record for relative
450
+ // paths instead of failing the entire seed row.
451
+ if (photoURL && typeof photoURL === "string" && /^https?:\/\//.test(photoURL)) {
452
+ authUserData.photoURL = photoURL;
453
+ }
434
454
 
435
455
  if (!userExists) {
436
456
  await resolveAuthConflicts(uid, authUserData);
@@ -496,9 +516,14 @@ async function loadGeneric(colName, seed, firestoreCollection, stats) {
496
516
  id = generateFAQId({ category: docData.category, question: docData.question });
497
517
  if (!id) { stats.errors++; continue; }
498
518
  } else if (!id) { stats.errors++; continue; }
499
- const slug = docData.slug;
500
- const docId = slug ?? id;
501
- if (!data.slug) data.slug = docId;
519
+ // `id` already carries the project's mandatory slug prefix (blog-, event-,
520
+ // faq-, etc. see CLAUDE.md's Slug Prefix System). Preferring the bare
521
+ // `slug` field here (as this used to) wrote every blogPosts/events doc
522
+ // under its unprefixed slug instead, e.g. "auction-feature-launch"
523
+ // instead of "blog-auction-feature-launch" — found 2026-08-17 auditing
524
+ // real Firestore doc IDs after a full reseed.
525
+ const docId = id ?? docData.slug;
526
+ if (!data.slug) data.slug = docData.slug ?? docId;
502
527
  items.push({
503
528
  ref: db.collection(firestoreCollection).doc(docId),
504
529
  data: encryptSeedPii(colName, stripUndefined(data)),
@@ -530,9 +555,38 @@ async function cmdLoad() {
530
555
  if (colName === "users") {
531
556
  await loadUsers(seed, stats);
532
557
  } else if (colName === "addresses") {
533
- await loadSubcollection(seed, USER_COLLECTION, "userId", ADDRESS_SUBCOLLECTION, "id", ADDRESS_PII_FIELDS, stats);
558
+ // SB-UNI-A (2026-05-13) unified addresses into one top-level collection
559
+ // with an ownerType/ownerId discriminator, replacing the two prior
560
+ // subcollections (users/{uid}/addresses, stores/{slug}/addresses) this
561
+ // loader used to write to. addressesSeedData already carries
562
+ // ownerType/ownerId directly — write it straight to the top-level
563
+ // collection instead of nesting under USER_COLLECTION's old subcollection.
564
+ for (const d of seed) {
565
+ try {
566
+ const { id, ownerType, ownerId, ...data } = d;
567
+ if (!id || !ownerType || !ownerId) { stats.errors++; continue; }
568
+ const payload = encryptPiiFields(stripUndefined({ ownerType, ownerId, ...data }), [...ADDRESS_PII_FIELDS]);
569
+ await db.collection("addresses").doc(id).set(payload, { merge: true });
570
+ stats.created++;
571
+ } catch (err) { console.error(` ✗ ${err.message}`); stats.errors++; }
572
+ }
534
573
  } else if (colName === "storeAddresses") {
535
- await loadSubcollection(seed, STORE_COLLECTION, "storeSlug", STORE_ADDRESS_SUBCOLLECTION, "id", ADDRESS_PII_FIELDS, stats);
574
+ // storeAddressesSeedData predates the SB-UNI-A unification and still
575
+ // carries the old storeSlug field instead of ownerType/ownerId — derive
576
+ // the unified shape at load time rather than writing to the deleted
577
+ // stores/{slug}/addresses subcollection.
578
+ for (const d of seed) {
579
+ try {
580
+ const { id, storeSlug, ...data } = d;
581
+ if (!id || !storeSlug) { stats.errors++; continue; }
582
+ const payload = encryptPiiFields(
583
+ stripUndefined({ ownerType: "store", ownerId: storeSlug, ...data }),
584
+ [...ADDRESS_PII_FIELDS],
585
+ );
586
+ await db.collection("addresses").doc(id).set(payload, { merge: true });
587
+ stats.created++;
588
+ } catch (err) { console.error(` ✗ ${err.message}`); stats.errors++; }
589
+ }
536
590
  } else if (colName === "couponUsage") {
537
591
  // shape: { userId, couponId, ... } — no PII
538
592
  for (const d of seed) {