@mohasinac/appkit 4.52.5 → 4.53.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 (630) hide show
  1. package/dist/.build-stamp.json +4 -4
  2. package/dist/_internal/client/features/sticker-trace/canvas-codec.d.ts +2 -0
  3. package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
  4. package/dist/_internal/server/features/auctions/actions.js +1 -1
  5. package/dist/_internal/server/features/categories/data.js +23 -7
  6. package/dist/_internal/server/features/checkout/actions.js +10 -3
  7. package/dist/_internal/server/features/checkout/data.d.ts +15 -0
  8. package/dist/_internal/server/features/checkout/data.js +20 -3
  9. package/dist/_internal/server/features/lottery/actions.js +9 -1
  10. package/dist/_internal/server/features/lottery/og.d.ts +40 -0
  11. package/dist/_internal/server/features/lottery/og.js +79 -0
  12. package/dist/_internal/server/features/messages/actions.js +4 -0
  13. package/dist/_internal/server/features/offers/adapters.js +17 -3
  14. package/dist/_internal/server/features/orders/actions.js +7 -2
  15. package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
  16. package/dist/_internal/server/features/raffle/actions.js +25 -0
  17. package/dist/_internal/server/features/reviews/actions.js +1 -1
  18. package/dist/_internal/server/features/reviews/data.d.ts +1 -1
  19. package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
  20. package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
  21. package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
  22. package/dist/_internal/server/features/search/index-build/build.js +285 -0
  23. package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
  24. package/dist/_internal/server/features/search/index-build/sources.js +385 -0
  25. package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
  26. package/dist/_internal/server/features/search/search-sources.js +142 -7
  27. package/dist/_internal/server/features/seo/robots.js +21 -1
  28. package/dist/_internal/server/features/seo/sitemap.js +1 -1
  29. package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
  30. package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
  31. package/dist/_internal/server/features/site-settings/adapters.js +26 -0
  32. package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
  33. package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
  34. package/dist/_internal/server/features/sticker-trace/adapters.d.ts +80 -0
  35. package/dist/_internal/server/features/sticker-trace/adapters.js +174 -0
  36. package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
  37. package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
  38. package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
  39. package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
  40. package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
  41. package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
  42. package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
  43. package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
  44. package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
  45. package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
  46. package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
  47. package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
  48. package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
  49. package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
  50. package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
  51. package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
  52. package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +141 -0
  53. package/dist/_internal/server/features/sticker-trace/sheet-actions.js +279 -0
  54. package/dist/_internal/server/features/sticker-trace/storage.d.ts +135 -0
  55. package/dist/_internal/server/features/sticker-trace/storage.js +282 -0
  56. package/dist/_internal/server/functions/scheduled.d.ts +2 -1
  57. package/dist/_internal/server/functions/scheduled.js +25 -1
  58. package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
  59. package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
  60. package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
  61. package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
  62. package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
  63. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
  64. package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
  65. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
  66. package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
  67. package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
  68. package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
  69. package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
  70. package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
  71. package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
  72. package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
  73. package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
  74. package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
  75. package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
  76. package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
  77. package/dist/_internal/server/jobs/core/promotions.js +7 -4
  78. package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
  79. package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
  80. package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
  81. package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
  82. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
  83. package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
  84. package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
  85. package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
  86. package/dist/_internal/server/jobs/handlers/index.js +1 -0
  87. package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
  88. package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
  89. package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
  90. package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
  91. package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
  92. package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
  93. package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
  94. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
  95. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
  96. package/dist/_internal/shared/actions/action-registry.js +29 -0
  97. package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
  98. package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
  99. package/dist/_internal/shared/features/events/config.d.ts +14 -0
  100. package/dist/_internal/shared/features/events/config.js +14 -0
  101. package/dist/_internal/shared/features/notifications/action-url.js +8 -0
  102. package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
  103. package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
  104. package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
  105. package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
  106. package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
  107. package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
  108. package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
  109. package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
  110. package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
  111. package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
  112. package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
  113. package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
  114. package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
  115. package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
  116. package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
  117. package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
  118. package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
  119. package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
  120. package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
  121. package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
  122. package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
  123. package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
  124. package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
  125. package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
  126. package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
  127. package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
  128. package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
  129. package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
  130. package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
  131. package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
  132. package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
  133. package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
  134. package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
  135. package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
  136. package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
  137. package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
  138. package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
  139. package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
  140. package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
  141. package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
  142. package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
  143. package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
  144. package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
  145. package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
  146. package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
  147. package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
  148. package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
  149. package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
  150. package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
  151. package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
  152. package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
  153. package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
  154. package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
  155. package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
  156. package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
  157. package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
  158. package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
  159. package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
  160. package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
  161. package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
  162. package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
  163. package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
  164. package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
  165. package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
  166. package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
  167. package/dist/_internal/shared/listing-types/_registry.d.ts +11 -0
  168. package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
  169. package/dist/_internal/shared/listing-types/art/config.js +1 -0
  170. package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
  171. package/dist/_internal/shared/listing-types/auction/config.js +1 -0
  172. package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
  173. package/dist/_internal/shared/listing-types/classified/config.js +1 -0
  174. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
  175. package/dist/_internal/shared/listing-types/digital-code/config.js +1 -0
  176. package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
  177. package/dist/_internal/shared/listing-types/feature-flags.js +9 -0
  178. package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
  179. package/dist/_internal/shared/listing-types/live/config.js +1 -0
  180. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
  181. package/dist/_internal/shared/listing-types/pre-order/config.js +1 -0
  182. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
  183. package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -0
  184. package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
  185. package/dist/_internal/shared/listing-types/standard/config.js +1 -0
  186. package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -0
  187. package/dist/_internal/shared/listing-types/stickers/config.js +1 -0
  188. package/dist/_internal/shared/media/limits.d.ts +12 -2
  189. package/dist/_internal/shared/media/limits.js +12 -2
  190. package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
  191. package/dist/_internal/shared/search/artifact-url.js +119 -0
  192. package/dist/_internal/shared/search/index-record.d.ts +68 -0
  193. package/dist/_internal/shared/search/index-record.js +96 -0
  194. package/dist/_internal/shared/search/match.d.ts +65 -0
  195. package/dist/_internal/shared/search/match.js +263 -0
  196. package/dist/client.d.ts +8 -7
  197. package/dist/client.js +12 -5
  198. package/dist/configs/eslint.js +22 -2
  199. package/dist/constants/api-endpoints.d.ts +68 -0
  200. package/dist/constants/api-endpoints.js +32 -0
  201. package/dist/constants/field-names.d.ts +7 -1
  202. package/dist/constants/field-names.js +36 -1
  203. package/dist/contracts/repository.d.ts +8 -7
  204. package/dist/contracts/search.d.ts +2 -2
  205. package/dist/contracts/table.d.ts +3 -3
  206. package/dist/contracts/table.js +3 -3
  207. package/dist/core/contact-submissions.repository.js +2 -2
  208. package/dist/core/integration-keys.js +7 -1
  209. package/dist/core/newsletter.repository.js +2 -2
  210. package/dist/core/site-config.js +1 -1
  211. package/dist/errors/error-codes.d.ts +30 -0
  212. package/dist/errors/error-codes.js +30 -0
  213. package/dist/errors/error-display-map.js +40 -1
  214. package/dist/features/account/api/[userId]/addresses/route.js +1 -1
  215. package/dist/features/account/components/UserBidsView.js +1 -1
  216. package/dist/features/account/components/index.d.ts +0 -8
  217. package/dist/features/account/components/index.js +0 -4
  218. package/dist/features/addresses/repository/addresses.repository.d.ts +17 -6
  219. package/dist/features/addresses/repository/addresses.repository.js +65 -9
  220. package/dist/features/addresses/schemas/firestore.d.ts +17 -6
  221. package/dist/features/admin/actions/notification-actions.js +15 -6
  222. package/dist/features/admin/api/bids/route.js +1 -1
  223. package/dist/features/admin/api/coupons/route.js +1 -1
  224. package/dist/features/admin/api/products/route.js +1 -1
  225. package/dist/features/admin/api/reviews/route.js +1 -1
  226. package/dist/features/admin/components/AdminAdEditorView.js +19 -5
  227. package/dist/features/admin/components/AdminAuditLogView.js +1 -1
  228. package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
  229. package/dist/features/admin/components/AdminBlogView.js +1 -1
  230. package/dist/features/admin/components/AdminBrandsView.js +17 -1
  231. package/dist/features/admin/components/AdminCategoryEditorView.js +0 -1
  232. package/dist/features/admin/components/AdminContactView.js +1 -1
  233. package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
  234. package/dist/features/admin/components/AdminNewsletterView.js +1 -1
  235. package/dist/features/admin/components/AdminOrdersView.js +9 -2
  236. package/dist/features/admin/components/AdminPayoutsView.js +1 -1
  237. package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
  238. package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
  239. package/dist/features/admin/components/AdminProductEditorView.js +24 -37
  240. package/dist/features/admin/components/AdminProductsView.js +10 -3
  241. package/dist/features/admin/components/AdminScammersView.js +1 -1
  242. package/dist/features/admin/components/AdminSectionsView.js +21 -5
  243. package/dist/features/admin/components/AdminSessionsView.js +1 -1
  244. package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
  245. package/dist/features/admin/components/AdminTeamView.js +1 -1
  246. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
  247. package/dist/features/admin/components/AdminUsersView.js +1 -1
  248. package/dist/features/admin/components/DataListingView.d.ts +2 -1
  249. package/dist/features/admin/components/DataListingView.js +9 -4
  250. package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
  251. package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
  252. package/dist/features/admin/repository/site-settings.repository.js +8 -3
  253. package/dist/features/admin/schemas/firestore.d.ts +62 -1
  254. package/dist/features/admin/schemas/firestore.js +32 -0
  255. package/dist/features/admin/types/index.d.ts +1 -1
  256. package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
  257. package/dist/features/auctions/actions/bid-actions.js +16 -4
  258. package/dist/features/auctions/api/route.js +1 -1
  259. package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
  260. package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
  261. package/dist/features/auctions/repository/bid.repository.js +114 -13
  262. package/dist/features/auctions/schemas/firestore.d.ts +24 -4
  263. package/dist/features/auctions/schemas/firestore.js +1 -0
  264. package/dist/features/auth/actions/profile-actions.js +30 -4
  265. package/dist/features/auth/components/index.d.ts +0 -1
  266. package/dist/features/auth/components/index.js +0 -1
  267. package/dist/features/auth/repository/session.repository.d.ts +17 -3
  268. package/dist/features/auth/repository/session.repository.js +46 -5
  269. package/dist/features/auth/repository/token.repository.d.ts +27 -4
  270. package/dist/features/auth/repository/token.repository.js +65 -11
  271. package/dist/features/auth/repository/user.repository.d.ts +33 -7
  272. package/dist/features/auth/repository/user.repository.js +100 -15
  273. package/dist/features/auth/schemas/firestore.d.ts +63 -12
  274. package/dist/features/auth/schemas/firestore.js +11 -0
  275. package/dist/features/before-after/api/route.js +1 -1
  276. package/dist/features/blog/components/BlogListView.js +16 -3
  277. package/dist/features/blog/components/BlogPostView.js +1 -1
  278. package/dist/features/blog/schemas/index.d.ts +2 -2
  279. package/dist/features/cart/api/route.js +1 -1
  280. package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
  281. package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
  282. package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
  283. package/dist/features/categories/api/route.js +10 -10
  284. package/dist/features/categories/components/CategoryDetailPageView.js +35 -5
  285. package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
  286. package/dist/features/categories/components/index.d.ts +0 -2
  287. package/dist/features/categories/components/index.js +0 -1
  288. package/dist/features/categories/repository/categories.repository.d.ts +1 -0
  289. package/dist/features/categories/repository/categories.repository.js +31 -1
  290. package/dist/features/categories/schemas/index.d.ts +2 -2
  291. package/dist/features/categories/utils/taxonomy-visual.d.ts +21 -0
  292. package/dist/features/categories/utils/taxonomy-visual.js +58 -0
  293. package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
  294. package/dist/features/collections/api/[slug]/route.js +3 -3
  295. package/dist/features/collections/api/route.js +1 -1
  296. package/dist/features/consultation/api/route.js +1 -1
  297. package/dist/features/consultation/repository/consultations.repository.js +1 -1
  298. package/dist/features/consultation/types/index.d.ts +1 -1
  299. package/dist/features/contact/components/ContactForm.js +1 -3
  300. package/dist/features/corporate/api/route.js +1 -1
  301. package/dist/features/corporate/repository/corporate.repository.js +1 -1
  302. package/dist/features/corporate/types/index.d.ts +1 -1
  303. package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
  304. package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
  305. package/dist/features/events/actions/event-actions.d.ts +14 -0
  306. package/dist/features/events/actions/event-actions.js +82 -3
  307. package/dist/features/events/api/[id]/route.js +2 -2
  308. package/dist/features/events/components/AdminEventEditorView.js +22 -3
  309. package/dist/features/events/components/AdminEventsView.js +32 -8
  310. package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
  311. package/dist/features/events/components/EventRafflesSection.js +52 -3
  312. package/dist/features/events/components/SpinWheelView.d.ts +2 -2
  313. package/dist/features/events/components/SpinWheelView.js +41 -4
  314. package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
  315. package/dist/features/events/repository/event-entry.repository.js +41 -7
  316. package/dist/features/events/schemas/firestore.d.ts +17 -4
  317. package/dist/features/events/types/index.d.ts +37 -0
  318. package/dist/features/faq/repository/faqs.repository.js +1 -1
  319. package/dist/features/faq/schemas/index.d.ts +5 -2
  320. package/dist/features/faq/schemas/index.js +6 -0
  321. package/dist/features/faq/types/index.d.ts +0 -1
  322. package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
  323. package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
  324. package/dist/features/homepage/api/carousel/route.js +4 -4
  325. package/dist/features/homepage/api/route.js +2 -2
  326. package/dist/features/homepage/api/sections/route.js +1 -1
  327. package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
  328. package/dist/features/homepage/components/AnnouncementBar.js +13 -19
  329. package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
  330. package/dist/features/homepage/components/index.d.ts +0 -2
  331. package/dist/features/homepage/components/index.js +0 -1
  332. package/dist/features/homepage/repository/homepage.repository.js +1 -1
  333. package/dist/features/homepage/schemas/firestore.d.ts +6 -0
  334. package/dist/features/homepage/schemas/index.d.ts +10 -10
  335. package/dist/features/layout/AppLayoutShell.d.ts +11 -0
  336. package/dist/features/layout/AppLayoutShell.js +64 -12
  337. package/dist/features/layout/BottomActionsContext.d.ts +16 -0
  338. package/dist/features/layout/BottomActionsContext.js +5 -0
  339. package/dist/features/layout/BottomChrome.js +48 -9
  340. package/dist/features/layout/BottomNavbar.d.ts +14 -0
  341. package/dist/features/layout/BottomNavbar.js +43 -3
  342. package/dist/features/layout/MainNavbar.d.ts +11 -0
  343. package/dist/features/layout/NavbarLayout.d.ts +3 -0
  344. package/dist/features/layout/NavbarLayout.js +88 -11
  345. package/dist/features/layout/SideActionDock.d.ts +1 -0
  346. package/dist/features/layout/SideActionDock.js +219 -0
  347. package/dist/features/layout/TitleBarLayout.js +1 -1
  348. package/dist/features/layout/cta-anchor.d.ts +31 -0
  349. package/dist/features/layout/cta-anchor.js +31 -0
  350. package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
  351. package/dist/features/layout/hooks/useBottomActions.js +6 -1
  352. package/dist/features/layout/index.d.ts +9 -1
  353. package/dist/features/layout/index.js +9 -1
  354. package/dist/features/layout/useCtaReveal.d.ts +24 -0
  355. package/dist/features/layout/useCtaReveal.js +82 -0
  356. package/dist/features/layout/useHoldToOpen.d.ts +41 -0
  357. package/dist/features/layout/useHoldToOpen.js +84 -0
  358. package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
  359. package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
  360. package/dist/features/lottery/schemas/firestore.d.ts +33 -5
  361. package/dist/features/loyalty/api/balance/route.js +1 -1
  362. package/dist/features/loyalty/api/history/route.js +1 -1
  363. package/dist/features/media/MediaImage.js +0 -1
  364. package/dist/features/media/MediaPickerModal.js +7 -1
  365. package/dist/features/media/modals/ImageEditor.js +5 -1
  366. package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
  367. package/dist/features/media/repository/media-assets.repository.d.ts +19 -0
  368. package/dist/features/media/upload/CameraCapture.js +16 -1
  369. package/dist/features/media/upload/ImageUpload.js +42 -4
  370. package/dist/features/media/upload/MediaUploadField.js +69 -13
  371. package/dist/features/media/upload/downscale-image.d.ts +56 -0
  372. package/dist/features/media/upload/downscale-image.js +150 -0
  373. package/dist/features/messages/components/ConversationThreadView.js +45 -2
  374. package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
  375. package/dist/features/messages/components/MessageSellerButton.js +10 -2
  376. package/dist/features/messages/schemas/firestore.d.ts +15 -0
  377. package/dist/features/orders/hooks/useOrders.js +4 -2
  378. package/dist/features/orders/repository/orders.repository.d.ts +15 -4
  379. package/dist/features/orders/repository/orders.repository.js +52 -20
  380. package/dist/features/orders/schemas/firestore.d.ts +15 -4
  381. package/dist/features/orders/schemas/index.d.ts +8 -8
  382. package/dist/features/orders/types/index.d.ts +2 -2
  383. package/dist/features/payments/repository/payments.repository.js +2 -2
  384. package/dist/features/payments/repository/payout.repository.d.ts +23 -6
  385. package/dist/features/payments/repository/payout.repository.js +63 -23
  386. package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
  387. package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
  388. package/dist/features/payments/schemas/firestore.d.ts +14 -3
  389. package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
  390. package/dist/features/pre-orders/api/[slug]/route.js +1 -1
  391. package/dist/features/pre-orders/api/admin/route.js +1 -1
  392. package/dist/features/pre-orders/api/route.js +1 -1
  393. package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
  394. package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
  395. package/dist/features/products/api/[id]/route.js +1 -1
  396. package/dist/features/products/components/ListingBottomActions.js +4 -0
  397. package/dist/features/products/components/ProductDetailPageView.js +2 -1
  398. package/dist/features/products/components/ProductGalleryClient.js +2 -2
  399. package/dist/features/products/components/ProductGrid.js +12 -1
  400. package/dist/features/products/components/index.d.ts +0 -2
  401. package/dist/features/products/components/index.js +0 -1
  402. package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
  403. package/dist/features/products/config/listing-type-listing-config.js +27 -2
  404. package/dist/features/products/constants/listing-tabs.d.ts +9 -0
  405. package/dist/features/products/constants/listing-tabs.js +3 -2
  406. package/dist/features/products/hooks/useProducts.js +2 -2
  407. package/dist/features/products/repository/products.repository.js +13 -1
  408. package/dist/features/products/schemas/index.d.ts +2 -2
  409. package/dist/features/products/types/index.d.ts +1 -1
  410. package/dist/features/promotions/api/route.js +1 -1
  411. package/dist/features/reviews/actions/review-actions.d.ts +6 -6
  412. package/dist/features/reviews/actions/review-actions.js +22 -8
  413. package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
  414. package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
  415. package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
  416. package/dist/features/reviews/repository/reviews.repository.js +63 -12
  417. package/dist/features/reviews/schemas/firestore.d.ts +13 -2
  418. package/dist/features/reviews/schemas/index.d.ts +2 -2
  419. package/dist/features/scams/actions/scam-actions.js +16 -4
  420. package/dist/features/search/components/SearchResultsPageView.js +2 -1
  421. package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
  422. package/dist/features/search/hooks/useSearchIndex.js +172 -0
  423. package/dist/features/search/repository/search.repository.js +2 -2
  424. package/dist/features/seller/actions/offer-actions.d.ts +5 -5
  425. package/dist/features/seller/actions/offer-actions.js +38 -8
  426. package/dist/features/seller/actions/seller-actions.js +34 -7
  427. package/dist/features/seller/api/coupons/route.js +1 -1
  428. package/dist/features/seller/api/products/route.js +1 -1
  429. package/dist/features/seller/api/store/route.js +1 -1
  430. package/dist/features/seller/components/SellerBidsView.js +1 -1
  431. package/dist/features/seller/components/SellerCouponsView.js +1 -1
  432. package/dist/features/seller/components/SellerListingTypeView.js +9 -1
  433. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  434. package/dist/features/seller/components/SellerPayoutSettingsView.js +0 -1
  435. package/dist/features/seller/components/SellerPayoutsView.js +1 -1
  436. package/dist/features/seller/components/SellerProductShell.js +0 -1
  437. package/dist/features/seller/components/SellerProductsView.js +1 -1
  438. package/dist/features/seller/components/SellerShippingView.js +0 -1
  439. package/dist/features/seller/components/SellerStorefrontView.js +0 -1
  440. package/dist/features/seller/components/index.d.ts +0 -4
  441. package/dist/features/seller/components/index.js +0 -2
  442. package/dist/features/seller/repository/offer.repository.d.ts +15 -3
  443. package/dist/features/seller/repository/offer.repository.js +43 -7
  444. package/dist/features/seller/schemas/firestore.d.ts +14 -3
  445. package/dist/features/seller/schemas/index.d.ts +4 -4
  446. package/dist/features/seller/schemas/order-forms.d.ts +39 -0
  447. package/dist/features/seller/schemas/order-forms.js +37 -0
  448. package/dist/features/shell/FormShell.js +6 -2
  449. package/dist/features/shell/QuickFormDrawer.js +15 -1
  450. package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
  451. package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
  452. package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
  453. package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
  454. package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
  455. package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
  456. package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
  457. package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
  458. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
  459. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
  460. package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
  461. package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
  462. package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
  463. package/dist/features/sticker-trace/constants/help-content.js +172 -0
  464. package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
  465. package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
  466. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
  467. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
  468. package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
  469. package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
  470. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
  471. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
  472. package/dist/features/sticker-trace/schemas/firestore.d.ts +248 -0
  473. package/dist/features/sticker-trace/schemas/firestore.js +79 -0
  474. package/dist/features/sticker-trace/server.d.ts +8 -0
  475. package/dist/features/sticker-trace/server.js +51 -0
  476. package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
  477. package/dist/features/stores/actions/store-query-actions.js +7 -2
  478. package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
  479. package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
  480. package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
  481. package/dist/features/stores/api/[storeSlug]/route.js +1 -1
  482. package/dist/features/stores/components/StoreNavTabs.js +17 -2
  483. package/dist/features/stores/manifest.js +8 -4
  484. package/dist/features/support/repository/support.repository.d.ts +14 -3
  485. package/dist/features/support/repository/support.repository.js +93 -13
  486. package/dist/features/support/schemas/firestore.d.ts +16 -5
  487. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
  488. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
  489. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +2 -0
  490. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +243 -0
  491. package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
  492. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
  493. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
  494. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
  495. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
  496. package/dist/features/tester/seed-data/authored/index.js +8 -0
  497. package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
  498. package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
  499. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
  500. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +283 -0
  501. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +192 -22
  502. package/dist/index.d.ts +10 -23
  503. package/dist/index.js +27 -19
  504. package/dist/next/api/routeHandler.js +9 -0
  505. package/dist/next/routing/require-record.d.ts +13 -0
  506. package/dist/next/routing/require-record.js +62 -0
  507. package/dist/next/routing/route-map.d.ts +4 -4
  508. package/dist/next/routing/route-map.js +25 -3
  509. package/dist/providers/db-firebase/base.d.ts +4 -2
  510. package/dist/providers/db-firebase/base.js +21 -5
  511. package/dist/providers/db-firebase/base.repository.d.ts +11 -9
  512. package/dist/providers/db-firebase/base.repository.js +19 -0
  513. package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
  514. package/dist/providers/db-firebase/rtdb-paths.js +12 -0
  515. package/dist/react/ErrorBoundary.js +6 -1
  516. package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
  517. package/dist/react/hooks/realtime-event-constants.js +8 -0
  518. package/dist/react/hooks/useEntityDelete.js +5 -1
  519. package/dist/react/hooks/useMessage.js +5 -1
  520. package/dist/repositories/index.d.ts +2 -2
  521. package/dist/repositories/index.js +6 -1
  522. package/dist/schemas/registry.d.ts +13 -20
  523. package/dist/schemas/registry.js +31 -14
  524. package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
  525. package/dist/security/encrypted.d.ts +117 -0
  526. package/dist/security/encrypted.js +100 -0
  527. package/dist/security/index.d.ts +5 -2
  528. package/dist/security/index.js +16 -2
  529. package/dist/security/pii-accessors.d.ts +71 -0
  530. package/dist/security/pii-accessors.js +150 -0
  531. package/dist/security/pii-encrypt.d.ts +0 -8
  532. package/dist/security/pii-encrypt.js +22 -15
  533. package/dist/security/pii-mask.d.ts +18 -0
  534. package/dist/security/pii-mask.js +27 -0
  535. package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
  536. package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
  537. package/dist/seed/addresses-seed-data.d.ts +2 -2
  538. package/dist/seed/authenticity-knowledge-seed-data.d.ts +34 -0
  539. package/dist/seed/authenticity-knowledge-seed-data.js +1277 -0
  540. package/dist/seed/bids-seed-data.d.ts +2 -2
  541. package/dist/seed/bids-seed-data.js +23 -2
  542. package/dist/seed/events-seed-data.d.ts +2 -2
  543. package/dist/seed/events-seed-data.js +5 -0
  544. package/dist/seed/faq-seed-data.js +175 -5
  545. package/dist/seed/homepage-sections-seed-data.js +39 -23
  546. package/dist/seed/index.d.ts +1 -0
  547. package/dist/seed/index.js +1 -0
  548. package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
  549. package/dist/seed/offers-seed-data.d.ts +2 -2
  550. package/dist/seed/offers-seed-data.js +1 -1
  551. package/dist/seed/orders-seed-data.d.ts +2 -2
  552. package/dist/seed/payouts-seed-data.d.ts +2 -2
  553. package/dist/seed/payouts-seed-data.js +1 -1
  554. package/dist/seed/reviews-seed-data.d.ts +1 -2
  555. package/dist/seed/seed-purpose.js +7 -0
  556. package/dist/seed/sessions-seed-data.d.ts +2 -2
  557. package/dist/seed/sessions-seed-data.js +5 -0
  558. package/dist/seed/site-settings-seed-data.js +1 -1
  559. package/dist/seed/support-tickets-seed-data.d.ts +2 -2
  560. package/dist/seed/support-tickets-seed-data.js +1 -1
  561. package/dist/seed/users-seed-data.d.ts +2 -2
  562. package/dist/seed/users-seed-data.js +1 -1
  563. package/dist/seo/json-ld.js +5 -1
  564. package/dist/server.d.ts +18 -3
  565. package/dist/server.js +59 -3
  566. package/dist/styles.css +237 -1
  567. package/dist/tailwind-utilities.css +1 -1
  568. package/dist/ui/components/Button.js +7 -1
  569. package/dist/ui/components/FilterChipGroup.d.ts +11 -0
  570. package/dist/ui/components/FilterChipGroup.js +1 -1
  571. package/dist/ui/components/ImageGallery.js +6 -1
  572. package/dist/ui/components/ListingLayout.js +14 -8
  573. package/dist/ui/components/OverflowRow.d.ts +92 -0
  574. package/dist/ui/components/OverflowRow.js +203 -0
  575. package/dist/ui/components/OverflowRow.style.css +235 -0
  576. package/dist/ui/components/RecordDetailModal.js +14 -1
  577. package/dist/ui/components/RowActionMenu.js +5 -1
  578. package/dist/ui/components/SideDrawer.js +5 -1
  579. package/dist/ui/components/SideModal.js +9 -1
  580. package/dist/ui/components/TabBarShell.d.ts +12 -1
  581. package/dist/ui/components/TabBarShell.js +3 -2
  582. package/dist/ui/components/Tabs.js +36 -24
  583. package/dist/ui/components/Toast.d.ts +3 -24
  584. package/dist/ui/components/Toast.js +2 -19
  585. package/dist/ui/components/TopBannerPortal.d.ts +15 -0
  586. package/dist/ui/components/TopBannerPortal.js +19 -0
  587. package/dist/ui/components/UnsavedChangesModal.js +5 -1
  588. package/dist/ui/components/index.style.css +1 -0
  589. package/dist/ui/components/row-collapse.d.ts +15 -0
  590. package/dist/ui/components/row-collapse.js +127 -0
  591. package/dist/ui/components/toast-context.d.ts +63 -0
  592. package/dist/ui/components/toast-context.js +48 -0
  593. package/dist/ui/components/top-banner-slot.d.ts +37 -0
  594. package/dist/ui/components/top-banner-slot.js +45 -0
  595. package/dist/ui/icons/icon-registry.d.ts +6 -0
  596. package/dist/ui/icons/icon-registry.js +17 -1
  597. package/dist/ui/index.d.ts +2 -0
  598. package/dist/ui/index.js +1 -0
  599. package/dist/utils/array.helper.d.ts +2 -2
  600. package/dist/utils/array.helper.js +5 -5
  601. package/dist/utils/id-generators.d.ts +6 -0
  602. package/dist/utils/id-generators.js +10 -0
  603. package/dist/utils/media-url.js +0 -2
  604. package/dist/utils/search-txt-builders.d.ts +28 -4
  605. package/dist/utils/search-txt-builders.js +41 -1
  606. package/dist/validation/schemas.d.ts +8 -8
  607. package/package.json +6 -2
  608. package/scripts/seed-cli.mjs +3 -0
  609. package/dist/features/account/components/UserAddressesView.d.ts +0 -13
  610. package/dist/features/account/components/UserAddressesView.js +0 -5
  611. package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
  612. package/dist/features/account/components/UserNotificationsView.js +0 -12
  613. package/dist/features/account/components/UserSettingsView.d.ts +0 -16
  614. package/dist/features/account/components/UserSettingsView.js +0 -13
  615. package/dist/features/account/components/UserSupportView.d.ts +0 -3
  616. package/dist/features/account/components/UserSupportView.js +0 -166
  617. package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
  618. package/dist/features/admin/components/DemoSeedView.js +0 -5
  619. package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
  620. package/dist/features/auth/components/AuthStatusPanel.js +0 -22
  621. package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
  622. package/dist/features/categories/components/CategoryProductsView.js +0 -21
  623. package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
  624. package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
  625. package/dist/features/layout/BottomActions.d.ts +0 -1
  626. package/dist/features/layout/BottomActions.js +0 -311
  627. package/dist/features/products/components/ProductsView.d.ts +0 -6
  628. package/dist/features/products/components/ProductsView.js +0 -5
  629. package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
  630. package/dist/features/seller/components/SellerStoreView.js +0 -8
@@ -1,4 +1,3 @@
1
- import { decryptPiiFields } from "../../../security/pii-encrypt.js";
2
1
  /**
3
2
  * Personal Catalogue Repository (Feature B).
4
3
  */
@@ -7,19 +6,38 @@ import { CATALOGUE_COLLECTION, CATALOGUE_FIELDS, CATALOGUE_TRACKED_FIELDS, CATAL
7
6
  import { withHistory } from "../../../_internal/shared/history/index.js";
8
7
  export class CatalogueRepository extends BaseRepository {
9
8
  /** Decrypt on read so callers see the shape they wrote. */
10
- mapDoc(snap) {
11
- const raw = super.mapDoc(snap);
12
- return decryptPiiFields(raw, [...this.piiFields]);
13
- }
9
+ /*
10
+ * 🛑 `mapDoc` is NOT overridden — it used to call `decryptPiiFields`, and
11
+ * that call had ALWAYS BEEN A NO-OP.
12
+ *
13
+ * Measured 2026-10-17: `CatalogueItemDocument` declares `ownerId` and
14
+ * `ownerRole` and NO owner name or email. `CatalogueItemCreateInput` is
15
+ * `Omit<CatalogueItemDocument, …>`, so `ownerEmail` cannot arrive through
16
+ * the create path either — the `piiFields` override below encrypts a field
17
+ * that is never present, and the decrypt undid nothing.
18
+ *
19
+ * So this repository gets NO `reveal*`/`masked*` accessors: there is no PII
20
+ * on the document to reveal or to mask, and adding a pair for fields that do
21
+ * not exist would be the same fiction one level up — a named method whose
22
+ * name is the only evidence it does anything (Root Cause #92).
23
+ *
24
+ * `CATALOGUE_HISTORY_PII_FIELDS` is a different and legitimate thing: it is
25
+ * the scrub list passed to `withHistory` below, and a history entry listing
26
+ * PII keys it does not currently carry is DEFENSIVE by design — § "Status
27
+ * History" requires every adopter to pass the list explicitly so the next
28
+ * field added has to be triaged rather than defaulting in silently.
29
+ */
14
30
  constructor() {
15
31
  super(CATALOGUE_COLLECTION);
16
32
  /**
17
- * `ownerEmail` only — NOT `ownerName`.
33
+ * 🛑 DEAD as written: `CatalogueItemDocument` has no `ownerEmail`.
18
34
  *
19
- * Per decision D1 names stay partial-match searchable, and catalogue items are
20
- * searchable by owner in the admin approvals queue. `CATALOGUE_HISTORY_PII_FIELDS`
21
- * lists both, but that constant scrubs status *history*, which has no search
22
- * requirement — the two lists are intentionally different.
35
+ * Kept rather than deleted because it is the declaration that would start
36
+ * working the moment an owner email is added to the document, and deleting
37
+ * it would hand that future field plaintext storage by default. The reasoning
38
+ * it used to carry — "`ownerEmail` only, NOT `ownerName`, because D1 keeps
39
+ * names searchable" — described a choice between two fields that neither
40
+ * exist nor can arrive through `CatalogueItemCreateInput`.
23
41
  */
24
42
  this.piiFields = ["ownerEmail"];
25
43
  }
@@ -10,10 +10,21 @@ import { type GenerateCatalogueItemIdInput } from "../../../utils/id-generators"
10
10
  import type { StatusChangeEntry } from "../../../_internal/shared/history/types";
11
11
  import type { BaseDocument } from "../../../_internal/shared/types/base-document";
12
12
  import type { ProductDraftFields } from "../../shipments/schemas/firestore";
13
+ import type { Plaintext } from "../../../security/encrypted";
13
14
  export declare const CATALOGUE_COLLECTION: "catalogueItems";
14
15
  export type CatalogueVisibility = "public" | "private";
15
16
  export type CatalogueOwnerRole = "user" | "seller" | "admin";
16
17
  export type CatalogueListingStatus = "not_listed" | "pending_admin_approval" | "listed" | "rejected";
18
+ /**
19
+ * `CatalogueItemDocument` with its PII as plain `string` — what the named repository
20
+ * accessors return, and what a WRITE path accepts (the repository encrypts).
21
+ *
22
+ * `Plaintext<T>` is the one definition of this shape; see `security/encrypted.ts`.
23
+ * It is deliberately NOT distinguishable from a MASKED value — `maskPii`
24
+ * returns plain strings too, and no type can express "these characters are
25
+ * asterisks". The distinction is which named method you called.
26
+ */
27
+ export type CatalogueItemPlain = Plaintext<CatalogueItemDocument>;
17
28
  export interface CatalogueItemDocument extends BaseDocument, Partial<Omit<ProductDraftFields, "title" | "images" | "mainImage">> {
18
29
  ownerId: string;
19
30
  ownerRole: CatalogueOwnerRole;
@@ -184,7 +184,7 @@ export async function GET(request) {
184
184
  if (slug) {
185
185
  const result = await repo.findAll({
186
186
  filters: `slug==${slug}`,
187
- perPage: 1,
187
+ pageSize: 1,
188
188
  });
189
189
  const category = result.data[0] ?? null;
190
190
  if (!category) {
@@ -223,7 +223,7 @@ export async function GET(request) {
223
223
  tier !== null ||
224
224
  type !== null;
225
225
  if (isFiltered) {
226
- const perPage = pageSizeParam !== null && pageSizeParam > 0 ? pageSizeParam : 200;
226
+ const pageSize = pageSizeParam !== null && pageSizeParam > 0 ? pageSizeParam : 200;
227
227
  const page = pageParam ?? 1;
228
228
  /*
229
229
  * 🛑 `listingOnly` and `q` both force an in-memory window, and `total`
@@ -255,7 +255,7 @@ export async function GET(request) {
255
255
  const res = isPaged
256
256
  ? NextResponse.json({
257
257
  success: true,
258
- data: { items: [], total: 0, page, perPage, totalPages: 0, hasMore: false },
258
+ data: { items: [], total: 0, page, pageSize, totalPages: 0, hasMore: false },
259
259
  })
260
260
  : NextResponse.json({ success: true, data: [] });
261
261
  res.headers.set("Cache-Control", CACHE_CONTROL_PUBLIC);
@@ -264,7 +264,7 @@ export async function GET(request) {
264
264
  const terms = plan.head ? [plan.head, ...plan.rest] : [];
265
265
  const needsWindow = listingOnly || terms.length > 0;
266
266
  const windowed = needsWindow
267
- ? await repo.findAll({ filters, sort: "order", order: "asc", perPage: 500 })
267
+ ? await repo.findAll({ filters, sort: "order", order: "asc", pageSize: 500 })
268
268
  : null;
269
269
  let items;
270
270
  let total;
@@ -274,8 +274,8 @@ export async function GET(request) {
274
274
  .filter((d) => (terms.length ? matchesAllSearchTerms(d.searchTxt, terms) : true))
275
275
  .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
276
276
  total = kept.length;
277
- const offset = (page - 1) * perPage;
278
- items = (isPaged ? kept.slice(offset, offset + perPage) : kept).map(toCategoryListItem);
277
+ const offset = (page - 1) * pageSize;
278
+ items = (isPaged ? kept.slice(offset, offset + pageSize) : kept).map(toCategoryListItem);
279
279
  }
280
280
  else {
281
281
  const result = await repo.findAll({
@@ -283,7 +283,7 @@ export async function GET(request) {
283
283
  sort: "order",
284
284
  order: "asc",
285
285
  page: pageParam ?? undefined,
286
- perPage,
286
+ pageSize,
287
287
  });
288
288
  total = result.total;
289
289
  items = result.data
@@ -291,7 +291,7 @@ export async function GET(request) {
291
291
  .map(toCategoryListItem);
292
292
  }
293
293
  items = await withLiveTotals(items);
294
- const totalPages = total === 0 ? 0 : Math.max(1, Math.ceil(total / perPage));
294
+ const totalPages = total === 0 ? 0 : Math.max(1, Math.ceil(total / pageSize));
295
295
  /*
296
296
  * Shape switches on `?page=`, deliberately, and only there.
297
297
  *
@@ -311,7 +311,7 @@ export async function GET(request) {
311
311
  const res = isPaged
312
312
  ? NextResponse.json({
313
313
  success: true,
314
- data: { items, total, page, perPage, totalPages, hasMore: page < totalPages },
314
+ data: { items, total, page, pageSize, totalPages, hasMore: page < totalPages },
315
315
  })
316
316
  : NextResponse.json({ success: true, data: items });
317
317
  res.headers.set("Cache-Control", CACHE_CONTROL_PUBLIC);
@@ -322,7 +322,7 @@ export async function GET(request) {
322
322
  filters,
323
323
  sort: "order",
324
324
  order: "asc",
325
- perPage: 500,
325
+ pageSize: 500,
326
326
  });
327
327
  // Project BEFORE nesting — `CategoryTreeNode extends CategoryItem`, so the
328
328
  // children carry the public shape too rather than being raw documents
@@ -3,11 +3,12 @@ import { Row, SIEVE_OP, sieveAnd, sieveFilter } from "@mohasinac/appkit";
3
3
  import { sortBy } from "@mohasinac/appkit";
4
4
  import { categoryCrumbs, withTrailHead } from "../utils/breadcrumb-chain.js";
5
5
  import { ownTotalFor, descendantTotalFor } from "../schemas/category-counts.js";
6
- import Link from "next/link.js";
7
6
  import { categoriesRepository, productRepository, storeRepository, } from "../../../repositories/index.js";
8
7
  import { Container, Div, Heading, ImageMosaic, Main, MOSAIC_MIN, Section, Span, SplitTile, Stack, Text } from "../../../ui/index.js";
9
8
  import { MediaImage } from "../../media/MediaImage.js";
10
9
  import { RichTextRenderer } from "../../../ui/rich-text/RichTextRenderer.js";
10
+ import { OverflowRow } from "../../../ui/index.js";
11
+ import { resolveTaxonomyVisual } from "../utils/taxonomy-visual.js";
11
12
  import { CategoryDetailTabs } from "./CategoryDetailTabs.js";
12
13
  import { CategoryGrid } from "./CategoryGrid.js";
13
14
  import { CategoryHighlightsAndFaqSection } from "./CategoryHighlightsAndFaqSection.js";
@@ -28,10 +29,41 @@ import { toStoreListItem } from "../../../_internal/server/features/stores/adapt
28
29
  import { hidePublicTestData } from "../../../_internal/server/features/tester/visibility.js";
29
30
  const __O = {
30
31
  hidden: "overflow-hidden",
31
- xAuto: "overflow-x-auto",
32
32
  };
33
33
  /** The page's content width, repeated across every section on this view. */
34
34
  const __W = "max-w-7xl mx-auto";
35
+ /**
36
+ * Direct children → the Subcategories row's items.
37
+ *
38
+ * 🛑 THE ROLLUP, not the own count — `totalProductCount`, the same number the
39
+ * header pill reads and the same one `CategoryGrid` shows.
40
+ *
41
+ * These chips used to read `metrics.productCount`, which is items filed
42
+ * DIRECTLY under that child and excludes its own descendants. So on a parent
43
+ * whose header said 20, the chips beneath it could sum to 5 — two different
44
+ * questions answered with the same-looking number, side by side, with nothing
45
+ * saying which was which. The rule the catalogue is built on: a category's
46
+ * count is its own items plus every descendant's, and clicking it lists
47
+ * exactly those items.
48
+ *
49
+ * Admin surfaces that genuinely need both still show both —
50
+ * `CategoryTableColumns` renders "own (total)" explicitly.
51
+ */
52
+ function toSubcategoryItems(children) {
53
+ return children.map((child) => {
54
+ const count = child.metrics?.totalProductCount ?? child.metrics?.productCount ?? 0;
55
+ return {
56
+ id: child.id,
57
+ label: child.name,
58
+ // Omitted rather than rendered as 0 — `count` is "not counted" when
59
+ // undefined, and a chip reading "0" invites a click that lands on an
60
+ // empty page.
61
+ count: count > 0 ? count : undefined,
62
+ href: String(ROUTES.PUBLIC.CATEGORY_DETAIL(child.slug)),
63
+ ...resolveTaxonomyVisual(child),
64
+ };
65
+ });
66
+ }
35
67
  /**
36
68
  * Read and display bounds for this page. Every one of these replaced an
37
69
  * unbounded read — see the comments at each use site for what each one cost.
@@ -427,8 +459,6 @@ export async function CategoryDetailPageView({ slug }) {
427
459
  const directChildren = childCategories.filter((c) => c.tier === (category?.tier ?? 0) + 1);
428
460
  if (directChildren.length === 0)
429
461
  return null;
430
- return (_jsxs(Div, { padding: "b-2xs", children: [_jsx(Text, { size: "xs", color: "muted", weight: "medium", className: "mb-[var(--appkit-space-1-5)]", children: "Subcategories" }), _jsx(Div, { layout: "flex", gap: "2", className: `${__O.xAuto} [scrollbar-width:none]`, padding: "b-2xs", children: directChildren.map((child) => (_jsxs(Link, { href: String(ROUTES.PUBLIC.CATEGORY_DETAIL(child.slug)),
431
- // audit-responsive-wrap-ok: deliberate horizontal-scroll chip row (parent has overflow-x-auto) — each chip staying single-line is the intended design, not hidden content
432
- className: "flex-shrink-0 flex items-center gap-[var(--appkit-space-1-5)] rounded-full border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface-elevated)] px-[var(--appkit-space-4)] py-[var(--appkit-space-1-5)] text-[length:var(--appkit-text-sm)] font-medium text-[var(--appkit-color-text-muted)] hover:border-primary hover:text-primary transition-colors whitespace-nowrap", children: [child.display?.icon && (_jsx(Span, { className: "leading-none", children: child.display.icon })), child.name, (child.metrics?.totalProductCount ?? child.metrics?.productCount ?? 0) > 0 && (_jsx(Span, { size: "xs", color: "muted", children: (child.metrics?.totalProductCount ?? child.metrics?.productCount ?? 0).toLocaleString() }))] }, child.id))) })] }));
462
+ return (_jsxs(Div, { padding: "b-2xs", children: [_jsx(Text, { size: "xs", color: "muted", weight: "medium", className: "mb-[var(--appkit-space-1-5)]", children: "Subcategories" }), _jsx(OverflowRow, { items: toSubcategoryItems(directChildren), ariaLabel: "Subcategories", variant: "nav", placeholder: "Browse subcategories", searchPlaceholder: "Search subcategories\u2026", noResultsText: "No matching subcategory" })] }));
433
463
  })() }) })), _jsx(Section, { padding: "y-lg", children: _jsx(Container, { size: "xl", children: _jsx(CategoryDetailTabs, { categorySlug: slug, categoryId: category?.id, initialProductsData: productsResult ?? undefined, initialBundles: bundlesResult ?? [], initialStores: categoryStores, counts: counts, enabledListingTypes: enabledListingTypes(settings), enabledCategoryTypes: enabledCategoryTypes(settings) }) }) }), groupedListings.length > 0 && (_jsx(Section, { padding: "y-lg", children: _jsx(Container, { size: "xl", children: _jsx(GroupedListingsCarousel, { groups: groupedListings }) }) })), relatedCategories.length > 0 && (_jsx(Section, { border: "subtle", surface: "default", className: "border-t", padding: "y-lg", children: _jsxs(Container, { size: "xl", children: [_jsx(Heading, { level: 2, className: "mb-4", size: "xl", weight: "semibold", children: "Related Categories" }), _jsx(CategoryGrid, { categories: relatedCategories, getHref: (c) => String(ROUTES.PUBLIC.CATEGORY_DETAIL(c.slug)) })] }) }))] }));
434
464
  }
@@ -33,7 +33,6 @@ function CreateCategoryContent({ allCategories, onSuccess, onCancel, labels, sta
33
33
  const { shellCtx, validate } = useFormShellState(categoryDraftSchema);
34
34
  useEffect(() => {
35
35
  validate(draft);
36
- // eslint-disable-next-line react-hooks/exhaustive-deps
37
36
  }, [draft, validate]);
38
37
  const { mutate, isPending: isLoading } = useCreateCategory({
39
38
  onSuccess: (res) => {
@@ -10,8 +10,6 @@ export { CategoryFilters, CATEGORY_FILTER_KEYS, CATEGORY_ADMIN_SORT_OPTIONS, CAT
10
10
  export type { CategoryFiltersProps, CategoryFilterVariant, } from "./CategoryFilters";
11
11
  export { CategorySortSelect } from "./CategorySortSelect";
12
12
  export type { CategorySortSelectProps } from "./CategorySortSelect";
13
- export { CategoryProductsView } from "./CategoryProductsView";
14
- export type { CategoryProductsViewProps } from "./CategoryProductsView";
15
13
  export { CategoryProductsListing } from "./CategoryProductsListing";
16
14
  export type { CategoryProductsListingProps } from "./CategoryProductsListing";
17
15
  export { CategoryForm } from "./CategoryForm";
@@ -5,7 +5,6 @@ export { ConcernCard } from "./ConcernCard.js";
5
5
  export { ConcernGrid } from "./ConcernGrid.js";
6
6
  export { CategoryFilters, CATEGORY_FILTER_KEYS, CATEGORY_ADMIN_SORT_OPTIONS, CATEGORY_SELLER_SORT_OPTIONS, CATEGORY_PUBLIC_SORT_OPTIONS, getCategoryFilterKeys, getCategorySortOptions, } from "./CategoryFilters.js";
7
7
  export { CategorySortSelect } from "./CategorySortSelect.js";
8
- export { CategoryProductsView } from "./CategoryProductsView.js";
9
8
  export { CategoryProductsListing } from "./CategoryProductsListing.js";
10
9
  export { CategoryForm } from "./CategoryForm.js";
11
10
  export { CategorySelectorCreate } from "./CategorySelectorCreate.js";
@@ -262,6 +262,7 @@ export declare class CategoriesRepository extends BaseRepository<CategoryDocumen
262
262
  listByType(type: import("../types").CategoryType, opts?: {
263
263
  limit?: number;
264
264
  activeOnly?: boolean;
265
+ search?: string;
265
266
  }): Promise<CategoryDocument[]>;
266
267
  /** SB-UNI — locate a category by slug, optionally constrained by discriminator. */
267
268
  findBySlugAndType(slug: string, type?: import("../types").CategoryType): Promise<CategoryDocument | null>;
@@ -874,15 +874,45 @@ export class CategoriesRepository extends BaseRepository {
874
874
  }
875
875
  /** SB-UNI — discriminator-keyed listing (sublistings, brands, bundles). */
876
876
  async listByType(type, opts = {}) {
877
+ /*
878
+ * `search` is the SAME searchTxt pushdown `list()` uses, and it is here
879
+ * rather than left to the callers because the bundle routes query through
880
+ * this method and not through `list()`.
881
+ *
882
+ * They each hand-rolled `b.name?.toLowerCase().includes(q)` over the full
883
+ * set instead. That is substring-only, so it cannot reach an alias or a
884
+ * misspelling variant (the whole point of `buildCategorySearchTxt`'s
885
+ * generated n-grams — "dragon g" finds "Dragoon G", `.includes` never
886
+ * can), and it read the entire collection on every keystroke. Two copies
887
+ * of a rule the repository already owns is Root Cause #75's shape.
888
+ */
889
+ const plan = planSearchTxt(opts.search);
890
+ if (plan.empty)
891
+ return [];
877
892
  let q = this.db
878
893
  .collection(this.collection)
879
894
  .where(CATEGORY_FIELDS.CATEGORY_TYPE, "==", type);
880
895
  if (opts.activeOnly)
881
896
  q = q.where(CATEGORY_FIELDS.IS_ACTIVE, "==", true);
897
+ if (plan.head) {
898
+ q = q.where(CATEGORY_FIELDS.SEARCH_TXT, "array-contains", plan.head);
899
+ }
882
900
  if (opts.limit)
883
901
  q = q.limit(opts.limit);
884
902
  const snap = await q.get();
885
- return snap.docs.map((d) => this.mapDoc(d));
903
+ const rows = snap.docs.map((d) => this.mapDoc(d));
904
+ /*
905
+ * The remaining terms AND-refine in memory — Firestore allows one
906
+ * `array-contains` per query, so a second term cannot be pushed down. No
907
+ * window/page juggling is needed here because this method is already an
908
+ * unpaginated full read by contract; its callers page in memory.
909
+ */
910
+ if (plan.rest.length === 0)
911
+ return rows;
912
+ return rows.filter((r) => {
913
+ const tokens = new Set(r.searchTxt ?? []);
914
+ return plan.rest.every((t) => tokens.has(t));
915
+ });
886
916
  }
887
917
  /** SB-UNI — locate a category by slug, optionally constrained by discriminator. */
888
918
  async findBySlugAndType(slug, type) {
@@ -1815,16 +1815,16 @@ export declare const categoryListParamsSchema: z.ZodObject<{
1815
1815
  type?: "brand" | "category" | "collection" | "concern" | undefined;
1816
1816
  page?: number | undefined;
1817
1817
  q?: string | undefined;
1818
- perPage?: number | undefined;
1819
1818
  featured?: boolean | undefined;
1820
1819
  parentId?: string | undefined;
1821
1820
  tier?: number | undefined;
1821
+ perPage?: number | undefined;
1822
1822
  }, {
1823
1823
  type?: "brand" | "category" | "collection" | "concern" | undefined;
1824
1824
  page?: number | undefined;
1825
1825
  q?: string | undefined;
1826
- perPage?: number | undefined;
1827
1826
  featured?: boolean | undefined;
1828
1827
  parentId?: string | undefined;
1829
1828
  tier?: number | undefined;
1829
+ perPage?: number | undefined;
1830
1830
  }>;
@@ -0,0 +1,21 @@
1
+ export interface TaxonomyVisualSource {
2
+ name?: string;
3
+ display?: {
4
+ icon?: string;
5
+ coverImage?: string;
6
+ } | null;
7
+ }
8
+ export interface TaxonomyVisual {
9
+ /** A URL or `/media/<slug>` path safe to pass to an image component. */
10
+ imageUrl?: string;
11
+ /** Literal text (an emoji) meant to be rendered as text, never as `<img src>`. */
12
+ emoji?: string;
13
+ }
14
+ /**
15
+ * Resolve the leading visual for a taxonomy row.
16
+ *
17
+ * Precedence: `display.icon` (as image when it is a URL, else as emoji) →
18
+ * `display.coverImage`. Returns an empty object when the row has neither, so
19
+ * the caller can fall back to an initial rather than reserving a blank box.
20
+ */
21
+ export declare function resolveTaxonomyVisual(row: TaxonomyVisualSource | null | undefined): TaxonomyVisual;
@@ -0,0 +1,58 @@
1
+ /*
2
+ * WHY: `CategoryDisplay.icon` is a bare `string?` that two conventions write
3
+ * to and three renderers read differently. The seed puts an EMOJI there
4
+ * ("🪀" on the twelve forest roots, "🔥"/"🐴" on the sublistings), while
5
+ * `BrandsSection` has always treated it as a URL and feeds it straight to
6
+ * `resolveMediaUrl`. Both are live. So a renderer that guesses wrong
7
+ * either prints a raw URL as visible text, or hands an emoji to an
8
+ * `<img src>` that then 404s into a broken-image glyph.
9
+ *
10
+ * On top of that, `icon` BEATS `coverImage` — `brand-rows.ts` trap 2
11
+ * records why: the brand seed deliberately leaves `icon` unset precisely
12
+ * because an emoji left there would win over a real logo. A renderer that
13
+ * checks `coverImage` first silently inverts that rule.
14
+ *
15
+ * Two decisions, both easy to get wrong, previously made at each call
16
+ * site. This is the one place that makes them.
17
+ *
18
+ * WHAT: Resolves a taxonomy row (category / brand / franchise / bundle) to the
19
+ * single leading visual it should render.
20
+ *
21
+ * EXPORTS: resolveTaxonomyVisual, TaxonomyVisual, TaxonomyVisualSource
22
+ *
23
+ * @tag domain:categories
24
+ * @tag layer:feature
25
+ * @tag pattern:none
26
+ * @tag access:isomorphic
27
+ * @tag sideEffects:none
28
+ */
29
+ /**
30
+ * True when the string is a reference to be fetched rather than text to be
31
+ * printed. Deliberately permissive on the URL side and strict on nothing:
32
+ * every real value in this codebase is `http(s)://…`, `/media/…`,
33
+ * `/images/…` or a `data:` URI, and everything else written to `icon` has
34
+ * been an emoji.
35
+ */
36
+ function looksLikeUrl(value) {
37
+ return (value.startsWith("http") ||
38
+ value.startsWith("/") ||
39
+ value.startsWith("data:") ||
40
+ value.startsWith("blob:"));
41
+ }
42
+ /**
43
+ * Resolve the leading visual for a taxonomy row.
44
+ *
45
+ * Precedence: `display.icon` (as image when it is a URL, else as emoji) →
46
+ * `display.coverImage`. Returns an empty object when the row has neither, so
47
+ * the caller can fall back to an initial rather than reserving a blank box.
48
+ */
49
+ export function resolveTaxonomyVisual(row) {
50
+ const icon = row?.display?.icon?.trim();
51
+ if (icon) {
52
+ return looksLikeUrl(icon) ? { imageUrl: icon } : { emoji: icon };
53
+ }
54
+ const cover = row?.display?.coverImage?.trim();
55
+ if (cover && looksLikeUrl(cover))
56
+ return { imageUrl: cover };
57
+ return {};
58
+ }
@@ -67,7 +67,14 @@ export async function sendCheckoutValueOtp(userId, userEmail, channel = "email",
67
67
  throw new ValidationError("WhatsApp verification isn't available right now — send the code by email instead.");
68
68
  }
69
69
  const address = await addressesRepository.findById(addressId);
70
- const phone = address?.phone?.trim();
70
+ /*
71
+ * REVEALED: this phone receives the high-value checkout OTP, so it has to
72
+ * be the real number. `addressesRepository` is ciphertext-by-default, and
73
+ * `.trim()` on the stored value is what the nominal brand caught — the
74
+ * old intersection form let `Encrypted<string>` call string methods.
75
+ */
76
+ const addressPlain = address ? addressesRepository.revealAddress(address) : null;
77
+ const phone = addressPlain?.phone?.trim();
71
78
  if (!phone) {
72
79
  throw new ValidationError("The selected address has no phone number on file — send the code by email instead.");
73
80
  }
@@ -27,7 +27,7 @@ export async function GET(request, { params }) {
27
27
  const repo = db.getRepository("collections");
28
28
  const result = await repo.findAll({
29
29
  filters: `slug==${slug}`,
30
- perPage: 1,
30
+ pageSize: 1,
31
31
  });
32
32
  if (!result.data[0]) {
33
33
  return NextResponse.json({ success: false, error: ERR_COLLECTION_NOT_FOUND }, { status: 404 });
@@ -58,7 +58,7 @@ export async function PATCH(request, { params }) {
58
58
  const repo = db.getRepository("collections");
59
59
  const result = await repo.findAll({
60
60
  filters: `slug==${slug}`,
61
- perPage: 1,
61
+ pageSize: 1,
62
62
  });
63
63
  if (!result.data[0]) {
64
64
  return NextResponse.json({ success: false, error: ERR_COLLECTION_NOT_FOUND }, { status: 404 });
@@ -89,7 +89,7 @@ export async function DELETE(request, { params }) {
89
89
  const repo = db.getRepository("collections");
90
90
  const result = await repo.findAll({
91
91
  filters: `slug==${slug}`,
92
- perPage: 1,
92
+ pageSize: 1,
93
93
  });
94
94
  if (!result.data[0]) {
95
95
  return NextResponse.json({ success: false, error: ERR_COLLECTION_NOT_FOUND }, { status: 404 });
@@ -33,7 +33,7 @@ export async function GET(request) {
33
33
  filters,
34
34
  sort,
35
35
  page,
36
- perPage: pageSize,
36
+ pageSize: pageSize,
37
37
  });
38
38
  const totalPages = Math.max(1, Math.ceil(result.total / pageSize));
39
39
  return NextResponse.json({
@@ -33,7 +33,7 @@ export async function GET(request) {
33
33
  filters,
34
34
  sort,
35
35
  page,
36
- perPage: pageSize,
36
+ pageSize: pageSize,
37
37
  });
38
38
  const totalPages = Math.max(1, Math.ceil(result.total / pageSize));
39
39
  return NextResponse.json({
@@ -9,7 +9,7 @@ export class ConsultationsRepository {
9
9
  const result = await this.repo.findAll({
10
10
  filters: `status==${status}`,
11
11
  sort: "-createdAt",
12
- perPage: 100,
12
+ pageSize: 100,
13
13
  });
14
14
  return result.data;
15
15
  }
@@ -29,5 +29,5 @@ export interface ConsultationListResponse {
29
29
  data: ConsultationBooking[];
30
30
  total: number;
31
31
  page: number;
32
- perPage: number;
32
+ pageSize: number;
33
33
  }
@@ -71,9 +71,7 @@ export function ContactForm({ onSubmit, labels = {}, className = "", }) {
71
71
  finally {
72
72
  setIsSubmitting(false);
73
73
  }
74
- },
75
- // eslint-disable-next-line react-hooks/exhaustive-deps
76
- [form, onSubmit, labels, validateSchema]);
74
+ }, [form, onSubmit, labels, validateSchema]);
77
75
  if (submitted) {
78
76
  return (_jsxs(Div, { className: `text-center ${className}`, padding: "y-3xl", children: [_jsx(Div, { textSize: "5xl", className: "mb-4", children: "\u2705" }), _jsx(Heading, { level: 2, className: "mb-2", children: labels.successTitle ?? "Message Sent!" }), _jsx(Text, { variant: "secondary", className: "mb-6", children: labels.successDescription ?? "We'll get back to you shortly." }), _jsx(Button, { type: "button", variant: "outline", onClick: () => setSubmitted(false), children: labels.sendAnotherButton ?? "Send another message" })] }));
79
77
  }
@@ -33,7 +33,7 @@ export async function GET(request) {
33
33
  filters,
34
34
  sort,
35
35
  page,
36
- perPage: pageSize,
36
+ pageSize: pageSize,
37
37
  });
38
38
  const totalPages = Math.max(1, Math.ceil(result.total / pageSize));
39
39
  return NextResponse.json({
@@ -9,7 +9,7 @@ export class CorporateRepository {
9
9
  const result = await this.repo.findAll({
10
10
  filters: `status==${status}`,
11
11
  sort: "-createdAt",
12
- perPage: 100,
12
+ pageSize: 100,
13
13
  });
14
14
  return result.data;
15
15
  }
@@ -33,5 +33,5 @@ export interface CorporateInquiryListResponse {
33
33
  data: CorporateInquiry[];
34
34
  total: number;
35
35
  page: number;
36
- perPage: number;
36
+ pageSize: number;
37
37
  }
@@ -13,7 +13,7 @@ export function createAuctionExpiryJob(auctionRepo) {
13
13
  }, async (ctx) => {
14
14
  const result = await auctionRepo.findAll({
15
15
  filters: sieveAnd(sieveFilter("status", SIEVE_OP.EQ, "live"), sieveFilter("endTime", SIEVE_OP.LTE, ctx.scheduleTime)),
16
- perPage: 500,
16
+ pageSize: 500,
17
17
  });
18
18
  let processed = 0;
19
19
  let errors = 0;
@@ -19,7 +19,7 @@ export function createPreOrderReminderJob(preOrderRepo) {
19
19
  const cutoff = sevenDaysFromNow();
20
20
  const result = await preOrderRepo.findAll({
21
21
  filters: sieveAnd(sieveFilter("status", SIEVE_OP.EQ, "confirmed"), sieveFilter("expectedShippingDate", SIEVE_OP.LTE, cutoff)),
22
- perPage: 500,
22
+ pageSize: 500,
23
23
  });
24
24
  let processed = 0;
25
25
  let errors = 0;
@@ -114,6 +114,20 @@ export declare function getEventSpinResults(eventId: string, limit?: number): Pr
114
114
  * supplied by the server from a verified session, never by the client.
115
115
  */
116
116
  export declare function getUserSpinResultsForEvent(eventId: string, userId: string): Promise<import("../types").SpinResultEntry[]>;
117
+ /**
118
+ * Has this signed-in user already entered this event?
119
+ *
120
+ * Exists so the participate page can render a raffle's already-entered state on
121
+ * FIRST PAINT. The form tracked it in `useState(0)`, which a reload reset — so
122
+ * a returning entrant saw an inviting empty form, submitted, and was refused.
123
+ * A refusal the page could have predicted is a worse experience than a form
124
+ * that says so up front.
125
+ *
126
+ * Reuses `hasUserEntered` (one `(eventId, userId)` equality pair, an index that
127
+ * is already proven by `countUserEntries`) rather than counting, because the
128
+ * limit is one — see `RAFFLE_MAX_ENTRIES_PER_USER`.
129
+ */
130
+ export declare function hasUserEnteredEvent(eventId: string, userId: string): Promise<boolean>;
117
131
  /**
118
132
  * Per-option vote tally for a poll event — replaces the voter-ranked
119
133
  * leaderboard for event.type === "poll", where ranking "who happened to