@mohasinac/appkit 4.52.5 → 4.53.1
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.
- package/dist/.build-stamp.json +4 -4
- package/dist/_internal/client/features/sticker-trace/canvas-codec.d.ts +2 -0
- package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
- package/dist/_internal/client/scaffolds/AppShell.js +1 -1
- package/dist/_internal/server/features/auctions/actions.js +1 -1
- package/dist/_internal/server/features/auctions/og.d.ts +3 -1
- package/dist/_internal/server/features/auctions/og.js +3 -1
- package/dist/_internal/server/features/bundles/actions.js +1 -1
- package/dist/_internal/server/features/business-documents/download.d.ts +41 -0
- package/dist/_internal/server/features/business-documents/download.js +91 -0
- package/dist/_internal/server/features/categories/adapters.d.ts +1 -1
- package/dist/_internal/server/features/categories/adapters.js +10 -0
- package/dist/_internal/server/features/categories/data.js +23 -7
- package/dist/_internal/server/features/checkout/actions.d.ts +14 -0
- package/dist/_internal/server/features/checkout/actions.js +116 -15
- package/dist/_internal/server/features/checkout/bundle-expansion.js +17 -0
- package/dist/_internal/server/features/checkout/data.d.ts +37 -0
- package/dist/_internal/server/features/checkout/data.js +20 -3
- package/dist/_internal/server/features/checkout/group-rule-revalidation.d.ts +34 -0
- package/dist/_internal/server/features/checkout/group-rule-revalidation.js +124 -0
- package/dist/_internal/server/features/checkout/supplier-identity.d.ts +55 -0
- package/dist/_internal/server/features/checkout/supplier-identity.js +81 -0
- package/dist/_internal/server/features/classified/metadata.js +1 -1
- package/dist/_internal/server/features/classified/og.d.ts +3 -1
- package/dist/_internal/server/features/classified/og.js +3 -1
- package/dist/_internal/server/features/digital-code/metadata.js +1 -1
- package/dist/_internal/server/features/digital-code/og.d.ts +3 -1
- package/dist/_internal/server/features/digital-code/og.js +3 -1
- package/dist/_internal/server/features/digital-code/pool.d.ts +19 -4
- package/dist/_internal/server/features/digital-code/pool.js +19 -4
- package/dist/_internal/server/features/live/metadata.js +1 -1
- package/dist/_internal/server/features/live/og.d.ts +3 -1
- package/dist/_internal/server/features/live/og.js +3 -1
- package/dist/_internal/server/features/lottery/actions.js +9 -1
- package/dist/_internal/server/features/lottery/og.d.ts +40 -0
- package/dist/_internal/server/features/lottery/og.js +79 -0
- package/dist/_internal/server/features/messages/actions.js +5 -1
- package/dist/_internal/server/features/offers/adapters.js +17 -3
- package/dist/_internal/server/features/orders/actions.js +7 -2
- package/dist/_internal/server/features/parts/og.js +1 -1
- package/dist/_internal/server/features/pre-orders/og.d.ts +3 -1
- package/dist/_internal/server/features/pre-orders/og.js +3 -1
- package/dist/_internal/server/features/price-index/search.d.ts +18 -0
- package/dist/_internal/server/features/price-index/search.js +47 -7
- package/dist/_internal/server/features/prize-draws/og.d.ts +3 -1
- package/dist/_internal/server/features/prize-draws/og.js +3 -1
- package/dist/_internal/server/features/products/group-members.d.ts +26 -0
- package/dist/_internal/server/features/products/group-members.js +7 -1
- package/dist/_internal/server/features/products/og.d.ts +3 -1
- package/dist/_internal/server/features/products/og.js +3 -1
- package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
- package/dist/_internal/server/features/raffle/actions.js +25 -0
- package/dist/_internal/server/features/reviews/actions.js +1 -1
- package/dist/_internal/server/features/reviews/data.d.ts +1 -1
- package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
- package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
- package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
- package/dist/_internal/server/features/search/index-build/build.js +285 -0
- package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
- package/dist/_internal/server/features/search/index-build/sources.js +385 -0
- package/dist/_internal/server/features/search/scoped-sources.d.ts +26 -0
- package/dist/_internal/server/features/search/scoped-sources.js +252 -0
- package/dist/_internal/server/features/search/search-everything.d.ts +57 -0
- package/dist/_internal/server/features/search/search-everything.js +70 -20
- package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
- package/dist/_internal/server/features/search/search-sources.js +142 -7
- package/dist/_internal/server/features/seo/robots.js +21 -1
- package/dist/_internal/server/features/seo/sitemap.js +7 -1
- package/dist/_internal/server/features/shared/listing-adapters.js +4 -2
- package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
- package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
- package/dist/_internal/server/features/site-settings/adapters.js +26 -0
- package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
- package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
- package/dist/_internal/server/features/sticker-trace/adapters.d.ts +91 -0
- package/dist/_internal/server/features/sticker-trace/adapters.js +175 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
- package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
- package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
- package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
- package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
- package/dist/_internal/server/features/sticker-trace/promote-to-listings.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/promote-to-listings.js +264 -0
- package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
- package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
- package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
- package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +143 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.js +311 -0
- package/dist/_internal/server/features/sticker-trace/storage.d.ts +154 -0
- package/dist/_internal/server/features/sticker-trace/storage.js +301 -0
- package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
- package/dist/_internal/server/features/stores/adapters.js +16 -0
- package/dist/_internal/server/features/stores/index.d.ts +1 -0
- package/dist/_internal/server/features/stores/index.js +1 -0
- package/dist/_internal/server/features/stores/tabs.d.ts +25 -0
- package/dist/_internal/server/features/stores/tabs.js +122 -0
- package/dist/_internal/server/functions/scheduled.d.ts +2 -1
- package/dist/_internal/server/functions/scheduled.js +25 -1
- package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
- package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
- package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
- package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
- package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
- package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
- package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
- package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
- package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
- package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
- package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
- package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
- package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
- package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
- package/dist/_internal/server/jobs/core/promotions.js +7 -4
- package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
- package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
- package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
- package/dist/_internal/server/jobs/handlers/index.js +1 -0
- package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
- package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
- package/dist/_internal/shared/actions/action-registry.js +29 -0
- package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
- package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
- package/dist/_internal/shared/checkout/rules/_defaults.js +0 -2
- package/dist/_internal/shared/checkout/rules/_limits.d.ts +14 -1
- package/dist/_internal/shared/checkout/rules/_limits.js +14 -1
- package/dist/_internal/shared/checkout/rules/_registry.js +2 -0
- package/dist/_internal/shared/checkout/rules/auction.rule.js +9 -1
- package/dist/_internal/shared/checkout/rules/bundle.rule.js +13 -0
- package/dist/_internal/shared/checkout/rules/index.d.ts +2 -0
- package/dist/_internal/shared/checkout/rules/index.js +9 -0
- package/dist/_internal/shared/checkout/rules/offer.rule.js +0 -1
- package/dist/_internal/shared/checkout/rules/payment-gate.d.ts +26 -0
- package/dist/_internal/shared/checkout/rules/payment-gate.js +133 -0
- package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +29 -8
- package/dist/_internal/shared/checkout/rules/spares.rule.d.ts +16 -0
- package/dist/_internal/shared/checkout/rules/spares.rule.js +5 -0
- package/dist/_internal/shared/checkout/rules/types.d.ts +26 -2
- package/dist/_internal/shared/config/schema.d.ts +122 -0
- package/dist/_internal/shared/features/cart/schema.js +3 -2
- package/dist/_internal/shared/features/events/config.d.ts +14 -0
- package/dist/_internal/shared/features/events/config.js +14 -0
- package/dist/_internal/shared/features/notifications/action-url.js +8 -0
- package/dist/_internal/shared/features/products/group-rules.d.ts +75 -0
- package/dist/_internal/shared/features/products/group-rules.js +142 -0
- package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
- package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
- package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
- package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
- package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
- package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
- package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
- package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +35 -0
- package/dist/_internal/shared/listing-types/_registry.js +39 -1
- package/dist/_internal/shared/listing-types/art/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/art/config.js +3 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/auction/config.js +3 -0
- package/dist/_internal/shared/listing-types/availability.js +48 -0
- package/dist/_internal/shared/listing-types/capabilities.js +19 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/classified/config.js +3 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +3 -0
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
- package/dist/_internal/shared/listing-types/feature-flags.js +10 -0
- package/dist/_internal/shared/listing-types/live/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/live/config.js +3 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +3 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +3 -0
- package/dist/_internal/shared/listing-types/spares/config.d.ts +74 -0
- package/dist/_internal/shared/listing-types/spares/config.js +60 -0
- package/dist/_internal/shared/listing-types/spares/ctas.d.ts +1 -0
- package/dist/_internal/shared/listing-types/spares/ctas.js +4 -0
- package/dist/_internal/shared/listing-types/spares/og.js +1 -0
- package/dist/_internal/shared/listing-types/spares/schema.d.ts +2 -0
- package/dist/_internal/shared/listing-types/spares/schema.js +3 -0
- package/dist/_internal/shared/listing-types/spares/seed-factory.d.ts +1 -0
- package/dist/_internal/shared/listing-types/spares/seed-factory.js +1 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/standard/config.js +3 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +3 -0
- package/dist/_internal/shared/media/limits.d.ts +12 -2
- package/dist/_internal/shared/media/limits.js +12 -2
- package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
- package/dist/_internal/shared/search/artifact-url.js +119 -0
- package/dist/_internal/shared/search/index-record.d.ts +68 -0
- package/dist/_internal/shared/search/index-record.js +96 -0
- package/dist/_internal/shared/search/match.d.ts +76 -0
- package/dist/_internal/shared/search/match.js +264 -0
- package/dist/_internal/shared/search/to-groups.d.ts +52 -0
- package/dist/_internal/shared/search/to-groups.js +141 -0
- package/dist/client.d.ts +16 -9
- package/dist/client.js +16 -6
- package/dist/configs/eslint.js +22 -2
- package/dist/constants/api-endpoints.d.ts +107 -15
- package/dist/constants/api-endpoints.js +60 -5
- package/dist/constants/cache-invalidation.js +3 -1
- package/dist/constants/field-names.d.ts +13 -1
- package/dist/constants/field-names.js +42 -1
- package/dist/contracts/repository.d.ts +8 -7
- package/dist/contracts/search.d.ts +2 -2
- package/dist/contracts/table.d.ts +3 -3
- package/dist/contracts/table.js +3 -3
- package/dist/core/contact-submissions.repository.js +2 -2
- package/dist/core/integration-keys.js +7 -1
- package/dist/core/newsletter.repository.js +2 -2
- package/dist/core/site-config.js +1 -1
- package/dist/errors/error-codes.d.ts +30 -0
- package/dist/errors/error-codes.js +30 -0
- package/dist/errors/error-display-map.js +40 -1
- package/dist/features/about/components/PolicyPageView.d.ts +22 -2
- package/dist/features/about/components/PolicyPageView.js +14 -2
- package/dist/features/about/components/PublicProfileView.js +2 -1
- package/dist/features/about/components/ShippingPolicyView.js +42 -2
- package/dist/features/account/api/[userId]/addresses/route.js +1 -1
- package/dist/features/account/components/NotificationBell.js +1 -1
- package/dist/features/account/components/UserBidsView.js +1 -1
- package/dist/features/account/components/index.d.ts +0 -8
- package/dist/features/account/components/index.js +0 -4
- package/dist/features/account/hooks/useProfileStats.js +5 -1
- package/dist/features/addresses/repository/addresses.repository.d.ts +33 -6
- package/dist/features/addresses/repository/addresses.repository.js +86 -9
- package/dist/features/addresses/schemas/firestore.d.ts +17 -6
- package/dist/features/admin/actions/admin-actions.js +16 -1
- package/dist/features/admin/actions/notification-actions.js +15 -6
- package/dist/features/admin/api/bids/route.js +1 -1
- package/dist/features/admin/api/coupons/route.js +1 -1
- package/dist/features/admin/api/products/route.js +1 -1
- package/dist/features/admin/api/reviews/route.js +1 -1
- package/dist/features/admin/components/AdminAdEditorView.js +19 -5
- package/dist/features/admin/components/AdminAuditLogView.js +1 -1
- package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
- package/dist/features/admin/components/AdminBlogView.js +1 -1
- package/dist/features/admin/components/AdminBrandsView.js +17 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +19 -3
- package/dist/features/admin/components/AdminContactView.js +1 -1
- package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
- package/dist/features/admin/components/AdminNavigationView.js +1 -1
- package/dist/features/admin/components/AdminNewsletterView.js +1 -1
- package/dist/features/admin/components/AdminOrdersView.js +9 -2
- package/dist/features/admin/components/AdminPageHeader.js +1 -1
- package/dist/features/admin/components/AdminPayoutsView.js +1 -1
- package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
- package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
- package/dist/features/admin/components/AdminProductEditorView.js +41 -39
- package/dist/features/admin/components/AdminProductsView.js +10 -3
- package/dist/features/admin/components/AdminScammersView.js +1 -1
- package/dist/features/admin/components/AdminSectionsView.js +21 -5
- package/dist/features/admin/components/AdminSessionsView.js +1 -1
- package/dist/features/admin/components/AdminSidebar.js +1 -1
- package/dist/features/admin/components/AdminSiteSettingsView.js +39 -8
- package/dist/features/admin/components/AdminSparesView.d.ts +12 -0
- package/dist/features/admin/components/AdminSparesView.js +30 -0
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
- package/dist/features/admin/components/AdminTeamView.js +1 -1
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
- package/dist/features/admin/components/AdminUsersView.js +10 -8
- package/dist/features/admin/components/DataListingView.d.ts +2 -1
- package/dist/features/admin/components/DataListingView.js +9 -4
- package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
- package/dist/features/admin/components/index.d.ts +2 -0
- package/dist/features/admin/components/index.js +1 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.js +7 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +3 -0
- package/dist/features/admin/constants/filter-tabs.js +1 -0
- package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
- package/dist/features/admin/repository/site-settings.repository.js +8 -3
- package/dist/features/admin/schemas/firestore.d.ts +88 -3
- package/dist/features/admin/schemas/firestore.js +32 -0
- package/dist/features/admin/types/index.d.ts +1 -1
- package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
- package/dist/features/auctions/actions/bid-actions.js +16 -4
- package/dist/features/auctions/api/route.js +1 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
- package/dist/features/auctions/components/AuctionDetailPageView.js +4 -11
- package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
- package/dist/features/auctions/repository/bid.repository.js +114 -13
- package/dist/features/auctions/schemas/firestore.d.ts +24 -4
- package/dist/features/auctions/schemas/firestore.js +1 -0
- package/dist/features/auth/actions/profile-actions.js +30 -4
- package/dist/features/auth/components/index.d.ts +0 -1
- package/dist/features/auth/components/index.js +0 -1
- package/dist/features/auth/repository/session.repository.d.ts +17 -3
- package/dist/features/auth/repository/session.repository.js +46 -5
- package/dist/features/auth/repository/token.repository.d.ts +27 -4
- package/dist/features/auth/repository/token.repository.js +65 -11
- package/dist/features/auth/repository/user.repository.d.ts +46 -7
- package/dist/features/auth/repository/user.repository.js +128 -15
- package/dist/features/auth/schemas/firestore.d.ts +65 -12
- package/dist/features/auth/schemas/firestore.js +13 -0
- package/dist/features/before-after/api/route.js +1 -1
- package/dist/features/blog/components/BlogListView.js +16 -3
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/blog/schemas/index.d.ts +2 -2
- package/dist/features/business-documents/repository/business-documents.repository.d.ts +58 -0
- package/dist/features/business-documents/repository/business-documents.repository.js +54 -0
- package/dist/features/business-documents/schemas/firestore.d.ts +105 -0
- package/dist/features/business-documents/schemas/firestore.js +75 -0
- package/dist/features/cart/actions/cart-actions.js +83 -6
- package/dist/features/cart/api/route.js +1 -1
- package/dist/features/cart/repository/cart.repository.js +32 -4
- package/dist/features/cart/schemas/firestore.d.ts +20 -0
- package/dist/features/cart/schemas/index.d.ts +2 -2
- package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +1 -1
- package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
- package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
- package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
- package/dist/features/categories/api/[id]/price-guidance/route.d.ts +42 -0
- package/dist/features/categories/api/[id]/price-guidance/route.js +113 -0
- package/dist/features/categories/api/route.js +10 -10
- package/dist/features/categories/components/BrandDetailPageView.js +19 -3
- package/dist/features/categories/components/BrandDetailTabs.js +10 -0
- package/dist/features/categories/components/CategoriesIndexListing.js +23 -8
- package/dist/features/categories/components/CategoryDetailPageView.js +170 -13
- package/dist/features/categories/components/CategoryDetailTabs.js +12 -0
- package/dist/features/categories/components/CategoryGrid.js +10 -1
- package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
- package/dist/features/categories/components/PriceGuidanceHint.d.ts +29 -0
- package/dist/features/categories/components/PriceGuidanceHint.js +61 -0
- package/dist/features/categories/components/SubcategoryCardRow.d.ts +27 -0
- package/dist/features/categories/components/SubcategoryCardRow.js +98 -0
- package/dist/features/categories/components/index.d.ts +0 -2
- package/dist/features/categories/components/index.js +0 -1
- package/dist/features/categories/constants/category-tabs.d.ts +20 -25
- package/dist/features/categories/constants/category-tabs.js +22 -39
- package/dist/features/categories/repository/categories.repository.d.ts +13 -0
- package/dist/features/categories/repository/categories.repository.js +51 -1
- package/dist/features/categories/schemas/firestore.d.ts +22 -1
- package/dist/features/categories/schemas/firestore.js +10 -0
- package/dist/features/categories/schemas/index.d.ts +8 -2
- package/dist/features/categories/schemas/index.js +2 -0
- package/dist/features/categories/types/index.d.ts +8 -0
- package/dist/features/categories/utils/taxonomy-visual.d.ts +34 -0
- package/dist/features/categories/utils/taxonomy-visual.js +74 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
- package/dist/features/classified/components/ClassifiedDetailPageView.js +4 -9
- package/dist/features/collections/api/[slug]/route.js +3 -3
- package/dist/features/collections/api/route.js +1 -1
- package/dist/features/consultation/api/route.js +1 -1
- package/dist/features/consultation/repository/consultations.repository.js +1 -1
- package/dist/features/consultation/types/index.d.ts +1 -1
- package/dist/features/contact/components/ContactForm.js +1 -3
- package/dist/features/contact/components/ContactPageView.d.ts +33 -1
- package/dist/features/contact/components/ContactPageView.js +58 -28
- package/dist/features/corporate/api/route.js +1 -1
- package/dist/features/corporate/repository/corporate.repository.js +1 -1
- package/dist/features/corporate/types/index.d.ts +1 -1
- package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
- package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
- package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -9
- package/dist/features/events/actions/event-actions.d.ts +14 -0
- package/dist/features/events/actions/event-actions.js +82 -3
- package/dist/features/events/api/[id]/route.js +2 -2
- package/dist/features/events/components/AdminEventEditorView.js +22 -3
- package/dist/features/events/components/AdminEventsView.js +32 -8
- package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
- package/dist/features/events/components/EventRafflesSection.js +52 -3
- package/dist/features/events/components/SpinWheelView.d.ts +2 -2
- package/dist/features/events/components/SpinWheelView.js +41 -4
- package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
- package/dist/features/events/repository/event-entry.repository.js +41 -7
- package/dist/features/events/schemas/firestore.d.ts +17 -4
- package/dist/features/events/types/index.d.ts +37 -0
- package/dist/features/faq/repository/faqs.repository.js +1 -1
- package/dist/features/faq/schemas/index.d.ts +5 -2
- package/dist/features/faq/schemas/index.js +6 -0
- package/dist/features/faq/types/index.d.ts +0 -1
- package/dist/features/grouped/components/GroupedListingDetailView.js +9 -1
- package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
- package/dist/features/grouped/schemas/firestore.d.ts +5 -0
- package/dist/features/homepage/actions/homepage-section-actions.d.ts +3 -3
- package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
- package/dist/features/homepage/api/carousel/route.js +4 -4
- package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
- package/dist/features/homepage/components/AnnouncementBar.js +13 -19
- package/dist/features/homepage/components/CollectionCardsSection.d.ts +28 -6
- package/dist/features/homepage/components/CollectionCardsSection.js +43 -8
- package/dist/features/homepage/components/HowItWorksSection.d.ts +23 -6
- package/dist/features/homepage/components/HowItWorksSection.js +4 -4
- package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
- package/dist/features/homepage/components/PromoGrid.d.ts +31 -2
- package/dist/features/homepage/components/PromoGrid.js +12 -3
- package/dist/features/homepage/components/TestimonialsCarousel.d.ts +34 -2
- package/dist/features/homepage/components/TestimonialsCarousel.js +1 -1
- package/dist/features/homepage/components/index.d.ts +0 -22
- package/dist/features/homepage/components/index.js +0 -12
- package/dist/features/homepage/index.d.ts +0 -2
- package/dist/features/homepage/index.js +0 -2
- package/dist/features/homepage/lib/section-renderer.d.ts +9 -0
- package/dist/features/homepage/lib/section-renderer.js +202 -58
- package/dist/features/homepage/repository/homepage-sections.repository.d.ts +35 -3
- package/dist/features/homepage/repository/homepage-sections.repository.js +58 -8
- package/dist/features/homepage/schemas/firestore.d.ts +112 -3
- package/dist/features/homepage/schemas/firestore.js +32 -2
- package/dist/features/homepage/schemas/index.d.ts +46 -17
- package/dist/features/homepage/schemas/index.js +39 -27
- package/dist/features/homepage/server.d.ts +0 -3
- package/dist/features/homepage/server.js +0 -3
- package/dist/features/homepage/types/index.d.ts +0 -47
- package/dist/features/homepage/types/index.js +49 -0
- package/dist/features/layout/AppLayoutShell.d.ts +11 -0
- package/dist/features/layout/AppLayoutShell.js +65 -13
- package/dist/features/layout/BottomActionsContext.d.ts +16 -0
- package/dist/features/layout/BottomActionsContext.js +5 -0
- package/dist/features/layout/BottomChrome.js +48 -9
- package/dist/features/layout/BottomNavItem.js +1 -1
- package/dist/features/layout/BottomNavbar.d.ts +14 -0
- package/dist/features/layout/BottomNavbar.js +43 -3
- package/dist/features/layout/BottomSheet.js +1 -1
- package/dist/features/layout/MainNavbar.d.ts +11 -0
- package/dist/features/layout/NavbarLayout.d.ts +3 -0
- package/dist/features/layout/NavbarLayout.js +88 -11
- package/dist/features/layout/SideActionDock.d.ts +1 -0
- package/dist/features/layout/SideActionDock.js +219 -0
- package/dist/features/layout/TitleBarLayout.js +1 -1
- package/dist/features/layout/cta-anchor.d.ts +31 -0
- package/dist/features/layout/cta-anchor.js +31 -0
- package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
- package/dist/features/layout/hooks/useBottomActions.js +6 -1
- package/dist/features/layout/index.d.ts +9 -1
- package/dist/features/layout/index.js +9 -1
- package/dist/features/layout/useCtaReveal.d.ts +24 -0
- package/dist/features/layout/useCtaReveal.js +82 -0
- package/dist/features/layout/useHoldToOpen.d.ts +41 -0
- package/dist/features/layout/useHoldToOpen.js +84 -0
- package/dist/features/live/components/LiveItemDetailPageView.js +4 -9
- package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
- package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
- package/dist/features/lottery/schemas/firestore.d.ts +33 -5
- package/dist/features/loyalty/api/balance/route.js +1 -1
- package/dist/features/loyalty/api/history/route.js +1 -1
- package/dist/features/media/MediaImage.js +0 -1
- package/dist/features/media/MediaPickerModal.js +7 -1
- package/dist/features/media/hooks/useMedia.js +17 -0
- package/dist/features/media/modals/ImageEditor.js +5 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
- package/dist/features/media/repository/media-assets.repository.d.ts +65 -0
- package/dist/features/media/repository/media-assets.repository.js +31 -0
- package/dist/features/media/trust-signals.d.ts +85 -0
- package/dist/features/media/trust-signals.js +126 -0
- package/dist/features/media/upload/CameraCapture.js +16 -1
- package/dist/features/media/upload/ImageUpload.js +42 -4
- package/dist/features/media/upload/MediaUploadField.js +69 -13
- package/dist/features/media/upload/downscale-image.d.ts +56 -0
- package/dist/features/media/upload/downscale-image.js +150 -0
- package/dist/features/messages/components/ConversationThreadView.js +45 -2
- package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
- package/dist/features/messages/components/MessageSellerButton.js +10 -2
- package/dist/features/messages/schemas/firestore.d.ts +15 -0
- package/dist/features/orders/hooks/useOrders.js +4 -2
- package/dist/features/orders/repository/orders.repository.d.ts +15 -4
- package/dist/features/orders/repository/orders.repository.js +52 -20
- package/dist/features/orders/schemas/firestore.d.ts +15 -4
- package/dist/features/orders/schemas/index.d.ts +8 -8
- package/dist/features/orders/types/index.d.ts +2 -2
- package/dist/features/parts/components/PartDetailPageView.d.ts +14 -1
- package/dist/features/parts/components/PartDetailPageView.js +2 -2
- package/dist/features/parts/components/PartsIndexPageView.d.ts +11 -2
- package/dist/features/parts/components/PartsIndexPageView.js +2 -2
- package/dist/features/parts/components/PartsSearchBox.d.ts +9 -0
- package/dist/features/parts/components/PartsSearchBox.js +57 -0
- package/dist/features/parts/schemas/firestore.d.ts +149 -3
- package/dist/features/parts/schemas/firestore.js +184 -0
- package/dist/features/payments/repository/payments.repository.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +38 -6
- package/dist/features/payments/repository/payout.repository.js +84 -23
- package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
- package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
- package/dist/features/payments/schemas/firestore.d.ts +14 -3
- package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
- package/dist/features/pre-orders/api/[slug]/route.js +1 -1
- package/dist/features/pre-orders/api/admin/route.js +1 -1
- package/dist/features/pre-orders/api/route.js +1 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -11
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
- package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
- package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
- package/dist/features/price-index/components/PriceIndexToolView.d.ts +3 -1
- package/dist/features/price-index/components/PriceIndexToolView.js +92 -13
- package/dist/features/products/api/[id]/route.js +1 -1
- package/dist/features/products/components/CompareOverlay.d.ts +18 -1
- package/dist/features/products/components/CompareOverlay.js +21 -2
- package/dist/features/products/components/CustomSectionTabContent.d.ts +31 -0
- package/dist/features/products/components/CustomSectionTabContent.js +29 -3
- package/dist/features/products/components/GroupMemberPicker.d.ts +19 -1
- package/dist/features/products/components/GroupMemberPicker.js +46 -8
- package/dist/features/products/components/GroupSettingsPanel.d.ts +11 -1
- package/dist/features/products/components/GroupSettingsPanel.js +91 -3
- package/dist/features/products/components/ListingBottomActions.js +4 -0
- package/dist/features/products/components/PrizeDrawDetailPageView.js +1 -1
- package/dist/features/products/components/PrizeDrawEntryActions.d.ts +15 -1
- package/dist/features/products/components/PrizeDrawEntryActions.js +70 -8
- package/dist/features/products/components/ProductDetailPageView.js +75 -15
- package/dist/features/products/components/ProductForm.d.ts +13 -1
- package/dist/features/products/components/ProductForm.js +16 -2
- package/dist/features/products/components/ProductGalleryClient.js +2 -2
- package/dist/features/products/components/ProductGrid.js +12 -1
- package/dist/features/products/components/ProductsIndexListing.d.ts +16 -1
- package/dist/features/products/components/ProductsIndexListing.js +3 -3
- package/dist/features/products/components/ShowGroupSection.js +15 -2
- package/dist/features/products/components/SparesListView.d.ts +7 -0
- package/dist/features/products/components/SparesListView.js +39 -0
- package/dist/features/products/components/index.d.ts +0 -2
- package/dist/features/products/components/index.js +0 -1
- package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
- package/dist/features/products/config/listing-type-listing-config.js +27 -2
- package/dist/features/products/constants/action-defs.d.ts +1 -0
- package/dist/features/products/constants/action-defs.js +1 -0
- package/dist/features/products/constants/listing-tabs.d.ts +9 -0
- package/dist/features/products/constants/listing-tabs.js +3 -2
- package/dist/features/products/hooks/useProducts.js +2 -2
- package/dist/features/products/repository/products.repository.d.ts +98 -0
- package/dist/features/products/repository/products.repository.js +248 -18
- package/dist/features/products/schemas/firestore.d.ts +97 -4
- package/dist/features/products/schemas/firestore.js +104 -0
- package/dist/features/products/schemas/index.d.ts +12 -21
- package/dist/features/products/schemas/index.js +23 -6
- package/dist/features/products/types/index.d.ts +46 -2
- package/dist/features/products/utils/group-member-image.d.ts +39 -0
- package/dist/features/products/utils/group-member-image.js +3 -0
- package/dist/features/products/utils/listing-badge-variant.js +4 -0
- package/dist/features/promotions/api/route.js +1 -1
- package/dist/features/reviews/actions/review-actions.d.ts +6 -6
- package/dist/features/reviews/actions/review-actions.js +22 -8
- package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
- package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
- package/dist/features/reviews/components/ReviewsList.js +1 -1
- package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
- package/dist/features/reviews/repository/reviews.repository.js +63 -12
- package/dist/features/reviews/schemas/firestore.d.ts +13 -2
- package/dist/features/reviews/schemas/index.d.ts +2 -2
- package/dist/features/scams/actions/scam-actions.js +16 -4
- package/dist/features/scams/components/ScamProfileView.js +1 -1
- package/dist/features/search/components/EntityTypeahead.d.ts +44 -0
- package/dist/features/search/components/EntityTypeahead.js +92 -0
- package/dist/features/search/components/Search.d.ts +12 -1
- package/dist/features/search/components/Search.js +47 -3
- package/dist/features/search/components/SearchFacetRail.d.ts +11 -0
- package/dist/features/search/components/SearchFacetRail.js +92 -0
- package/dist/features/search/components/SearchResultsClient.d.ts +33 -0
- package/dist/features/search/components/SearchResultsClient.js +103 -0
- package/dist/features/search/components/SearchResultsPageView.d.ts +15 -1
- package/dist/features/search/components/SearchResultsPageView.js +3 -2
- package/dist/features/search/components/index.d.ts +0 -6
- package/dist/features/search/components/index.js +0 -3
- package/dist/features/search/hooks/useNavSuggestions.d.ts +13 -0
- package/dist/features/search/hooks/useScopedSearch.d.ts +34 -0
- package/dist/features/search/hooks/useScopedSearch.js +114 -0
- package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
- package/dist/features/search/hooks/useSearchIndex.js +172 -0
- package/dist/features/search/hooks/useSiteSearch.d.ts +26 -0
- package/dist/features/search/hooks/useSiteSearch.js +149 -0
- package/dist/features/search/index.d.ts +0 -4
- package/dist/features/search/index.js +0 -4
- package/dist/features/search/manifest.d.ts +12 -0
- package/dist/features/search/manifest.js +17 -2
- package/dist/features/search/server.d.ts +0 -3
- package/dist/features/search/server.js +0 -3
- package/dist/features/seller/actions/offer-actions.d.ts +5 -5
- package/dist/features/seller/actions/offer-actions.js +38 -8
- package/dist/features/seller/actions/seller-actions.js +34 -7
- package/dist/features/seller/api/coupons/route.js +1 -1
- package/dist/features/seller/api/products/route.js +1 -1
- package/dist/features/seller/api/store/route.js +1 -1
- package/dist/features/seller/components/SellerBidsView.js +1 -1
- package/dist/features/seller/components/SellerCouponsView.js +1 -1
- package/dist/features/seller/components/SellerListingTypeView.d.ts +1 -1
- package/dist/features/seller/components/SellerListingTypeView.js +29 -1
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutSettingsView.js +35 -15
- package/dist/features/seller/components/SellerPayoutsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.d.ts +1 -1
- package/dist/features/seller/components/SellerProductShell.js +2 -2
- package/dist/features/seller/components/SellerProductsView.js +1 -1
- package/dist/features/seller/components/SellerShippingView.js +0 -1
- package/dist/features/seller/components/SellerSidebar.js +1 -1
- package/dist/features/seller/components/SellerSparesView.d.ts +17 -0
- package/dist/features/seller/components/SellerSparesView.js +6 -0
- package/dist/features/seller/components/SellerStorefrontView.js +0 -1
- package/dist/features/seller/components/index.d.ts +2 -4
- package/dist/features/seller/components/index.js +1 -2
- package/dist/features/seller/repository/offer.repository.d.ts +15 -3
- package/dist/features/seller/repository/offer.repository.js +43 -7
- package/dist/features/seller/schemas/firestore.d.ts +14 -3
- package/dist/features/seller/schemas/index.d.ts +4 -4
- package/dist/features/seller/schemas/order-forms.d.ts +39 -0
- package/dist/features/seller/schemas/order-forms.js +37 -0
- package/dist/features/shell/CommandPalette.js +1 -1
- package/dist/features/shell/FormShell.js +6 -2
- package/dist/features/shell/QuickFormDrawer.js +15 -1
- package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
- package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
- package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
- package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
- package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
- package/dist/features/sticker-trace/constants/help-content.js +172 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
- package/dist/features/sticker-trace/schemas/firestore.d.ts +267 -0
- package/dist/features/sticker-trace/schemas/firestore.js +79 -0
- package/dist/features/sticker-trace/server.d.ts +8 -0
- package/dist/features/sticker-trace/server.js +51 -0
- package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
- package/dist/features/stores/actions/store-query-actions.js +7 -2
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/route.js +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.js +7 -82
- package/dist/features/stores/components/StoreHeader.js +1 -2
- package/dist/features/stores/components/StoreNavTabs.js +17 -2
- package/dist/features/stores/components/StoreSparesPageView.d.ts +27 -0
- package/dist/features/stores/components/StoreSparesPageView.js +48 -0
- package/dist/features/stores/manifest.js +8 -4
- package/dist/features/stores/schemas/firestore.d.ts +19 -0
- package/dist/features/support/repository/support.repository.d.ts +14 -3
- package/dist/features/support/repository/support.repository.js +93 -13
- package/dist/features/support/schemas/firestore.d.ts +16 -5
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +96 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +4 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +478 -0
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +54 -32
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +3 -2
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +73 -0
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +340 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
- package/dist/features/tester/seed-data/authored/index.js +24 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +1 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +57 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +77 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +58 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +284 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +558 -34
- package/dist/index.d.ts +27 -80
- package/dist/index.js +62 -115
- package/dist/next/api/routeHandler.js +9 -0
- package/dist/next/routing/require-record.d.ts +13 -0
- package/dist/next/routing/require-record.js +62 -0
- package/dist/next/routing/route-map.d.ts +46 -5
- package/dist/next/routing/route-map.js +70 -3
- package/dist/providers/db-firebase/base.d.ts +4 -2
- package/dist/providers/db-firebase/base.js +21 -5
- package/dist/providers/db-firebase/base.repository.d.ts +33 -9
- package/dist/providers/db-firebase/base.repository.js +55 -0
- package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
- package/dist/providers/db-firebase/rtdb-paths.js +12 -0
- package/dist/react/ErrorBoundary.js +6 -1
- package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
- package/dist/react/hooks/realtime-event-constants.js +8 -0
- package/dist/react/hooks/useEntityDelete.js +5 -1
- package/dist/react/hooks/useMessage.js +5 -1
- package/dist/repositories/index.d.ts +2 -2
- package/dist/repositories/index.js +6 -1
- package/dist/schemas/registry.d.ts +28 -26
- package/dist/schemas/registry.js +31 -14
- package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
- package/dist/security/blind-index-tokens.d.ts +54 -0
- package/dist/security/blind-index-tokens.js +152 -0
- package/dist/security/encrypted.d.ts +117 -0
- package/dist/security/encrypted.js +100 -0
- package/dist/security/index.d.ts +6 -3
- package/dist/security/index.js +17 -3
- package/dist/security/pii-accessors.d.ts +71 -0
- package/dist/security/pii-accessors.js +150 -0
- package/dist/security/pii-encrypt.d.ts +0 -8
- package/dist/security/pii-encrypt.js +22 -15
- package/dist/security/pii-mask.d.ts +18 -0
- package/dist/security/pii-mask.js +27 -0
- package/dist/security/settings-encryption.d.ts +35 -0
- package/dist/security/settings-encryption.js +91 -0
- package/dist/seed/_helpers/brand-rows.js +38 -14
- package/dist/seed/_helpers/category-forest.js +73 -7
- package/dist/seed/_helpers/category-images-generated.d.ts +25 -6
- package/dist/seed/_helpers/category-images-generated.js +81 -6
- package/dist/seed/_helpers/category-models.d.ts +1 -1
- package/dist/seed/_helpers/category-models.js +7 -1
- package/dist/seed/_helpers/category-parts-glossary-map.js +8 -0
- package/dist/seed/_helpers/category-parts.d.ts +1 -1
- package/dist/seed/_helpers/category-parts.js +50 -2
- package/dist/seed/_helpers/character-features.d.ts +1 -1
- package/dist/seed/_helpers/character-features.js +2 -1
- package/dist/seed/_helpers/franchise-rows.js +10 -2
- package/dist/seed/_helpers/media.d.ts +47 -0
- package/dist/seed/_helpers/media.js +34 -0
- package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
- package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
- package/dist/seed/addresses-seed-data.d.ts +2 -2
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +78 -0
- package/dist/seed/authenticity-knowledge-seed-data.js +10729 -0
- package/dist/seed/bids-seed-data.d.ts +2 -2
- package/dist/seed/bids-seed-data.js +23 -2
- package/dist/seed/categories-seed-data.js +124 -20
- package/dist/seed/events-seed-data.d.ts +2 -2
- package/dist/seed/events-seed-data.js +5 -0
- package/dist/seed/faq-seed-data.js +175 -5
- package/dist/seed/grouped-listings-seed-data.js +16 -0
- package/dist/seed/homepage-sections-seed-data.js +131 -26
- package/dist/seed/index.d.ts +3 -3
- package/dist/seed/index.js +3 -2
- package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
- package/dist/seed/manifest.js +3 -0
- package/dist/seed/media-assets-seed-data.d.ts +1 -1
- package/dist/seed/media-assets-seed-data.js +746 -196
- package/dist/seed/model-composition-seed-data.js +122 -6
- package/dist/seed/offers-seed-data.d.ts +2 -2
- package/dist/seed/offers-seed-data.js +1 -1
- package/dist/seed/orders-seed-data.d.ts +2 -2
- package/dist/seed/part-glossary-seed-data.d.ts +1 -1
- package/dist/seed/part-glossary-seed-data.js +37219 -463
- package/dist/seed/payouts-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.js +1 -1
- package/dist/seed/products-art-seed-data.js +7 -18
- package/dist/seed/products-auctions-seed-data.js +56 -47
- package/dist/seed/products-beyblade-x-seed-data.d.ts +2 -0
- package/dist/seed/products-beyblade-x-seed-data.js +441 -0
- package/dist/seed/products-catalogue-seed-data.d.ts +5 -5
- package/dist/seed/products-catalogue-seed-data.js +1500 -1240
- package/dist/seed/products-classifieds-seed-data.js +9 -27
- package/dist/seed/products-digital-codes-seed-data.js +9 -18
- package/dist/seed/products-live-items-seed-data.js +5 -13
- package/dist/seed/products-preorders-seed-data.js +67 -33
- package/dist/seed/products-prize-draws-seed-data.js +8 -17
- package/dist/seed/products-spares-seed-data.d.ts +2 -0
- package/dist/seed/products-spares-seed-data.js +368 -0
- package/dist/seed/products-standard-seed-data.js +39 -126
- package/dist/seed/products-stickers-seed-data.js +59 -15
- package/dist/seed/reviews-seed-data.d.ts +1 -2
- package/dist/seed/seed-purpose.js +7 -0
- package/dist/seed/sessions-seed-data.d.ts +2 -2
- package/dist/seed/sessions-seed-data.js +5 -0
- package/dist/seed/site-settings-seed-data.js +9 -1
- package/dist/seed/support-tickets-seed-data.d.ts +2 -2
- package/dist/seed/support-tickets-seed-data.js +1 -1
- package/dist/seed/users-seed-data.d.ts +2 -2
- package/dist/seed/users-seed-data.js +1 -1
- package/dist/seo/json-ld.d.ts +25 -0
- package/dist/seo/json-ld.js +33 -1
- package/dist/server-entry.d.ts +3 -1
- package/dist/server-entry.js +2 -2
- package/dist/server.d.ts +27 -12
- package/dist/server.js +86 -28
- package/dist/styles.css +438 -1
- package/dist/tailwind-input.css +31 -17
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Accordion.js +1 -1
- package/dist/ui/components/Breadcrumb.js +1 -1
- package/dist/ui/components/Button.js +7 -1
- package/dist/ui/components/DetailPageGallery.js +0 -2
- package/dist/ui/components/DetailPageHero.js +0 -1
- package/dist/ui/components/DetailPageTabs.js +1 -1
- package/dist/ui/components/Divider.js +3 -3
- package/dist/ui/components/FilterChipGroup.d.ts +11 -0
- package/dist/ui/components/FilterChipGroup.js +1 -1
- package/dist/ui/components/GatedPrice.js +5 -1
- package/dist/ui/components/HorizontalScroller.js +1 -1
- package/dist/ui/components/ImageGallery.js +6 -1
- package/dist/ui/components/ListingLayout.js +17 -11
- package/dist/ui/components/MediaTabs.style.css +81 -0
- package/dist/ui/components/OverflowRow.d.ts +92 -0
- package/dist/ui/components/OverflowRow.js +203 -0
- package/dist/ui/components/OverflowRow.style.css +235 -0
- package/dist/ui/components/Pagination.js +1 -1
- package/dist/ui/components/PendingValue.d.ts +45 -0
- package/dist/ui/components/PendingValue.js +7 -0
- package/dist/ui/components/Radio.style.css +119 -0
- package/dist/ui/components/RatingDisplay.js +2 -2
- package/dist/ui/components/RecordDetailModal.js +14 -1
- package/dist/ui/components/RowActionMenu.js +5 -1
- package/dist/ui/components/SettingsSection.js +0 -2
- package/dist/ui/components/SideDrawer.js +5 -1
- package/dist/ui/components/SideModal.js +9 -1
- package/dist/ui/components/SiteLogo.js +3 -0
- package/dist/ui/components/SiteMark.js +3 -0
- package/dist/ui/components/SortDropdown.js +1 -1
- package/dist/ui/components/SpecTable.d.ts +58 -0
- package/dist/ui/components/SpecTable.js +8 -0
- package/dist/ui/components/StarRating.js +1 -3
- package/dist/ui/components/SummaryCard.js +1 -1
- package/dist/ui/components/TabBarShell.d.ts +12 -1
- package/dist/ui/components/TabBarShell.js +3 -2
- package/dist/ui/components/Tabs.js +36 -24
- package/dist/ui/components/Toast.d.ts +3 -24
- package/dist/ui/components/Toast.js +2 -19
- package/dist/ui/components/TopBannerPortal.d.ts +15 -0
- package/dist/ui/components/TopBannerPortal.js +19 -0
- package/dist/ui/components/UnsavedChangesModal.js +5 -1
- package/dist/ui/components/index.style.css +2 -0
- package/dist/ui/components/row-collapse.d.ts +15 -0
- package/dist/ui/components/row-collapse.js +127 -0
- package/dist/ui/components/toast-context.d.ts +63 -0
- package/dist/ui/components/toast-context.js +48 -0
- package/dist/ui/components/top-banner-slot.d.ts +37 -0
- package/dist/ui/components/top-banner-slot.js +45 -0
- package/dist/ui/icons/icon-registry.d.ts +7 -0
- package/dist/ui/icons/icon-registry.js +25 -1
- package/dist/ui/index.d.ts +6 -0
- package/dist/ui/index.js +3 -0
- package/dist/utils/array.helper.d.ts +2 -2
- package/dist/utils/array.helper.js +5 -5
- package/dist/utils/id-generators.d.ts +6 -0
- package/dist/utils/id-generators.js +10 -0
- package/dist/utils/media-url.js +0 -2
- package/dist/utils/search-txt-builders.d.ts +28 -4
- package/dist/utils/search-txt-builders.js +41 -1
- package/dist/utils/search-txt-query.d.ts +12 -0
- package/dist/utils/search-txt-query.js +12 -0
- package/dist/validation/schemas.d.ts +8 -8
- package/package.json +6 -2
- package/scripts/dedupe-peer-deps.mjs +18 -0
- package/scripts/seed-cli.mjs +138 -26
- package/scripts/verify-css-build.mjs +118 -37
- package/dist/_internal/server/features/search/actions.d.ts +0 -7
- package/dist/_internal/server/features/search/actions.js +0 -21
- package/dist/_internal/server/features/search/data.d.ts +0 -15
- package/dist/_internal/server/features/search/data.js +0 -18
- package/dist/_internal/server/features/search/index.d.ts +0 -3
- package/dist/_internal/server/features/search/index.js +0 -2
- package/dist/features/account/components/UserAddressesView.d.ts +0 -13
- package/dist/features/account/components/UserAddressesView.js +0 -5
- package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
- package/dist/features/account/components/UserNotificationsView.js +0 -12
- package/dist/features/account/components/UserSettingsView.d.ts +0 -16
- package/dist/features/account/components/UserSettingsView.js +0 -13
- package/dist/features/account/components/UserSupportView.d.ts +0 -3
- package/dist/features/account/components/UserSupportView.js +0 -166
- package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
- package/dist/features/admin/components/DemoSeedView.js +0 -5
- package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
- package/dist/features/auth/components/AuthStatusPanel.js +0 -22
- package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
- package/dist/features/categories/components/CategoryProductsView.js +0 -21
- package/dist/features/homepage/api/[id]/route.d.ts +0 -23
- package/dist/features/homepage/api/[id]/route.js +0 -103
- package/dist/features/homepage/api/route.d.ts +0 -14
- package/dist/features/homepage/api/route.js +0 -140
- package/dist/features/homepage/api/sections/[id]/route.d.ts +0 -26
- package/dist/features/homepage/api/sections/[id]/route.js +0 -95
- package/dist/features/homepage/api/sections/route.d.ts +0 -13
- package/dist/features/homepage/api/sections/route.js +0 -82
- package/dist/features/homepage/components/AdvertisementBanner.d.ts +0 -14
- package/dist/features/homepage/components/AdvertisementBanner.js +0 -35
- package/dist/features/homepage/components/BeforeAfterCard.d.ts +0 -9
- package/dist/features/homepage/components/BeforeAfterCard.js +0 -73
- package/dist/features/homepage/components/FeaturedResultsSection.d.ts +0 -17
- package/dist/features/homepage/components/FeaturedResultsSection.js +0 -17
- package/dist/features/homepage/components/HeroBanner.d.ts +0 -7
- package/dist/features/homepage/components/HeroBanner.js +0 -43
- package/dist/features/homepage/components/HeroSection.d.ts +0 -7
- package/dist/features/homepage/components/HeroSection.js +0 -6
- package/dist/features/homepage/components/HomepageSkeleton.d.ts +0 -2
- package/dist/features/homepage/components/HomepageSkeleton.js +0 -21
- package/dist/features/homepage/components/HomepageView.d.ts +0 -25
- package/dist/features/homepage/components/HomepageView.js +0 -5
- package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
- package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
- package/dist/features/homepage/components/NewsletterBanner.d.ts +0 -23
- package/dist/features/homepage/components/NewsletterBanner.js +0 -37
- package/dist/features/homepage/components/SiteFeaturesSection.d.ts +0 -14
- package/dist/features/homepage/components/SiteFeaturesSection.js +0 -11
- package/dist/features/homepage/components/TrustBadges.d.ts +0 -6
- package/dist/features/homepage/components/TrustBadges.js +0 -46
- package/dist/features/homepage/components/TrustIndicatorsSection.d.ts +0 -12
- package/dist/features/homepage/components/TrustIndicatorsSection.js +0 -11
- package/dist/features/homepage/hooks/useHomepage.d.ts +0 -11
- package/dist/features/homepage/hooks/useHomepage.js +0 -17
- package/dist/features/homepage/hooks/useHomepageSections.d.ts +0 -2
- package/dist/features/homepage/hooks/useHomepageSections.js +0 -10
- package/dist/features/homepage/repository/homepage.repository.d.ts +0 -11
- package/dist/features/homepage/repository/homepage.repository.js +0 -25
- package/dist/features/layout/BottomActions.d.ts +0 -1
- package/dist/features/layout/BottomActions.js +0 -311
- package/dist/features/products/components/ProductsView.d.ts +0 -6
- package/dist/features/products/components/ProductsView.js +0 -5
- package/dist/features/search/actions/index.d.ts +0 -1
- package/dist/features/search/actions/index.js +0 -1
- package/dist/features/search/actions/search-actions.d.ts +0 -18
- package/dist/features/search/actions/search-actions.js +0 -43
- package/dist/features/search/api/route.d.ts +0 -22
- package/dist/features/search/api/route.js +0 -128
- package/dist/features/search/columns/index.d.ts +0 -17
- package/dist/features/search/columns/index.js +0 -49
- package/dist/features/search/components/SearchFiltersRow.d.ts +0 -22
- package/dist/features/search/components/SearchFiltersRow.js +0 -21
- package/dist/features/search/components/SearchResultsSection.d.ts +0 -53
- package/dist/features/search/components/SearchResultsSection.js +0 -35
- package/dist/features/search/components/SearchView.d.ts +0 -27
- package/dist/features/search/components/SearchView.js +0 -8
- package/dist/features/search/hooks/useSearch.d.ts +0 -21
- package/dist/features/search/hooks/useSearch.js +0 -33
- package/dist/features/search/repository/search.repository.d.ts +0 -14
- package/dist/features/search/repository/search.repository.js +0 -59
- package/dist/features/search/schemas/index.d.ts +0 -70
- package/dist/features/search/schemas/index.js +0 -36
- package/dist/features/search/types/index.d.ts +0 -48
- package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
- package/dist/features/seller/components/SellerStoreView.js +0 -8
- package/dist/features/stores/components/StoreScopedSearch.d.ts +0 -17
- package/dist/features/stores/components/StoreScopedSearch.js +0 -27
- package/dist/seed/defaults/homepage-sections.d.ts +0 -2
- package/dist/seed/defaults/homepage-sections.js +0 -60
- package/dist/seed/factories/homepage-section.factory.d.ts +0 -10
- package/dist/seed/factories/homepage-section.factory.js +0 -13
- /package/dist/{features/search/types/index.js → _internal/shared/listing-types/spares/og.d.ts} +0 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ONE reason → {HTTP status, stable code} map for the two event prize-draw
|
|
3
|
+
* job cores (`assignSpinPrize`, `triggerEventRaffle`).
|
|
4
|
+
*
|
|
5
|
+
* ## Why this exists
|
|
6
|
+
*
|
|
7
|
+
* Each core returns a `reason` string instead of throwing, and each is reachable
|
|
8
|
+
* by TWO entry points — a Next.js API route and a Firebase callable handler.
|
|
9
|
+
* That made four translations of one vocabulary, and all four disagreed:
|
|
10
|
+
*
|
|
11
|
+
* · `api/events/[id]/spin/route.ts` — had `feature_disabled`, no `not_active`
|
|
12
|
+
* · `jobs/handlers/assignSpinPrize.ts` — `identity_required` → 400 (route said 401),
|
|
13
|
+
* no `feature_disabled` branch at all
|
|
14
|
+
* · `api/admin/events/[id]/trigger-raffle/route.ts` — EVERYTHING → 409
|
|
15
|
+
* · `jobs/handlers/triggerEventRaffle.ts` — only 404 / 422
|
|
16
|
+
*
|
|
17
|
+
* Root Cause #85 ("a handler reachable by two entry points with different
|
|
18
|
+
* behaviour"), four times over in one feature. The spin route's own header
|
|
19
|
+
* already documented the trap and still only fixed its own half.
|
|
20
|
+
*
|
|
21
|
+
* ## Two rules that produced real bugs
|
|
22
|
+
*
|
|
23
|
+
* 1. 🛑 **A PERMANENT refusal must never take a retryable status.** The spin
|
|
24
|
+
* route's fallback was 409 (`ALREADY_EXISTS`), described in its own comment
|
|
25
|
+
* as "a benign can't-spin-right-now state". An unlisted permanent reason
|
|
26
|
+
* therefore shipped `{code:"ALREADY_EXISTS", error:"<reason>"}` — an envelope
|
|
27
|
+
* naming two unrelated things — which the UI rendered as "Spin failed.
|
|
28
|
+
* Please try again.", inviting a retry that could never succeed.
|
|
29
|
+
*
|
|
30
|
+
* 2. 🛑 **A reason-less result is a SUCCESS to both routes.** Both check
|
|
31
|
+
* `if (data.reason && !data.<successField>)`, so a core branch that returned
|
|
32
|
+
* early *without* a `reason` fell through to `successResponse`.
|
|
33
|
+
* `triggerEventRaffle`'s feature-flag branch did exactly that and answered
|
|
34
|
+
* `200 "Raffle triggered"` with no winner. Every non-success branch in either
|
|
35
|
+
* core must set a reason from this map.
|
|
36
|
+
*
|
|
37
|
+
* There is deliberately NO fallback entry here: `reasonToHttp` is exhaustive
|
|
38
|
+
* over `EventDrawReason`, so adding a reason without a status is a compile
|
|
39
|
+
* error rather than a silent 409.
|
|
40
|
+
*/
|
|
41
|
+
import { EVENT_DRAW_ERROR_CODES } from "../../../../errors/error-codes.js";
|
|
42
|
+
export const EVENT_DRAW_REASON = {
|
|
43
|
+
/** Neither a signed-in user nor a hashed guest identity was supplied. */
|
|
44
|
+
IDENTITY_REQUIRED: "identity_required",
|
|
45
|
+
/** Guest attempt on an event that has not opted into guest participation. */
|
|
46
|
+
LOGIN_REQUIRED: "login_required",
|
|
47
|
+
EVENT_NOT_FOUND: "event_not_found",
|
|
48
|
+
/** Draft / paused / cancelled / ended — see each core's status precondition. */
|
|
49
|
+
NOT_ACTIVE: "not_active",
|
|
50
|
+
NO_PRIZES_CONFIGURED: "no_prizes_configured",
|
|
51
|
+
OUTSIDE_SPIN_WINDOW: "outside_spin_window",
|
|
52
|
+
/** This identity has already consumed its `spinMaxPerUser` allowance. */
|
|
53
|
+
ALREADY_USED: "already_used",
|
|
54
|
+
NOT_A_SPIN_WHEEL: "not_a_spin_wheel",
|
|
55
|
+
NOT_A_RAFFLE: "not_a_raffle",
|
|
56
|
+
/** A winner is already recorded; a second draw would mean two winners. */
|
|
57
|
+
ALREADY_TRIGGERED: "already_triggered",
|
|
58
|
+
NO_ELIGIBLE_ENTRIES: "no_eligible_entries",
|
|
59
|
+
};
|
|
60
|
+
const MAPPING = {
|
|
61
|
+
[EVENT_DRAW_REASON.IDENTITY_REQUIRED]: {
|
|
62
|
+
status: 401,
|
|
63
|
+
code: EVENT_DRAW_ERROR_CODES.IDENTITY_REQUIRED,
|
|
64
|
+
message: "No user or guest identity was provided",
|
|
65
|
+
},
|
|
66
|
+
[EVENT_DRAW_REASON.LOGIN_REQUIRED]: {
|
|
67
|
+
status: 401,
|
|
68
|
+
code: EVENT_DRAW_ERROR_CODES.LOGIN_REQUIRED,
|
|
69
|
+
message: "Sign in to take part in this event",
|
|
70
|
+
},
|
|
71
|
+
[EVENT_DRAW_REASON.EVENT_NOT_FOUND]: {
|
|
72
|
+
status: 404,
|
|
73
|
+
code: EVENT_DRAW_ERROR_CODES.EVENT_NOT_FOUND,
|
|
74
|
+
message: "Event not found",
|
|
75
|
+
},
|
|
76
|
+
[EVENT_DRAW_REASON.NOT_ACTIVE]: {
|
|
77
|
+
status: 409,
|
|
78
|
+
code: EVENT_DRAW_ERROR_CODES.EVENT_NOT_ACTIVE,
|
|
79
|
+
message: "This event is not running right now",
|
|
80
|
+
},
|
|
81
|
+
[EVENT_DRAW_REASON.NO_PRIZES_CONFIGURED]: {
|
|
82
|
+
status: 422,
|
|
83
|
+
code: EVENT_DRAW_ERROR_CODES.SPIN_NO_PRIZES,
|
|
84
|
+
message: "No spin prizes are configured for this event",
|
|
85
|
+
},
|
|
86
|
+
[EVENT_DRAW_REASON.OUTSIDE_SPIN_WINDOW]: {
|
|
87
|
+
status: 403,
|
|
88
|
+
code: EVENT_DRAW_ERROR_CODES.SPIN_OUTSIDE_WINDOW,
|
|
89
|
+
message: "This spin wheel is not open right now",
|
|
90
|
+
},
|
|
91
|
+
[EVENT_DRAW_REASON.ALREADY_USED]: {
|
|
92
|
+
status: 409,
|
|
93
|
+
code: EVENT_DRAW_ERROR_CODES.SPIN_ALREADY_USED,
|
|
94
|
+
message: "This identity has already used its spins for this event",
|
|
95
|
+
},
|
|
96
|
+
[EVENT_DRAW_REASON.NOT_A_SPIN_WHEEL]: {
|
|
97
|
+
status: 422,
|
|
98
|
+
code: EVENT_DRAW_ERROR_CODES.NOT_A_SPIN_WHEEL,
|
|
99
|
+
message: "This event is not a spin wheel",
|
|
100
|
+
},
|
|
101
|
+
[EVENT_DRAW_REASON.NOT_A_RAFFLE]: {
|
|
102
|
+
status: 422,
|
|
103
|
+
code: EVENT_DRAW_ERROR_CODES.RAFFLE_NOT_A_RAFFLE,
|
|
104
|
+
message: "This event does not have a raffle",
|
|
105
|
+
},
|
|
106
|
+
[EVENT_DRAW_REASON.ALREADY_TRIGGERED]: {
|
|
107
|
+
status: 409,
|
|
108
|
+
code: EVENT_DRAW_ERROR_CODES.RAFFLE_ALREADY_DRAWN,
|
|
109
|
+
message: "A winner has already been drawn for this raffle",
|
|
110
|
+
},
|
|
111
|
+
[EVENT_DRAW_REASON.NO_ELIGIBLE_ENTRIES]: {
|
|
112
|
+
status: 409,
|
|
113
|
+
code: EVENT_DRAW_ERROR_CODES.RAFFLE_NO_ELIGIBLE_ENTRIES,
|
|
114
|
+
message: "No eligible entries to draw from",
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
const UNKNOWN = {
|
|
118
|
+
status: 500,
|
|
119
|
+
code: EVENT_DRAW_ERROR_CODES.UNKNOWN_REASON,
|
|
120
|
+
message: "The event could not be processed",
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* Translate a core's `reason` into the response shape both entry points use.
|
|
124
|
+
*
|
|
125
|
+
* An unrecognised reason maps to **500**, not to the old 409 fallback: a reason
|
|
126
|
+
* this map has never heard of is a bug in the core, and a 5xx is what gets it
|
|
127
|
+
* recorded by `onRequestError` instead of being filed as an ordinary conflict.
|
|
128
|
+
*/
|
|
129
|
+
export function reasonToHttp(reason) {
|
|
130
|
+
if (!reason)
|
|
131
|
+
return UNKNOWN;
|
|
132
|
+
return MAPPING[reason] ?? UNKNOWN;
|
|
133
|
+
}
|
|
@@ -53,17 +53,31 @@ function getStringArrayOpt(baseOpts, key) {
|
|
|
53
53
|
}
|
|
54
54
|
const LISTERS = {
|
|
55
55
|
products: (m, o) => productRepository.list(m, o),
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
/*
|
|
57
|
+
* 🛑 These four forward `search`, and did not until 2026-10-17.
|
|
58
|
+
*
|
|
59
|
+
* `categoriesRepository.list` and `couponsRepository.list` both accept
|
|
60
|
+
* `opts?: { search?: string }`, and all four listers below were written
|
|
61
|
+
* `(m) => repo.list(m)` — so a search term reaching the Function was
|
|
62
|
+
* DISCARDED and the page came back unfiltered with a 200, while the same
|
|
63
|
+
* route's local fallback filtered correctly. Exactly the divergence the
|
|
64
|
+
* comment further down records for orders/reviews/blogPosts/events/stores
|
|
65
|
+
* and faqs, four collections later: category, brand, coupon and
|
|
66
|
+
* sublisting-category search.
|
|
67
|
+
*
|
|
68
|
+
* Found by `audit-lister-opts-forwarding`, which now blocks the shape.
|
|
69
|
+
*/
|
|
70
|
+
categories: (m, o) => categoriesRepository.list(m, { search: getStringOpt(o, "search") }),
|
|
71
|
+
brands: (m, o) => categoriesRepository.list({
|
|
58
72
|
...m,
|
|
59
73
|
filters: m.filters
|
|
60
74
|
? `${m.filters},categoryType==brand`
|
|
61
75
|
: "categoryType==brand",
|
|
62
|
-
}),
|
|
76
|
+
}, { search: getStringOpt(o, "search") }),
|
|
63
77
|
orders: (m, o) => orderRepository.listAll(m, { search: getStringOpt(o, "search") }),
|
|
64
78
|
reviews: (m, o) => reviewRepository.listAll(m, { search: getStringOpt(o, "search") }),
|
|
65
|
-
coupons: (m) => couponsRepository.list(m),
|
|
66
|
-
bids: (m) => bidRepository.list(m),
|
|
79
|
+
coupons: (m, o) => couponsRepository.list(m, { search: getStringOpt(o, "search") }),
|
|
80
|
+
bids: (m, o) => bidRepository.list(m, { search: getStringOpt(o, "search") }),
|
|
67
81
|
payouts: (m) => payoutRepository.list(m),
|
|
68
82
|
blogPosts: (m, o) => blogRepository.listAll(m, { search: getStringOpt(o, "search") }),
|
|
69
83
|
events: (m, o) => eventRepository.list(m, { search: getStringOpt(o, "search") }),
|
|
@@ -84,13 +98,19 @@ const LISTERS = {
|
|
|
84
98
|
tags: getStringArrayOpt(o, "tags"),
|
|
85
99
|
}),
|
|
86
100
|
notifications: (m) => notificationRepository.list(m),
|
|
87
|
-
|
|
88
|
-
|
|
101
|
+
/*
|
|
102
|
+
* `/api/admin/scammers` passes `{ search: q }` to this same method locally —
|
|
103
|
+
* its route comment records that the identity arrays "were never searched at
|
|
104
|
+
* all despite the box promising them" before searchTxt. Through the Function
|
|
105
|
+
* the opt was dropped again, so the two executors disagreed.
|
|
106
|
+
*/
|
|
107
|
+
scammers: (m, o) => scammerRepository.listAll(m, { search: getStringOpt(o, "search") }),
|
|
108
|
+
sublistingCategories: (m, o) => categoriesRepository.list({
|
|
89
109
|
...m,
|
|
90
110
|
filters: m.filters
|
|
91
111
|
? `${m.filters},categoryType==sublisting`
|
|
92
112
|
: "categoryType==sublisting",
|
|
93
|
-
}),
|
|
113
|
+
}, { search: getStringOpt(o, "search") }),
|
|
94
114
|
productFeatures: (m) => productFeaturesRepository.list(m),
|
|
95
115
|
homepageSections: (m) => homepageSectionsRepository.list(m),
|
|
96
116
|
users: (m) => userRepository.list(m),
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { normalizeError } from "../../../../errors/normalize.js";
|
|
2
|
+
import { ORDER_PII_FIELDS, revealPii } from "../../../../security/index.js";
|
|
2
3
|
import { adminNotificationsRepository, storeRepository, userRepository } from "../../../../repositories/index.js";
|
|
3
4
|
import { decryptPii } from "../../../../security/index.js";
|
|
4
5
|
import { sendWhatsAppBusinessMessage, buildPurchaseAnnouncementMessage, } from "../../../../features/whatsapp-bot/server.js";
|
|
@@ -91,7 +92,17 @@ export async function handleOrderCreate(input, ctx) {
|
|
|
91
92
|
* `decryptPii` was already imported in this file and used for the store
|
|
92
93
|
* owner's phone eleven lines up; the buyer's name was simply missed.
|
|
93
94
|
*/
|
|
94
|
-
|
|
95
|
+
/*
|
|
96
|
+
* The NAMED accessor, not a bare `decryptPii` cast.
|
|
97
|
+
*
|
|
98
|
+
* This already decrypted and therefore already WORKED — but through a cast
|
|
99
|
+
* that defeated the brand, so "is every reader converted?" could not be
|
|
100
|
+
* answered by grepping for `reveal*`. Routing it through `revealOrder` makes
|
|
101
|
+
* the decision visible in review and in a grep, which is the whole argument
|
|
102
|
+
* for named accessors over an inline decrypt.
|
|
103
|
+
*/
|
|
104
|
+
const buyerName = revealPii(order, ORDER_PII_FIELDS).userName ??
|
|
105
|
+
"A customer";
|
|
95
106
|
const message = buildPurchaseAnnouncementMessage({
|
|
96
107
|
buyerName,
|
|
97
108
|
firstItemName,
|
|
@@ -10,6 +10,17 @@ export async function handleScamReportCreate(input, ctx) {
|
|
|
10
10
|
if (reportedBy) {
|
|
11
11
|
try {
|
|
12
12
|
const reporter = await userRepository.findById(reportedBy);
|
|
13
|
+
/*
|
|
14
|
+
* REVEALED, because this notification is DELIVERED to the reporter and a
|
|
15
|
+
* masked address cannot receive mail.
|
|
16
|
+
*
|
|
17
|
+
* `findById` stopped decrypting when `UserRepository` went
|
|
18
|
+
* ciphertext-by-default, so `reporter.email` is an `enc:v1:` blob — it
|
|
19
|
+
* would have been handed to the mailer verbatim. The old intersection
|
|
20
|
+
* brand could not object, because `Encrypted<string>` was a subtype of
|
|
21
|
+
* `string`.
|
|
22
|
+
*/
|
|
23
|
+
const reporterPlain = reporter ? userRepository.revealUser(reporter) : null;
|
|
13
24
|
await sendNotification({
|
|
14
25
|
userId: reportedBy,
|
|
15
26
|
type: "scam_report_update",
|
|
@@ -18,8 +29,8 @@ export async function handleScamReportCreate(input, ctx) {
|
|
|
18
29
|
message: `Your report for "${name}" has been received. Our team will review it within 48 hours.`,
|
|
19
30
|
relatedId: scammerId,
|
|
20
31
|
relatedType: "scammer",
|
|
21
|
-
userEmail:
|
|
22
|
-
userPhone:
|
|
32
|
+
userEmail: reporterPlain?.email ?? undefined,
|
|
33
|
+
userPhone: reporterPlain?.phoneNumber ?? undefined,
|
|
23
34
|
});
|
|
24
35
|
}
|
|
25
36
|
catch (err) {
|
|
@@ -13,6 +13,12 @@ export async function handleScamReportRejected(input, ctx) {
|
|
|
13
13
|
const name = displayNames?.[0] ?? "Unknown";
|
|
14
14
|
try {
|
|
15
15
|
const reporter = await userRepository.findById(reportedBy);
|
|
16
|
+
/*
|
|
17
|
+
* REVEALED, because this notification is DELIVERED to the reporter and a
|
|
18
|
+
* masked address cannot receive mail. `findById` is ciphertext-by-default,
|
|
19
|
+
* so passing `.email` straight through handed the mailer an `enc:v1:` blob.
|
|
20
|
+
*/
|
|
21
|
+
const reporterPlain = reporter ? userRepository.revealUser(reporter) : null;
|
|
16
22
|
await sendNotification({
|
|
17
23
|
userId: reportedBy,
|
|
18
24
|
type: "scam_report_update",
|
|
@@ -21,8 +27,8 @@ export async function handleScamReportRejected(input, ctx) {
|
|
|
21
27
|
message: `Your report for "${name}" could not be verified with the evidence provided. You may submit a new report with additional evidence.`,
|
|
22
28
|
relatedId: scammerId,
|
|
23
29
|
relatedType: "scammer",
|
|
24
|
-
userEmail:
|
|
25
|
-
userPhone:
|
|
30
|
+
userEmail: reporterPlain?.email ?? undefined,
|
|
31
|
+
userPhone: reporterPlain?.phoneNumber ?? undefined,
|
|
26
32
|
});
|
|
27
33
|
}
|
|
28
34
|
catch (err) {
|
|
@@ -13,6 +13,12 @@ export async function handleScamReportVerified(input, ctx) {
|
|
|
13
13
|
const name = displayNames?.[0] ?? "Unknown";
|
|
14
14
|
try {
|
|
15
15
|
const reporter = await userRepository.findById(reportedBy);
|
|
16
|
+
/*
|
|
17
|
+
* REVEALED, because this notification is DELIVERED to the reporter and a
|
|
18
|
+
* masked address cannot receive mail. `findById` is ciphertext-by-default,
|
|
19
|
+
* so passing `.email` straight through handed the mailer an `enc:v1:` blob.
|
|
20
|
+
*/
|
|
21
|
+
const reporterPlain = reporter ? userRepository.revealUser(reporter) : null;
|
|
16
22
|
await sendNotification({
|
|
17
23
|
userId: reportedBy,
|
|
18
24
|
type: "scam_report_update",
|
|
@@ -21,8 +27,8 @@ export async function handleScamReportVerified(input, ctx) {
|
|
|
21
27
|
message: `The report for "${name}" has been verified and published to the Scam Registry. Thank you for helping protect the community.`,
|
|
22
28
|
relatedId: scammerId,
|
|
23
29
|
relatedType: "scammer",
|
|
24
|
-
userEmail:
|
|
25
|
-
userPhone:
|
|
30
|
+
userEmail: reporterPlain?.email ?? undefined,
|
|
31
|
+
userPhone: reporterPlain?.phoneNumber ?? undefined,
|
|
26
32
|
});
|
|
27
33
|
}
|
|
28
34
|
catch (err) {
|
|
@@ -5,9 +5,16 @@
|
|
|
5
5
|
import { notifyRevalidate } from "./revalidateNotify.js";
|
|
6
6
|
export async function handleStoreWrite(input, ctx) {
|
|
7
7
|
// The search-index sync this used to perform is gone (Firestore queries handle
|
|
8
|
-
// search now), so the only remaining side-effect is cache invalidation:
|
|
9
|
-
// the ISR entries for this store's page and the stores listing. Reuses
|
|
10
|
-
// existing trigger, so
|
|
11
|
-
//
|
|
8
|
+
// search now), so the only remaining side-effect here is cache invalidation:
|
|
9
|
+
// drop the ISR entries for this store's page and the stores listing. Reuses
|
|
10
|
+
// the existing trigger, so it costs no additional invocations, and this
|
|
11
|
+
// function performs no Firestore write.
|
|
12
|
+
//
|
|
13
|
+
// 🛑 The HANDLER above it does write one, as of the public search index:
|
|
14
|
+
// `markSearchIndexDirty` flips a boolean on `searchIndex/manifest`. That is
|
|
15
|
+
// still safe under Root Cause #92 — a different collection from the one the
|
|
16
|
+
// trigger watches, with a boolean read-then-write guard — but the old
|
|
17
|
+
// blanket claim that this trigger writes nothing is no longer true, and a
|
|
18
|
+
// comment that is false is worse than no comment.
|
|
12
19
|
await notifyRevalidate({ collection: "stores", id: input.storeId }, ctx);
|
|
13
20
|
}
|
|
@@ -14,10 +14,11 @@ const ORDER_COLLECTION = "orders";
|
|
|
14
14
|
* — do not change the selection algorithm.
|
|
15
15
|
*/
|
|
16
16
|
export async function assignPrizeDrawWinner(ctx, args) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
// The `FEATURE_PRIZE_DRAWS` gate here was deleted 2026-10-19 with the other
|
|
18
|
+
// four readers — see the header of `assignSpinPrize.ts`. This one was the
|
|
19
|
+
// worst-shaped of them: it returned `kind: "not_eligible"`, which every
|
|
20
|
+
// caller treats as "this order does not win anything", so with the env var
|
|
21
|
+
// unset a paid prize-draw entry was silently recorded as a non-winner.
|
|
21
22
|
const { orderId, productId } = args;
|
|
22
23
|
const orderRef = ctx.db.collection(ORDER_COLLECTION).doc(orderId);
|
|
23
24
|
const productRef = ctx.db.collection(PRODUCT_COLLECTION).doc(productId);
|
|
@@ -17,10 +17,7 @@ const PRIZE_DRAW_LISTING_TYPE = "prize-draw";
|
|
|
17
17
|
* "closed".
|
|
18
18
|
*/
|
|
19
19
|
export async function runPrizeDrawExpiryReveal(ctx) {
|
|
20
|
-
|
|
21
|
-
ctx.logger.info("FEATURE_PRIZE_DRAWS disabled — skipping prize-draw expiry reveal");
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
20
|
+
// `FEATURE_PRIZE_DRAWS` gate deleted 2026-10-19 — see `assignSpinPrize.ts`.
|
|
24
21
|
ctx.logger.info("Prize-draw expiry reveal sweep starting");
|
|
25
22
|
const snap = await ctx.db
|
|
26
23
|
.collection(PRODUCT_COLLECTION)
|
|
@@ -18,8 +18,7 @@ function isSoldOut(doc) {
|
|
|
18
18
|
* the draw, then closes it.
|
|
19
19
|
*/
|
|
20
20
|
export async function handlePrizeDrawSoldOut(input, ctx) {
|
|
21
|
-
|
|
22
|
-
return;
|
|
21
|
+
// `FEATURE_PRIZE_DRAWS` gate deleted 2026-10-19 — see `assignSpinPrize.ts`.
|
|
23
22
|
const { productId, before, after } = input;
|
|
24
23
|
if (!after)
|
|
25
24
|
return;
|
|
@@ -6,10 +6,13 @@ import { ProductStatusValues } from "../../../../features/products/schemas/fires
|
|
|
6
6
|
* (coupon.startDate IS NULL OR <= now) filter Firestore can't express.
|
|
7
7
|
*/
|
|
8
8
|
export async function runPromotions(_input, ctx) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
/*
|
|
10
|
+
* `FEATURE_EVENTS` gate deleted 2026-10-19 — see `auctionSettlement.ts`.
|
|
11
|
+
* Unset in the Functions env, and this branch returned three EMPTY ARRAYS,
|
|
12
|
+
* which is indistinguishable from "nothing is promoted right now" to every
|
|
13
|
+
* caller. A refusal shaped like a valid empty answer is the worst of the
|
|
14
|
+
* nine; the spin route at least produced a 503 somebody could see.
|
|
15
|
+
*/
|
|
13
16
|
ctx.logger.info("Promotions data requested");
|
|
14
17
|
const now = new Date();
|
|
15
18
|
const nowIso = now.toISOString();
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { JobContext } from "../runtime/types";
|
|
2
|
+
export declare function runSearchIndexBuild(ctx: JobContext): Promise<void>;
|
|
3
|
+
/**
|
|
4
|
+
* Force a full rebuild, ignoring the manifest's cadence. For a one-off repair
|
|
5
|
+
* after a schema bump or a reseed.
|
|
6
|
+
*/
|
|
7
|
+
export declare function runSearchIndexFullRebuild(ctx: JobContext): Promise<void>;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Core: build the public search index artifact.
|
|
3
|
+
*
|
|
4
|
+
* ## 🛑 THE READ BUDGET IS WHY THIS JOB HAS THREE MODES
|
|
5
|
+
*
|
|
6
|
+
* Firestore bills per document read regardless of `select()`. A full rebuild
|
|
7
|
+
* every 15 minutes is `96 × 3,730 ≈ 358,000 reads/day` against a 50,000/day
|
|
8
|
+
* free tier — seven times over. Hourly is still ~89,000. So:
|
|
9
|
+
*
|
|
10
|
+
* idle manifest not dirty, full not due 1 read ~90/day
|
|
11
|
+
* incremental dirty: `updatedAt >` per source 13 + changed ~200/day
|
|
12
|
+
* full >24h since the last one 3,730 3,730/day
|
|
13
|
+
*
|
|
14
|
+
* ≈ 4,000 reads/day, about 8% of the tier. Measured on production: a full
|
|
15
|
+
* build is 3,750 reads, 3,589 records, 384 KB raw / 48 KB brotli, in 4.1s.
|
|
16
|
+
*
|
|
17
|
+
* 🛑 EVERY RUN LOGS ITS MODE AND READ COUNT. If the incremental path ever
|
|
18
|
+
* breaks and silently falls back to FULL each cadence, that is 358,000
|
|
19
|
+
* reads/day and a quota wall — and the only way anyone finds out before the
|
|
20
|
+
* wall is this line. A job that does the wrong thing cheaply is a bug; one
|
|
21
|
+
* that does it seven times over the tier is an outage.
|
|
22
|
+
*
|
|
23
|
+
* ## Why its own scheduled job rather than folding into an existing one
|
|
24
|
+
*
|
|
25
|
+
* `countersReconcile` and `productStatsSync` already run near their 540s
|
|
26
|
+
* ceiling, and a full rebuild failing inside one of them would take category
|
|
27
|
+
* metrics down with it. `priceIndexRollup`'s header makes the same argument
|
|
28
|
+
* for staying separate. CLAUDE.md explicitly accepts ~$0.10/month for a new
|
|
29
|
+
* distinct-cadence Scheduler job rather than routing around it.
|
|
30
|
+
*
|
|
31
|
+
* @tag domain:search
|
|
32
|
+
* @tag layer:server
|
|
33
|
+
* @tag pattern:job-core
|
|
34
|
+
* @tag access:server
|
|
35
|
+
* @tag consumers:searchIndexBuildHandler
|
|
36
|
+
* @tag sideEffects:firestore,storage
|
|
37
|
+
*/
|
|
38
|
+
import { getAdminStorage } from "../../../../providers/db-firebase/index.js";
|
|
39
|
+
import { normalizeError } from "../../../../errors/normalize.js";
|
|
40
|
+
import { serverLogger } from "../../../../monitoring/server-logger.js";
|
|
41
|
+
import { buildFull, buildIncremental, } from "../../features/search/index-build/build.js";
|
|
42
|
+
import { manifestRef, publishArtifact, publishManifestMirror, readManifest, storagePathFor, } from "../../features/search/index-build/artifact-store.js";
|
|
43
|
+
/** How stale the index may get before a reconciling full pass is forced. */
|
|
44
|
+
const FULL_REBUILD_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
45
|
+
function dueForFull(manifest, now) {
|
|
46
|
+
if (!manifest || !manifest.lastFullAt)
|
|
47
|
+
return true;
|
|
48
|
+
const last = Date.parse(manifest.lastFullAt);
|
|
49
|
+
if (!Number.isFinite(last))
|
|
50
|
+
return true;
|
|
51
|
+
return now.getTime() - last >= FULL_REBUILD_INTERVAL_MS;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Fetch the previous artifact so an incremental pass can patch it.
|
|
55
|
+
*
|
|
56
|
+
* Returns null on any failure, which makes the caller fall back to a FULL
|
|
57
|
+
* build. That is the right degradation: a full build is expensive but
|
|
58
|
+
* correct, whereas patching an artifact we could not read is not possible at
|
|
59
|
+
* all.
|
|
60
|
+
*/
|
|
61
|
+
async function readPreviousArtifact(storagePath) {
|
|
62
|
+
try {
|
|
63
|
+
const bucket = getAdminStorage().bucket();
|
|
64
|
+
const [buf] = await bucket.file(storagePath).download();
|
|
65
|
+
return JSON.parse(buf.toString("utf8"));
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
const e = normalizeError(err);
|
|
69
|
+
/*
|
|
70
|
+
* WARN, not silence. Returning null here is a correct degradation — the
|
|
71
|
+
* caller falls back to a FULL build, which is expensive but right — and
|
|
72
|
+
* that is exactly why it needs a log line: a permanently unreadable
|
|
73
|
+
* previous artifact turns every run into a 3,730-read full build and the
|
|
74
|
+
* only outward sign is the read count creeping up. The fallback hides the
|
|
75
|
+
* fault, so the log is the one thing that does not.
|
|
76
|
+
*/
|
|
77
|
+
serverLogger.warn("search index: previous artifact unreadable, falling back to FULL", {
|
|
78
|
+
storagePath,
|
|
79
|
+
message: e.message,
|
|
80
|
+
});
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export async function runSearchIndexBuild(ctx) {
|
|
85
|
+
const { db, logger, now } = ctx;
|
|
86
|
+
const manifest = await readManifest(db);
|
|
87
|
+
const wantFull = dueForFull(manifest, now);
|
|
88
|
+
/*
|
|
89
|
+
* The idle exit. One read, ~90 times a day. Without it the job would do a
|
|
90
|
+
* 13-query incremental pass every 15 minutes whether or not anything
|
|
91
|
+
* changed, which is 1,250 reads/day spent proving nothing happened.
|
|
92
|
+
*/
|
|
93
|
+
if (!wantFull && manifest && manifest.dirty !== true) {
|
|
94
|
+
logger.info("search index: idle (not dirty, full not due)", { reads: 1 });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const version = (manifest?.version ?? 0) + 1;
|
|
98
|
+
let result;
|
|
99
|
+
let mode = "full";
|
|
100
|
+
if (!wantFull && manifest) {
|
|
101
|
+
const previous = await readPreviousArtifact(manifest.storagePath);
|
|
102
|
+
if (previous) {
|
|
103
|
+
const since = new Date(manifest.builtAt);
|
|
104
|
+
result = await buildIncremental(db, previous, since, version, now);
|
|
105
|
+
mode = "incremental";
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (!result) {
|
|
109
|
+
result = await buildFull(db, version, now);
|
|
110
|
+
mode = "full";
|
|
111
|
+
}
|
|
112
|
+
const { artifact, stats } = result;
|
|
113
|
+
const published = await publishArtifact(getAdminStorage().bucket(), artifact);
|
|
114
|
+
const next = {
|
|
115
|
+
schema: artifact.schema,
|
|
116
|
+
version,
|
|
117
|
+
builtAt: artifact.builtAt,
|
|
118
|
+
lastFullAt: mode === "full" ? artifact.builtAt : (manifest?.lastFullAt ?? artifact.builtAt),
|
|
119
|
+
storagePath: published.storagePath,
|
|
120
|
+
recordCount: artifact.r.length,
|
|
121
|
+
bytes: published.bytes,
|
|
122
|
+
perType: stats.perType,
|
|
123
|
+
/*
|
|
124
|
+
* Cleared LAST, after the artifact is live — clearing it first would lose
|
|
125
|
+
* every write that arrived while this build was running.
|
|
126
|
+
*
|
|
127
|
+
* 🛑 And NOT cleared at all if any source threw. An incremental pass skips
|
|
128
|
+
* a failing source by design (the previous values stay, which is correct
|
|
129
|
+
* and slightly stale), but clearing `dirty` on top of that would mean the
|
|
130
|
+
* next run exits idle and those types never recover until the daily full
|
|
131
|
+
* pass — a partial index reported as a clean one. Staying dirty costs one
|
|
132
|
+
* retry per cadence and is self-healing.
|
|
133
|
+
*
|
|
134
|
+
* This mattered immediately: the first incremental run against production
|
|
135
|
+
* failed on every source with a `where` clause, for a missing composite
|
|
136
|
+
* index, and without this it would have published a mostly-empty patch
|
|
137
|
+
* and called it done.
|
|
138
|
+
*/
|
|
139
|
+
dirty: stats.failed > 0,
|
|
140
|
+
};
|
|
141
|
+
await manifestRef(db).set(next, { merge: true });
|
|
142
|
+
/*
|
|
143
|
+
* Firestore first (the next build reads it), the public mirror second (the
|
|
144
|
+
* browser reads it). See `publishManifestMirror` for why a failure here is
|
|
145
|
+
* logged rather than thrown.
|
|
146
|
+
*/
|
|
147
|
+
await publishManifestMirror(getAdminStorage().bucket(), next);
|
|
148
|
+
/*
|
|
149
|
+
* 🛑 The line that makes a runaway visible. `reads` is the number that has
|
|
150
|
+
* to stay inside the budget, and `mode` is what explains it.
|
|
151
|
+
*/
|
|
152
|
+
const line = stats.failed > 0 ? logger.warn : logger.info;
|
|
153
|
+
line("search index built", {
|
|
154
|
+
mode,
|
|
155
|
+
version,
|
|
156
|
+
reads: stats.reads,
|
|
157
|
+
// 🛑 Surfaced, not swallowed. A non-zero count means the artifact is
|
|
158
|
+
// incomplete for those types and the manifest stays dirty for a retry.
|
|
159
|
+
failedSources: stats.failed,
|
|
160
|
+
records: artifact.r.length,
|
|
161
|
+
dropped: stats.dropped,
|
|
162
|
+
bytes: published.bytes,
|
|
163
|
+
prunedVersions: published.pruned,
|
|
164
|
+
durationMs: stats.durationMs,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Force a full rebuild, ignoring the manifest's cadence. For a one-off repair
|
|
169
|
+
* after a schema bump or a reseed.
|
|
170
|
+
*/
|
|
171
|
+
export async function runSearchIndexFullRebuild(ctx) {
|
|
172
|
+
const { db, logger, now } = ctx;
|
|
173
|
+
const manifest = await readManifest(db);
|
|
174
|
+
const version = (manifest?.version ?? 0) + 1;
|
|
175
|
+
try {
|
|
176
|
+
const { artifact, stats } = await buildFull(db, version, now);
|
|
177
|
+
const published = await publishArtifact(getAdminStorage().bucket(), artifact);
|
|
178
|
+
const next = {
|
|
179
|
+
schema: artifact.schema,
|
|
180
|
+
version,
|
|
181
|
+
builtAt: artifact.builtAt,
|
|
182
|
+
lastFullAt: artifact.builtAt,
|
|
183
|
+
storagePath: published.storagePath,
|
|
184
|
+
recordCount: artifact.r.length,
|
|
185
|
+
bytes: published.bytes,
|
|
186
|
+
perType: stats.perType,
|
|
187
|
+
dirty: false,
|
|
188
|
+
};
|
|
189
|
+
await manifestRef(db).set(next, { merge: true });
|
|
190
|
+
/*
|
|
191
|
+
* 🛑 The mirror belongs on BOTH paths. This one is the manual repair
|
|
192
|
+
* entry point — the one somebody reaches for precisely when the index is
|
|
193
|
+
* wrong — so a rebuild that fixed the artifact and left every browser
|
|
194
|
+
* pointed at the broken version would be the worst possible outcome of
|
|
195
|
+
* running it.
|
|
196
|
+
*/
|
|
197
|
+
await publishManifestMirror(getAdminStorage().bucket(), next);
|
|
198
|
+
logger.info("search index FULL rebuild complete", {
|
|
199
|
+
version,
|
|
200
|
+
reads: stats.reads,
|
|
201
|
+
records: artifact.r.length,
|
|
202
|
+
bytes: published.bytes,
|
|
203
|
+
path: storagePathFor(version),
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
const e = normalizeError(err);
|
|
208
|
+
logger.error("search index FULL rebuild failed", { message: e.message });
|
|
209
|
+
throw err;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
@@ -1,6 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Core: select a raffle winner for an event using `crypto.randomInt()`. Pool
|
|
3
3
|
* logic keys off the event's `raffleType`.
|
|
4
|
+
*
|
|
5
|
+
* ## Three things in here had never worked
|
|
6
|
+
*
|
|
7
|
+
* 1. **The pool query could not match any entry created by this app.** It
|
|
8
|
+
* asked for `status == "CONFIRMED"` — a real field with a real admin
|
|
9
|
+
* workflow (`AdminAllEventEntriesView`'s Confirm / Waitlist / Cancel row
|
|
10
|
+
* actions) but with NO writer at creation time. `enterEvent` never set it
|
|
11
|
+
* and neither did the seed, so the pool was empty unless an admin had
|
|
12
|
+
* hand-confirmed every entry one row at a time — on a raffle seeded with
|
|
13
|
+
* 1,892 entries. Every draw returned `no_eligible_entries`; the raffle had
|
|
14
|
+
* never once been drawable.
|
|
15
|
+
*
|
|
16
|
+
* The predicate is now `reviewStatus == "approved"`: written on every entry
|
|
17
|
+
* path, already indexed `(eventId, reviewStatus, submittedAt DESC)`, and
|
|
18
|
+
* auto-approved for raffles by `enterEvent`. `status` keeps its RSVP
|
|
19
|
+
* meaning and is deliberately NOT the gate — see the note on both fields in
|
|
20
|
+
* `constants/field-names.ts`.
|
|
21
|
+
*
|
|
22
|
+
* 2. **`drawsPermitted: 1` was not enforced.** The already-drawn check and the
|
|
23
|
+
* winner write sat outside any transaction, so two concurrent admin clicks
|
|
24
|
+
* both saw no winner and both wrote — two winners for one prize. The
|
|
25
|
+
* check-and-write is now inside `runTransaction`, following the sibling
|
|
26
|
+
* core `prizeDrawAssignWinner`.
|
|
27
|
+
*
|
|
28
|
+
* 3. **The winner was never told.** A winner was recorded and the only way to
|
|
29
|
+
* find out was to revisit the event page.
|
|
30
|
+
*
|
|
31
|
+
* The `FEATURE_PRIZE_DRAWS` gate that used to open this function was deleted
|
|
32
|
+
* 2026-10-19 — see the header of `assignSpinPrize.ts`. Its branch here was the
|
|
33
|
+
* second-worst shaped of the nine: it returned early with **no `reason`**, and
|
|
34
|
+
* the route decides success by `if (data.reason && !data.raffleWinnerUserId)`,
|
|
35
|
+
* so a disabled feature answered `200 "Raffle triggered"` with no winner.
|
|
4
36
|
*/
|
|
5
37
|
import type { JobContext } from "../runtime/types";
|
|
6
38
|
export interface TriggerEventRaffleInput {
|
|
@@ -9,9 +41,12 @@ export interface TriggerEventRaffleInput {
|
|
|
9
41
|
topN?: number;
|
|
10
42
|
}
|
|
11
43
|
export interface TriggerEventRaffleResult {
|
|
44
|
+
/** The canonical DOCUMENT ID, even when the caller passed a slug. */
|
|
12
45
|
eventId: string;
|
|
13
46
|
raffleWinnerUserId?: string;
|
|
14
47
|
raffleWinnerDisplayName?: string;
|
|
48
|
+
/** The prize coupon's CODE, resolved at draw time and recorded on the event. */
|
|
49
|
+
rafflePrizeCouponCode?: string;
|
|
15
50
|
raffleEntryCount: number;
|
|
16
51
|
alreadyTriggered?: boolean;
|
|
17
52
|
reason?: string;
|