@mohasinac/appkit 4.3.2 → 4.4.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 (183) hide show
  1. package/dist/_internal/client/features/maintenance/views/AnalysisRunnerView.js +1 -1
  2. package/dist/_internal/client/features/maintenance/views/CloudLogsListView.js +1 -1
  3. package/dist/_internal/client/features/maintenance/views/MaintenanceDashboardView.js +1 -1
  4. package/dist/_internal/client/features/maintenance/views/ServerErrorDetailView.js +1 -1
  5. package/dist/_internal/client/features/maintenance/views/ServerErrorsListView.js +1 -1
  6. package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +14 -3
  7. package/dist/_internal/server/jobs/core/assignSpinPrize.js +95 -56
  8. package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +8 -2
  9. package/dist/_internal/shared/actions/action-registry.js +15 -0
  10. package/dist/_internal/shared/features/brands/schema.d.ts +4 -4
  11. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +4 -4
  12. package/dist/_internal/shared/features/orders/schema.d.ts +8 -8
  13. package/dist/_internal/shared/features/reviews/schema.d.ts +2 -2
  14. package/dist/client.d.ts +36 -0
  15. package/dist/client.js +30 -0
  16. package/dist/constants/api-endpoints.d.ts +6 -0
  17. package/dist/constants/api-endpoints.js +2 -0
  18. package/dist/constants/field-names.d.ts +3 -0
  19. package/dist/constants/field-names.js +4 -0
  20. package/dist/features/about/components/DeveloperView.d.ts +16 -0
  21. package/dist/features/about/components/DeveloperView.js +29 -0
  22. package/dist/features/about/index.d.ts +2 -0
  23. package/dist/features/about/index.js +1 -0
  24. package/dist/features/account/schemas/index.d.ts +16 -16
  25. package/dist/features/addresses/schemas/index.d.ts +8 -8
  26. package/dist/features/admin/components/AdminAddressesView.js +1 -1
  27. package/dist/features/admin/components/AdminAllEventEntriesView.js +2 -2
  28. package/dist/features/admin/components/AdminArtView.js +1 -1
  29. package/dist/features/admin/components/AdminBidsView.js +2 -2
  30. package/dist/features/admin/components/AdminBlogView.js +2 -2
  31. package/dist/features/admin/components/AdminBrandsView.js +2 -2
  32. package/dist/features/admin/components/AdminBundlesView.js +2 -2
  33. package/dist/features/admin/components/AdminCartsView.js +2 -2
  34. package/dist/features/admin/components/AdminCategoriesView.js +2 -2
  35. package/dist/features/admin/components/AdminClassifiedView.js +1 -1
  36. package/dist/features/admin/components/AdminContactView.js +2 -2
  37. package/dist/features/admin/components/AdminCouponsView.js +2 -2
  38. package/dist/features/admin/components/AdminDigitalCodesView.js +1 -1
  39. package/dist/features/admin/components/AdminFaqsView.js +2 -2
  40. package/dist/features/admin/components/AdminFeaturesView.js +1 -1
  41. package/dist/features/admin/components/AdminGroupedListingsView.js +1 -1
  42. package/dist/features/admin/components/AdminHistoryView.js +1 -1
  43. package/dist/features/admin/components/AdminLiveView.js +1 -1
  44. package/dist/features/admin/components/AdminNewsletterView.js +2 -2
  45. package/dist/features/admin/components/AdminNotificationsView.js +2 -2
  46. package/dist/features/admin/components/AdminOrdersView.js +2 -2
  47. package/dist/features/admin/components/AdminPaymentMethodsView.js +1 -1
  48. package/dist/features/admin/components/AdminPayoutsView.js +2 -2
  49. package/dist/features/admin/components/AdminPrizeDrawsView.js +2 -2
  50. package/dist/features/admin/components/AdminProductsView.js +2 -2
  51. package/dist/features/admin/components/AdminReturnRequestsView.js +1 -1
  52. package/dist/features/admin/components/AdminReviewsView.js +2 -2
  53. package/dist/features/admin/components/AdminScammersView.js +2 -2
  54. package/dist/features/admin/components/AdminSessionsView.js +2 -2
  55. package/dist/features/admin/components/AdminStickersView.js +1 -1
  56. package/dist/features/admin/components/AdminStoreAddressesView.js +1 -1
  57. package/dist/features/admin/components/AdminStoresView.js +2 -2
  58. package/dist/features/admin/components/AdminSublistingCategoriesView.js +1 -1
  59. package/dist/features/admin/components/AdminSupportTicketsView.js +2 -2
  60. package/dist/features/admin/components/AdminTeamView.js +2 -2
  61. package/dist/features/admin/components/AdminTesterChecklistView.js +2 -2
  62. package/dist/features/admin/components/AdminUsersView.js +2 -2
  63. package/dist/features/admin/components/AdminWishlistsView.js +1 -1
  64. package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
  65. package/dist/features/auth/hooks/useAuth.d.ts +1 -1
  66. package/dist/features/blog/actions/blog-actions.d.ts +14 -14
  67. package/dist/features/blog/schemas/index.d.ts +14 -14
  68. package/dist/features/cart/hooks/useAddToCart.d.ts +6 -2
  69. package/dist/features/cart/hooks/useAddToCart.js +20 -3
  70. package/dist/features/cart/schemas/index.d.ts +3 -3
  71. package/dist/features/cart/utils/pending-ops.d.ts +20 -0
  72. package/dist/features/cart/utils/pending-ops.js +22 -0
  73. package/dist/features/catalogue/components/AdminCatalogueApprovalsView.js +1 -1
  74. package/dist/features/categories/components/CategoryBundlesListing.js +1 -1
  75. package/dist/features/categories/components/CategoryFilters.js +1 -1
  76. package/dist/features/categories/components/CategoryTree.js +1 -1
  77. package/dist/features/categories/schemas/index.d.ts +16 -16
  78. package/dist/features/events/actions/event-actions.d.ts +21 -1
  79. package/dist/features/events/actions/event-actions.js +85 -3
  80. package/dist/features/events/components/AdminEventEditorView.js +11 -2
  81. package/dist/features/events/components/AdminEventEntriesView.js +37 -4
  82. package/dist/features/events/components/AdminEventsView.js +2 -2
  83. package/dist/features/events/components/EventLeaderboard.d.ts +12 -2
  84. package/dist/features/events/components/EventLeaderboard.js +4 -1
  85. package/dist/features/events/components/EventRafflesSection.js +2 -2
  86. package/dist/features/events/repository/event-entry.repository.d.ts +39 -0
  87. package/dist/features/events/repository/event-entry.repository.js +153 -0
  88. package/dist/features/events/schemas/firestore.d.ts +28 -1
  89. package/dist/features/events/schemas/firestore.js +9 -0
  90. package/dist/features/events/schemas/index.d.ts +13 -13
  91. package/dist/features/events/types/index.d.ts +26 -0
  92. package/dist/features/faq/actions/faq-actions.d.ts +8 -8
  93. package/dist/features/faq/schemas/index.d.ts +22 -22
  94. package/dist/features/grouped/schemas/index.d.ts +2 -2
  95. package/dist/features/homepage/components/AnnouncementBar.d.ts +9 -1
  96. package/dist/features/homepage/components/AnnouncementBar.js +6 -3
  97. package/dist/features/homepage/components/MarketplaceHomepageView.js +2 -2
  98. package/dist/features/homepage/components/SectionCarousel.js +5 -1
  99. package/dist/features/homepage/components/WelcomeSection.js +2 -2
  100. package/dist/features/homepage/schemas/index.d.ts +2 -2
  101. package/dist/features/layout/BottomNavbar.js +8 -6
  102. package/dist/features/lottery/schemas/zod.d.ts +10 -10
  103. package/dist/features/media/MediaVideo.js +11 -3
  104. package/dist/features/orders/schemas/index.d.ts +52 -52
  105. package/dist/features/products/components/CompareOverlay.d.ts +9 -0
  106. package/dist/features/products/components/CompareOverlay.js +28 -3
  107. package/dist/features/products/components/InteractiveProductCard.js +9 -3
  108. package/dist/features/products/components/MakeOfferForm.js +1 -1
  109. package/dist/features/products/components/PlaceBidForm.js +1 -1
  110. package/dist/features/products/components/PrizeDrawCollage.js +1 -1
  111. package/dist/features/products/components/PrizeDrawsSection.js +2 -2
  112. package/dist/features/products/components/ProductDetailActions.js +3 -1
  113. package/dist/features/products/components/ProductGrid.js +1 -1
  114. package/dist/features/products/components/ProductInfo.js +1 -1
  115. package/dist/features/products/components/ProductsIndexListing.js +12 -2
  116. package/dist/features/products/hooks/useRelatedProducts.js +1 -1
  117. package/dist/features/products/schemas/index.d.ts +10 -10
  118. package/dist/features/promotions/schemas/index.d.ts +8 -8
  119. package/dist/features/reviews/schemas/index.d.ts +12 -12
  120. package/dist/features/scams/schemas/index.d.ts +6 -6
  121. package/dist/features/seller/components/CouponInlineSelect.js +1 -1
  122. package/dist/features/seller/components/SellerArtView.js +2 -2
  123. package/dist/features/seller/components/SellerAuctionsView.js +2 -2
  124. package/dist/features/seller/components/SellerBidsView.js +2 -2
  125. package/dist/features/seller/components/SellerBundlesView.js +1 -1
  126. package/dist/features/seller/components/SellerClassifiedView.js +2 -2
  127. package/dist/features/seller/components/SellerCouponsView.js +2 -2
  128. package/dist/features/seller/components/SellerDigitalCodesView.js +2 -2
  129. package/dist/features/seller/components/SellerGroupedListingsView.js +1 -1
  130. package/dist/features/seller/components/SellerLiveView.js +2 -2
  131. package/dist/features/seller/components/SellerOffersView.js +2 -2
  132. package/dist/features/seller/components/SellerOrdersView.js +2 -2
  133. package/dist/features/seller/components/SellerPayoutMethodsView.js +2 -2
  134. package/dist/features/seller/components/SellerPayoutsView.js +2 -2
  135. package/dist/features/seller/components/SellerPreOrdersView.js +2 -2
  136. package/dist/features/seller/components/SellerPrizeDrawsView.js +2 -2
  137. package/dist/features/seller/components/SellerProductsView.js +2 -2
  138. package/dist/features/seller/components/SellerShippingConfigsView.js +2 -2
  139. package/dist/features/seller/components/SellerStickersView.js +2 -2
  140. package/dist/features/seller/components/SellerStoreCategoriesView.js +1 -1
  141. package/dist/features/seller/components/SublistingInlineSelect.js +1 -1
  142. package/dist/features/seller/hooks/useSellerListingData.d.ts +1 -1
  143. package/dist/features/seller/schemas/index.d.ts +16 -16
  144. package/dist/features/server-errors/schemas/index.d.ts +4 -4
  145. package/dist/features/shell/StepForm.d.ts +1 -1
  146. package/dist/features/shipments/components/AdminShipmentsView.js +2 -2
  147. package/dist/features/stores/components/StoreProductsView.js +1 -1
  148. package/dist/features/stores/components/StoresIndexListing.js +1 -1
  149. package/dist/features/stores/schemas/index.d.ts +30 -30
  150. package/dist/features/support/schemas/index.d.ts +2 -2
  151. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +68 -1
  152. package/dist/features/whatsapp-bot/helpers/payment-proof-message.d.ts +14 -0
  153. package/dist/features/whatsapp-bot/helpers/payment-proof-message.js +17 -0
  154. package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +2 -8
  155. package/dist/features/whatsapp-bot/helpers/whatsapp.js +4 -11
  156. package/dist/features/wishlist/repository/user-wishlist.repository.d.ts +11 -0
  157. package/dist/features/wishlist/repository/user-wishlist.repository.js +33 -0
  158. package/dist/index.d.ts +7 -12
  159. package/dist/index.js +16 -28
  160. package/dist/next/components/ErrorView.js +1 -1
  161. package/dist/next/components/NotFoundView.js +1 -1
  162. package/dist/next/components/UnauthorizedView.js +1 -1
  163. package/dist/next/routing/route-map.d.ts +4 -0
  164. package/dist/next/routing/route-map.js +2 -0
  165. package/dist/react/contexts/SessionContext.d.ts +1 -1
  166. package/dist/react/hooks/use-action-dispatch.d.ts +1 -1
  167. package/dist/react/hooks/useFormStatePreservation.d.ts +1 -1
  168. package/dist/schemas/registry.d.ts +236 -236
  169. package/dist/schemas/webhooks/razorpay.d.ts +100 -100
  170. package/dist/security/index.d.ts +1 -1
  171. package/dist/security/index.js +1 -1
  172. package/dist/security/rate-limit.d.ts +10 -0
  173. package/dist/security/rate-limit.js +13 -1
  174. package/dist/seed/events-seed-data.js +52 -1
  175. package/dist/server.d.ts +6 -0
  176. package/dist/server.js +8 -0
  177. package/dist/styles.css +25 -1
  178. package/dist/tailwind-utilities.css +1 -1
  179. package/dist/ui/components/HorizontalScroller.d.ts +7 -1
  180. package/dist/ui/components/HorizontalScroller.js +2 -2
  181. package/dist/ui/components/HorizontalScroller.style.css +24 -0
  182. package/dist/validation/schemas.d.ts +12 -12
  183. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  export { generateNonce, buildCSP } from "./csp";
2
- export { rateLimit, applyRateLimit, rateLimitByIdentifier, RateLimitPresets, clearRateLimitStore, } from "./rate-limit";
2
+ export { rateLimit, applyRateLimit, rateLimitByIdentifier, RateLimitPresets, clearRateLimitStore, getClientIP, hashGuestIdentity, } from "./rate-limit";
3
3
  export type { RateLimitConfig, RateLimitResult } from "./rate-limit";
4
4
  export { requireAuth, requireRole, requireOwnership, requireEmailVerified, requireActiveAccount, canChangeRole, getRoleLevel, } from "./authorization";
5
5
  export type { UserRole } from "./authorization";
@@ -1,5 +1,5 @@
1
1
  export { generateNonce, buildCSP } from "./csp";
2
- export { rateLimit, applyRateLimit, rateLimitByIdentifier, RateLimitPresets, clearRateLimitStore, } from "./rate-limit";
2
+ export { rateLimit, applyRateLimit, rateLimitByIdentifier, RateLimitPresets, clearRateLimitStore, getClientIP, hashGuestIdentity, } from "./rate-limit";
3
3
  export { requireAuth, requireRole, requireOwnership, requireEmailVerified, requireActiveAccount, canChangeRole, getRoleLevel, } from "./authorization";
4
4
  export { redactPii, safeDisplayName, safeDisplayEmail, maskIp } from "./pii-redact";
5
5
  export { encryptValue, decryptValue, hmacBlindIndex, encryptPiiFields, decryptPiiFields, encryptPii, decryptPii, piiBlindIndex, addPiiIndices, getPiiConfigError, encryptShippingAddress, decryptShippingAddress, encryptPayoutDetails, decryptPayoutDetails, encryptShippingConfig, decryptShippingConfig, encryptPayoutBankAccount, decryptPayoutBankAccount, } from "./pii-encrypt";
@@ -27,6 +27,16 @@ export interface RateLimitResult {
27
27
  reset: number;
28
28
  error?: string;
29
29
  }
30
+ export declare function getClientIP(request: NextRequest | Request): string;
31
+ /**
32
+ * Deterministic, non-reversible identity hash for an unauthenticated
33
+ * ("guest") caller, scoped to an entity (e.g. an event id) so the same
34
+ * physical visitor can't be correlated across unrelated entities from the
35
+ * hash alone. Reuses the same HMAC-SHA256 blind-index primitive already
36
+ * used for PII lookups (`emailIndex`/`phoneIndex`) — the raw IP is never
37
+ * persisted, only this hash.
38
+ */
39
+ export declare function hashGuestIdentity(scope: string, request: NextRequest | Request): string;
30
40
  /**
31
41
  * Rate limit by request. Uses Upstash Redis when configured, in-memory otherwise.
32
42
  */
@@ -11,8 +11,9 @@
11
11
  * UPSTASH_REDIS_REST_URL
12
12
  * UPSTASH_REDIS_REST_TOKEN
13
13
  */
14
+ import { hmacBlindIndex } from "./pii-encrypt";
14
15
  // --- IP extraction ------------------------------------------------------------
15
- function getClientIP(request) {
16
+ export function getClientIP(request) {
16
17
  const forwarded = request.headers.get("x-forwarded-for");
17
18
  if (forwarded)
18
19
  return forwarded.split(",")[0].trim();
@@ -21,6 +22,17 @@ function getClientIP(request) {
21
22
  return realIP;
22
23
  return "unknown";
23
24
  }
25
+ /**
26
+ * Deterministic, non-reversible identity hash for an unauthenticated
27
+ * ("guest") caller, scoped to an entity (e.g. an event id) so the same
28
+ * physical visitor can't be correlated across unrelated entities from the
29
+ * hash alone. Reuses the same HMAC-SHA256 blind-index primitive already
30
+ * used for PII lookups (`emailIndex`/`phoneIndex`) — the raw IP is never
31
+ * persisted, only this hash.
32
+ */
33
+ export function hashGuestIdentity(scope, request) {
34
+ return hmacBlindIndex(`${scope}:${getClientIP(request)}`);
35
+ }
24
36
  // --- Upstash-backed limiter ---------------------------------------------------
25
37
  let upstashLimiter = null;
26
38
  async function getUpstashLimiter() {
@@ -31,6 +31,9 @@ export const eventsSeedData = [
31
31
  endsAt: daysAhead(10),
32
32
  coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/event-cover-favourite-blader-poll-20260101/1200/600"), alt: "Original series Beyblade lineup" },
33
33
  tags: ["poll", "original-series", "season-1"],
34
+ // Demo fixture for the guest-participation toggle (2026-08-20) — polls
35
+ // are otherwise login-gated, so this event demonstrates the override.
36
+ allowGuestParticipation: true,
34
37
  pollConfig: {
35
38
  options: [
36
39
  { id: "tyson", label: "Mock User 6" },
@@ -138,7 +141,11 @@ export const eventsSeedData = [
138
141
  { id: "spin-grip", label: "Free Launcher Grip Tape", weight: 10, isActive: true },
139
142
  { id: "spin-try-again", label: "Try Again Tomorrow!", weight: 50, isActive: true },
140
143
  ],
141
- spinMaxPerUser: 1,
144
+ // spinMaxPerUser: 2 (not the default 1) so the per-identity spin-count
145
+ // enforcement added 2026-08-20 has a real demo case, and
146
+ // allowGuestParticipation lets a signed-out visitor spin too.
147
+ spinMaxPerUser: 2,
148
+ allowGuestParticipation: true,
142
149
  spinWindowStart: daysAgo(7),
143
150
  spinWindowEnd: daysAhead(23),
144
151
  stats: { totalEntries: 534, approvedEntries: 534, flaggedEntries: 0 },
@@ -359,6 +366,7 @@ export const eventEntriesSeedData = [
359
366
  userDisplayName: "Mock User 2",
360
367
  userEmail: "vivaan.kapoor@gmail.com",
361
368
  spinUsed: true,
369
+ spinCount: 1,
362
370
  spinPrizeId: "spin-10pct",
363
371
  spinPrizeCouponCode: "REHAN10",
364
372
  spinWonAt: daysAgo(1),
@@ -366,4 +374,47 @@ export const eventEntriesSeedData = [
366
374
  submittedAt: daysAgo(1),
367
375
  createdAt: daysAgo(1),
368
376
  },
377
+ // Rehan spun the wheel twice (spinMaxPerUser: 2 on this event) — demo
378
+ // fixture for the per-identity spin-count enforcement added 2026-08-20.
379
+ {
380
+ id: "entry-spin-yugi-001",
381
+ eventId: "event-daily-beyblade-pull-wheel",
382
+ userId: "user-yugi-muto",
383
+ userDisplayName: "Mock User 3",
384
+ userEmail: "rehan.sheikh@gmail.com",
385
+ spinUsed: true,
386
+ spinCount: 2,
387
+ spinPrizeId: "spin-grip",
388
+ spinWonAt: daysAgo(1),
389
+ reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
390
+ submittedAt: daysAgo(2),
391
+ createdAt: daysAgo(2),
392
+ },
393
+ // A guest (not logged in) spun the wheel — demo fixture for the
394
+ // guest-participation toggle added 2026-08-20. This event's
395
+ // allowGuestParticipation is true, so no userId is set; guestIpHash is a
396
+ // deterministic-looking placeholder (real values are HMAC-SHA256 hex).
397
+ {
398
+ id: "entry-spin-guest-001",
399
+ eventId: "event-daily-beyblade-pull-wheel",
400
+ guestIpHash: "hmac-sha256:seed-placeholder-guest-spin-001",
401
+ spinUsed: true,
402
+ spinCount: 1,
403
+ spinPrizeId: "spin-5pct",
404
+ spinWonAt: daysAgo(3),
405
+ reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
406
+ submittedAt: daysAgo(3),
407
+ createdAt: daysAgo(3),
408
+ },
409
+ // A guest voted in the poll — demo fixture for allowGuestParticipation on
410
+ // a non-spin event type (poll).
411
+ {
412
+ id: "entry-poll-guest-001",
413
+ eventId: "event-favourite-blader-poll",
414
+ guestIpHash: "hmac-sha256:seed-placeholder-guest-poll-001",
415
+ pollVotes: ["max"],
416
+ reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
417
+ submittedAt: daysAgo(2),
418
+ createdAt: daysAgo(2),
419
+ },
369
420
  ];
package/dist/server.d.ts CHANGED
@@ -247,6 +247,8 @@ export { listCategories } from "./features/categories/server";
247
247
  export { listTopLevelCategories } from "./features/categories/server";
248
248
  export { updateCategory } from "./features/categories/server";
249
249
  export { sendCheckoutValueOtp, verifyCheckoutValueOtp, isCheckoutValueOtpVerified, } from "./features/checkout/server";
250
+ export { FailedCheckoutRepository, failedCheckoutRepository } from "./features/checkout/server";
251
+ export type { FailedCheckoutMeta, FailedPaymentMeta } from "./features/checkout/server";
250
252
  export { EmailButton, EmailColumn, EmailContainer, EmailDivider, EmailDoc, EmailFooter, EmailHeader, EmailImage, EmailLink, EmailRow, } from "./features/email";
251
253
  export type { EmailButtonProps, EmailColumnProps, EmailContainerProps, EmailDividerProps, EmailDocProps, EmailFooterProps, EmailHeaderProps, EmailImageProps, EmailLinkProps, EmailRowProps, EmailTone, } from "./features/email";
252
254
  export { sendContactEmail } from "./features/contact/server";
@@ -255,6 +257,7 @@ export { sendOrderConfirmationEmail } from "./features/contact/server";
255
257
  export { sendPasswordResetEmailWithLink } from "./features/contact/server";
256
258
  export { sendSiteSettingsChangedEmail } from "./features/contact/server";
257
259
  export { sendVerificationEmailWithLink } from "./features/contact/server";
260
+ export type { OrderConfirmationEmailParams } from "./features/contact/server";
258
261
  export { adminGetEventById } from "./features/events/server";
259
262
  export { adminGetEventEntries } from "./features/events/server";
260
263
  export { adminGetEventStats } from "./features/events/server";
@@ -267,6 +270,7 @@ export { enterEvent } from "./features/events/server";
267
270
  export { eventIdGET } from "./features/events/server";
268
271
  export { eventsGET } from "./features/events/server";
269
272
  export { getEventLeaderboard } from "./features/events/server";
273
+ export { getEventPollResults } from "./features/events/server";
270
274
  export { getBugHunterLeaderboard } from "./features/tester/server";
271
275
  export { getPublicEventById } from "./features/events/server";
272
276
  export { listPublicEvents } from "./features/events/server";
@@ -439,6 +443,8 @@ export { safeFireAndForget } from "./utils/safe-fire-forget";
439
443
  export { applyRateLimit } from "./security/index";
440
444
  export { rateLimitByIdentifier } from "./security/index";
441
445
  export { RateLimitPresets } from "./security/index";
446
+ export { getClientIP } from "./security/index";
447
+ export { hashGuestIdentity } from "./security/index";
442
448
  export { maskPublicEventEntry } from "./security/index";
443
449
  export { encryptValue } from "./security/index";
444
450
  export { decryptValue } from "./security/index";
package/dist/server.js CHANGED
@@ -714,6 +714,7 @@ export { listTopLevelCategories } from "./features/categories/server";
714
714
  export { updateCategory } from "./features/categories/server";
715
715
  // [SERVER-ONLY] Tier PP — high-value checkout OTP gate.
716
716
  export { sendCheckoutValueOtp, verifyCheckoutValueOtp, isCheckoutValueOtpVerified, } from "./features/checkout/server";
717
+ export { FailedCheckoutRepository, failedCheckoutRepository } from "./features/checkout/server";
717
718
  // [SERVER-ONLY] Email primitives — table-based, inline-styled components
718
719
  // that render email-client-compatible HTML via renderToStaticMarkup. Use
719
720
  // these instead of authoring raw <table>/<tr>/<td> in email templates.
@@ -773,6 +774,9 @@ export { eventsGET } from "./features/events/server";
773
774
  // getEventLeaderboard - Helper for get event leaderboard.
774
775
  export { getEventLeaderboard } from "./features/events/server";
775
776
  // [SERVER-ONLY]-Server-only — uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
777
+ // getEventPollResults - Helper for get event poll results (per-option vote tally).
778
+ export { getEventPollResults } from "./features/events/server";
779
+ // [SERVER-ONLY]-Server-only — uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
776
780
  // getBugHunterLeaderboard - Ranks testers by confirmed-bug count.
777
781
  export { getBugHunterLeaderboard } from "./features/tester/server";
778
782
  // [SERVER-ONLY]-Server-only — uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
@@ -1265,6 +1269,10 @@ export { applyRateLimit } from "./security/index";
1265
1269
  export { rateLimitByIdentifier } from "./security/index";
1266
1270
  // RateLimitPresets - Preset configurations for common rate-limit scenarios.
1267
1271
  export { RateLimitPresets } from "./security/index";
1272
+ // getClientIP - Extract the caller's IP from x-forwarded-for/x-real-ip.
1273
+ export { getClientIP } from "./security/index";
1274
+ // hashGuestIdentity - Deterministic, non-reversible hash of a guest caller's IP scoped to an entity (never persists the raw IP).
1275
+ export { hashGuestIdentity } from "./security/index";
1268
1276
  // maskPublicEventEntry - Redact PII from event entries before public exposure.
1269
1277
  export { maskPublicEventEntry } from "./security/index";
1270
1278
  // PII encryption/masking (server-only -- crypto module via node:module, must never leak into a client bundle; see appkit Export Rules in CLAUDE.md)