@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
|
@@ -7,6 +7,7 @@ export declare const couponExpiry: import("./types").ScheduledFunctionDefinition
|
|
|
7
7
|
export declare const offerExpiry: import("./types").ScheduledFunctionDefinition;
|
|
8
8
|
export declare const productStatsSync: import("./types").ScheduledFunctionDefinition;
|
|
9
9
|
export declare const revenueRollup: import("./types").ScheduledFunctionDefinition;
|
|
10
|
+
export declare const searchIndexBuild: import("./types").ScheduledFunctionDefinition;
|
|
10
11
|
export declare const priceIndexRollup: import("./types").ScheduledFunctionDefinition;
|
|
11
12
|
export declare const analyticsAlertEvaluate: import("./types").ScheduledFunctionDefinition;
|
|
12
13
|
export declare const pageViewRollup: import("./types").ScheduledFunctionDefinition;
|
|
@@ -27,4 +28,4 @@ export declare const prizeDrawExpiryReveal: import("./types").ScheduledFunctionD
|
|
|
27
28
|
export declare const bundleStockSync: import("./types").ScheduledFunctionDefinition;
|
|
28
29
|
export declare const emiInstallmentReminder: import("./types").ScheduledFunctionDefinition;
|
|
29
30
|
export declare const catalogueImageStalenessReminder: import("./types").ScheduledFunctionDefinition;
|
|
30
|
-
export declare const SCHEDULED_FUNCTIONS: readonly [import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition];
|
|
31
|
+
export declare const SCHEDULED_FUNCTIONS: readonly [import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition, import("./types").ScheduledFunctionDefinition];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Scheduled function definitions (Cloud Scheduler triggers).
|
|
2
2
|
// Cron syntax accepts both Firebase shorthand and standard cron expressions.
|
|
3
|
-
import { auctionSettlementHandler, autoPayoutEligibilityHandler, bundleStockSyncHandler, cartPruneHandler, cleanupRtdbEventsHandler, countersReconcileHandler, couponExpiryHandler, dailyDataCleanupHandler, draftPruneHandler, emiInstallmentReminderHandler, catalogueImageStalenessReminderHandler, mediaTmpCleanupHandler, notificationPruneHandler, offerExpiryHandler, paymentWindowTimeoutHandler, hardBanReinstatementHandler, paymentReviewAutoApproveHandler, pendingOrderTimeoutHandler, positionsReconcileHandler, prizeDrawExpiryRevealHandler, productStatsSyncHandler, revenueRollupHandler, priceIndexRollupHandler, analyticsAlertEvaluateHandler, pageViewRollupHandler, pageViewPruneHandler, dailyStatusDigestHandler, weeklyPayoutEligibilityHandler, testDataCleanupHandler, } from "../jobs/handlers/index.js";
|
|
3
|
+
import { auctionSettlementHandler, autoPayoutEligibilityHandler, bundleStockSyncHandler, cartPruneHandler, cleanupRtdbEventsHandler, countersReconcileHandler, couponExpiryHandler, dailyDataCleanupHandler, draftPruneHandler, emiInstallmentReminderHandler, catalogueImageStalenessReminderHandler, mediaTmpCleanupHandler, notificationPruneHandler, offerExpiryHandler, paymentWindowTimeoutHandler, hardBanReinstatementHandler, paymentReviewAutoApproveHandler, pendingOrderTimeoutHandler, positionsReconcileHandler, prizeDrawExpiryRevealHandler, productStatsSyncHandler, revenueRollupHandler, priceIndexRollupHandler, searchIndexBuildHandler, analyticsAlertEvaluateHandler, pageViewRollupHandler, pageViewPruneHandler, dailyStatusDigestHandler, weeklyPayoutEligibilityHandler, testDataCleanupHandler, } from "../jobs/handlers/index.js";
|
|
4
4
|
import { defineFunction } from "./define.js";
|
|
5
5
|
const REGION = "asia-south1";
|
|
6
6
|
const EVERY_5_MIN = "every 5 minutes";
|
|
@@ -83,6 +83,29 @@ export const revenueRollup = defineFunction({
|
|
|
83
83
|
* additionally drop each category page's ISR entry nightly on a project that
|
|
84
84
|
* was paused for exceeding ISR writes by 15.5Γ.
|
|
85
85
|
*/
|
|
86
|
+
/*
|
|
87
|
+
* Build the public search index artifact β every 15 minutes, but it EXITS on
|
|
88
|
+
* one read unless something changed.
|
|
89
|
+
*
|
|
90
|
+
* π The cadence is not the cost. Firestore bills per document read
|
|
91
|
+
* regardless of `select()`, so a full rebuild at this cadence would be
|
|
92
|
+
* ~358,000 reads/day against a 50,000/day tier. The job is idle-exit /
|
|
93
|
+
* incremental / daily-full instead, landing at ~4,000/day. See the core's
|
|
94
|
+
* header; it logs its mode and read count on every run so a regression to
|
|
95
|
+
* always-full is visible before it is a quota wall.
|
|
96
|
+
*
|
|
97
|
+
* Its own job rather than folded into an existing cadence: `countersReconcile`
|
|
98
|
+
* and `productStatsSync` already run near their 540s ceiling, and a rebuild
|
|
99
|
+
* failing inside one would take category metrics down with it β the argument
|
|
100
|
+
* `priceIndexRollup` makes directly below.
|
|
101
|
+
*/
|
|
102
|
+
export const searchIndexBuild = defineFunction({
|
|
103
|
+
name: "searchIndexBuild",
|
|
104
|
+
description: "Build the public search index artifact into Storage (idle-exit / incremental / daily full).",
|
|
105
|
+
trigger: { kind: "schedule", cron: "*/15 * * * *", timeZone: "UTC" },
|
|
106
|
+
handler: searchIndexBuildHandler,
|
|
107
|
+
options: { region: REGION, timeoutSeconds: 540, memory: "512MiB", maxInstances: 1 },
|
|
108
|
+
});
|
|
86
109
|
export const priceIndexRollup = defineFunction({
|
|
87
110
|
name: "priceIndexRollup",
|
|
88
111
|
description: "Roll up realised sale prices per leaf category into priceIndex/{leafId} (daily 04:30 UTC = 10:00 IST).",
|
|
@@ -277,6 +300,7 @@ export const SCHEDULED_FUNCTIONS = [
|
|
|
277
300
|
productStatsSync,
|
|
278
301
|
revenueRollup,
|
|
279
302
|
priceIndexRollup,
|
|
303
|
+
searchIndexBuild,
|
|
280
304
|
analyticsAlertEvaluate,
|
|
281
305
|
pageViewRollup,
|
|
282
306
|
pageViewPrune,
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve an event reference from a value that may be either a document id or
|
|
3
|
+
* a slug β the ONE implementation for the `ctx.db` (job-core) layer.
|
|
4
|
+
*
|
|
5
|
+
* ## Why this exists
|
|
6
|
+
*
|
|
7
|
+
* Public URLs link by SLUG: `EventCard` builds its href from
|
|
8
|
+
* `event.slug ?? event.id`, and `/events/[id]/participate` reuses that same
|
|
9
|
+
* route param. So every job core reached from a public surface receives a slug
|
|
10
|
+
* far more often than an id.
|
|
11
|
+
*
|
|
12
|
+
* `assignSpinPrize` and `triggerEventRaffle` both did a bare
|
|
13
|
+
* `.collection("events").doc(eventId).get()` with no slug fallback, so a spin
|
|
14
|
+
* launched from any card link returned `event_not_found` β 404 on every
|
|
15
|
+
* attempt, forever. `enterEvent` had always resolved it correctly
|
|
16
|
+
* (`eventRepository.findByIdOrSlug`, under a comment saying "eventId may have
|
|
17
|
+
* arrived as a slug (public URLs link by slug)"); the two job cores were the
|
|
18
|
+
* copies that never learned the rule.
|
|
19
|
+
*
|
|
20
|
+
* ## Why not `eventRepository.findByIdOrSlug`
|
|
21
|
+
*
|
|
22
|
+
* That is the right call at the repository layer and `enterEvent` keeps using
|
|
23
|
+
* it. A job core holds a raw `Firestore` from `JobContext` and no repository β
|
|
24
|
+
* and no repository in this codebase imports another feature's, because of the
|
|
25
|
+
* Turbopack import-chain trap (Root Cause #6/#18). A raw collection read has
|
|
26
|
+
* neither problem. This function also returns the `DocumentReference`, which a
|
|
27
|
+
* repository method cannot, and the cores need it to write.
|
|
28
|
+
*
|
|
29
|
+
* ## Slug first, deliberately
|
|
30
|
+
*
|
|
31
|
+
* Mirrors `findByIdOrSlug`'s own order. The common caller is a public URL, so
|
|
32
|
+
* the slug query hits on the first try; an id lookup then costs one extra
|
|
33
|
+
* query only on the admin path, where it is already behind a role gate.
|
|
34
|
+
*/
|
|
35
|
+
import type { DocumentReference, Firestore } from "firebase-admin/firestore";
|
|
36
|
+
export interface ResolvedEventRef<T = unknown> {
|
|
37
|
+
/** The canonical DOCUMENT ID β never the slug, whichever was passed in. */
|
|
38
|
+
id: string;
|
|
39
|
+
ref: DocumentReference;
|
|
40
|
+
data: T;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* @returns the resolved event, or `null` when neither a slug nor an id matches.
|
|
44
|
+
*
|
|
45
|
+
* π Callers must use the returned `id` for every subsequent query and write.
|
|
46
|
+
* Carrying the caller's original `idOrSlug` forward is how a guest identity
|
|
47
|
+
* ends up hashed on the slug on one path and on the doc id on another β two
|
|
48
|
+
* identities for one person on one event, which silently resets any per-user
|
|
49
|
+
* cap (see `hashGuestIdentity` at the spin route).
|
|
50
|
+
*/
|
|
51
|
+
export declare function resolveEventRef<T = unknown>(db: Firestore, idOrSlug: string): Promise<ResolvedEventRef<T> | null>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve an event reference from a value that may be either a document id or
|
|
3
|
+
* a slug β the ONE implementation for the `ctx.db` (job-core) layer.
|
|
4
|
+
*
|
|
5
|
+
* ## Why this exists
|
|
6
|
+
*
|
|
7
|
+
* Public URLs link by SLUG: `EventCard` builds its href from
|
|
8
|
+
* `event.slug ?? event.id`, and `/events/[id]/participate` reuses that same
|
|
9
|
+
* route param. So every job core reached from a public surface receives a slug
|
|
10
|
+
* far more often than an id.
|
|
11
|
+
*
|
|
12
|
+
* `assignSpinPrize` and `triggerEventRaffle` both did a bare
|
|
13
|
+
* `.collection("events").doc(eventId).get()` with no slug fallback, so a spin
|
|
14
|
+
* launched from any card link returned `event_not_found` β 404 on every
|
|
15
|
+
* attempt, forever. `enterEvent` had always resolved it correctly
|
|
16
|
+
* (`eventRepository.findByIdOrSlug`, under a comment saying "eventId may have
|
|
17
|
+
* arrived as a slug (public URLs link by slug)"); the two job cores were the
|
|
18
|
+
* copies that never learned the rule.
|
|
19
|
+
*
|
|
20
|
+
* ## Why not `eventRepository.findByIdOrSlug`
|
|
21
|
+
*
|
|
22
|
+
* That is the right call at the repository layer and `enterEvent` keeps using
|
|
23
|
+
* it. A job core holds a raw `Firestore` from `JobContext` and no repository β
|
|
24
|
+
* and no repository in this codebase imports another feature's, because of the
|
|
25
|
+
* Turbopack import-chain trap (Root Cause #6/#18). A raw collection read has
|
|
26
|
+
* neither problem. This function also returns the `DocumentReference`, which a
|
|
27
|
+
* repository method cannot, and the cores need it to write.
|
|
28
|
+
*
|
|
29
|
+
* ## Slug first, deliberately
|
|
30
|
+
*
|
|
31
|
+
* Mirrors `findByIdOrSlug`'s own order. The common caller is a public URL, so
|
|
32
|
+
* the slug query hits on the first try; an id lookup then costs one extra
|
|
33
|
+
* query only on the admin path, where it is already behind a role gate.
|
|
34
|
+
*/
|
|
35
|
+
import { EVENT_FIELDS } from "../../../../constants/field-names.js";
|
|
36
|
+
const EVENTS_COLLECTION = "events";
|
|
37
|
+
/**
|
|
38
|
+
* @returns the resolved event, or `null` when neither a slug nor an id matches.
|
|
39
|
+
*
|
|
40
|
+
* π Callers must use the returned `id` for every subsequent query and write.
|
|
41
|
+
* Carrying the caller's original `idOrSlug` forward is how a guest identity
|
|
42
|
+
* ends up hashed on the slug on one path and on the doc id on another β two
|
|
43
|
+
* identities for one person on one event, which silently resets any per-user
|
|
44
|
+
* cap (see `hashGuestIdentity` at the spin route).
|
|
45
|
+
*/
|
|
46
|
+
export async function resolveEventRef(db, idOrSlug) {
|
|
47
|
+
if (!idOrSlug)
|
|
48
|
+
return null;
|
|
49
|
+
const bySlug = await db
|
|
50
|
+
.collection(EVENTS_COLLECTION)
|
|
51
|
+
.where(EVENT_FIELDS.SLUG, "==", idOrSlug)
|
|
52
|
+
.limit(1)
|
|
53
|
+
.get();
|
|
54
|
+
if (!bySlug.empty) {
|
|
55
|
+
const doc = bySlug.docs[0];
|
|
56
|
+
return { id: doc.id, ref: doc.ref, data: doc.data() };
|
|
57
|
+
}
|
|
58
|
+
const byId = await db.collection(EVENTS_COLLECTION).doc(idOrSlug).get();
|
|
59
|
+
if (byId.exists) {
|
|
60
|
+
return { id: byId.id, ref: byId.ref, data: byId.data() };
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
@@ -9,6 +9,23 @@
|
|
|
9
9
|
* find/create/assign/mark-used sequence runs inside a single Firestore
|
|
10
10
|
* transaction so two rapid spins from the same identity can't both win a
|
|
11
11
|
* prize (the old read-then-`ref.update()` version had this race).
|
|
12
|
+
*
|
|
13
|
+
* ## Every non-success branch returns a `reason`, and that is load-bearing
|
|
14
|
+
*
|
|
15
|
+
* Both entry points β `POST /api/events/[id]/spin` and the Firebase callable β
|
|
16
|
+
* decide success by `if (data.reason && !data.spinPrizeId)`. A branch that
|
|
17
|
+
* returns early WITHOUT a reason is therefore reported to the caller as a
|
|
18
|
+
* successful spin that awarded nothing. Reasons come from
|
|
19
|
+
* `EVENT_DRAW_REASON`; `reasonToHttp` turns each into one status and one
|
|
20
|
+
* stable code for both entry points (Root Cause #85).
|
|
21
|
+
*
|
|
22
|
+
* The `FEATURE_PRIZE_DRAWS` gate that used to open this function was DELETED
|
|
23
|
+
* on 2026-10-19. The whole `FEATURE_*` mechanism had already been retired β
|
|
24
|
+
* `audit-feature-flags` bans it strict-zero and `.env.example` declares no
|
|
25
|
+
* such key β but that audit only matched `process.env.FEATURE_*`, and this
|
|
26
|
+
* read it as `ctx.env("FEATURE_PRIZE_DRAWS")`, which the regex could not see.
|
|
27
|
+
* So an env var nothing documented was never set in production and every spin
|
|
28
|
+
* returned 503 `feature_disabled` while the Spin button rendered enabled.
|
|
12
29
|
*/
|
|
13
30
|
import type { JobContext } from "../runtime/types";
|
|
14
31
|
export interface AssignSpinPrizeInput {
|
|
@@ -19,6 +36,7 @@ export interface AssignSpinPrizeInput {
|
|
|
19
36
|
guestIpHash?: string;
|
|
20
37
|
}
|
|
21
38
|
export interface AssignSpinPrizeResult {
|
|
39
|
+
/** The canonical DOCUMENT ID, even when the caller passed a slug. */
|
|
22
40
|
eventId: string;
|
|
23
41
|
userId?: string;
|
|
24
42
|
spinPrizeId?: string;
|
|
@@ -9,39 +9,88 @@
|
|
|
9
9
|
* find/create/assign/mark-used sequence runs inside a single Firestore
|
|
10
10
|
* transaction so two rapid spins from the same identity can't both win a
|
|
11
11
|
* prize (the old read-then-`ref.update()` version had this race).
|
|
12
|
+
*
|
|
13
|
+
* ## Every non-success branch returns a `reason`, and that is load-bearing
|
|
14
|
+
*
|
|
15
|
+
* Both entry points β `POST /api/events/[id]/spin` and the Firebase callable β
|
|
16
|
+
* decide success by `if (data.reason && !data.spinPrizeId)`. A branch that
|
|
17
|
+
* returns early WITHOUT a reason is therefore reported to the caller as a
|
|
18
|
+
* successful spin that awarded nothing. Reasons come from
|
|
19
|
+
* `EVENT_DRAW_REASON`; `reasonToHttp` turns each into one status and one
|
|
20
|
+
* stable code for both entry points (Root Cause #85).
|
|
21
|
+
*
|
|
22
|
+
* The `FEATURE_PRIZE_DRAWS` gate that used to open this function was DELETED
|
|
23
|
+
* on 2026-10-19. The whole `FEATURE_*` mechanism had already been retired β
|
|
24
|
+
* `audit-feature-flags` bans it strict-zero and `.env.example` declares no
|
|
25
|
+
* such key β but that audit only matched `process.env.FEATURE_*`, and this
|
|
26
|
+
* read it as `ctx.env("FEATURE_PRIZE_DRAWS")`, which the regex could not see.
|
|
27
|
+
* So an env var nothing documented was never set in production and every spin
|
|
28
|
+
* returned 503 `feature_disabled` while the Spin button rendered enabled.
|
|
12
29
|
*/
|
|
13
30
|
import crypto from "node:crypto";
|
|
14
|
-
import { EVENT_ENTRY_FIELDS, COMMON_FIELDS } from "../../../../constants/field-names.js";
|
|
31
|
+
import { EVENT_ENTRY_FIELDS, EVENT_FIELDS, COMMON_FIELDS, } from "../../../../constants/field-names.js";
|
|
15
32
|
import { resolveDate } from "../../../../utils/index.js";
|
|
16
|
-
|
|
33
|
+
import { resolveEventRef } from "./_event-ref.js";
|
|
34
|
+
import { EVENT_DRAW_REASON } from "./event-draw-reasons.js";
|
|
17
35
|
const EVENT_ENTRIES_COLLECTION = "eventEntries";
|
|
18
36
|
const COUPONS_COLLECTION = "coupons";
|
|
19
37
|
export async function runAssignSpinPrize(input, ctx) {
|
|
20
|
-
|
|
21
|
-
ctx.logger.info("FEATURE_PRIZE_DRAWS disabled β skipping spin prize assignment");
|
|
22
|
-
return { eventId: input.eventId, userId: input.userId, reason: "feature_disabled" };
|
|
23
|
-
}
|
|
24
|
-
const { eventId, userId, guestIpHash } = input;
|
|
38
|
+
const { userId, guestIpHash } = input;
|
|
25
39
|
if (!userId && !guestIpHash) {
|
|
26
|
-
return {
|
|
40
|
+
return {
|
|
41
|
+
eventId: input.eventId,
|
|
42
|
+
userId,
|
|
43
|
+
reason: EVENT_DRAW_REASON.IDENTITY_REQUIRED,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/*
|
|
47
|
+
* π Slug-or-id, not `.doc(eventId)`. Public URLs link by SLUG (`EventCard`
|
|
48
|
+
* builds its href from `event.slug ?? event.id`, and the participate tab
|
|
49
|
+
* reuses that param), so a spin launched from any card link used to resolve
|
|
50
|
+
* to nothing and return `event_not_found` β a 404 on every attempt, forever.
|
|
51
|
+
*
|
|
52
|
+
* Every query and write below uses the RESOLVED `eventId`, never the
|
|
53
|
+
* caller's input: carrying the slug forward is what let one guest count as
|
|
54
|
+
* two identities and silently reset `spinMaxPerUser`.
|
|
55
|
+
*/
|
|
56
|
+
const resolved = await resolveEventRef(ctx.db, input.eventId);
|
|
57
|
+
if (!resolved) {
|
|
58
|
+
return {
|
|
59
|
+
eventId: input.eventId,
|
|
60
|
+
userId,
|
|
61
|
+
reason: EVENT_DRAW_REASON.EVENT_NOT_FOUND,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const eventId = resolved.id;
|
|
65
|
+
const event = resolved.data;
|
|
66
|
+
/*
|
|
67
|
+
* The page redirects a non-running event to the overview, so these were
|
|
68
|
+
* never reachable through the UI β but `POST /api/events/<ended>/spin`
|
|
69
|
+
* answered 200 and awarded a prize. A redirect is navigation, not a
|
|
70
|
+
* precondition.
|
|
71
|
+
*/
|
|
72
|
+
if (event.type && event.type !== EVENT_FIELDS.TYPE_VALUES.SPIN_WHEEL) {
|
|
73
|
+
return { eventId, userId, reason: EVENT_DRAW_REASON.NOT_A_SPIN_WHEEL };
|
|
27
74
|
}
|
|
28
|
-
const
|
|
29
|
-
if (
|
|
30
|
-
|
|
75
|
+
const endsAt = resolveDate(event.endsAt);
|
|
76
|
+
if (event.status !== EVENT_FIELDS.STATUS_VALUES.ACTIVE ||
|
|
77
|
+
(endsAt && ctx.now > endsAt)) {
|
|
78
|
+
return { eventId, userId, reason: EVENT_DRAW_REASON.NOT_ACTIVE };
|
|
31
79
|
}
|
|
32
|
-
const event = eventSnap.data();
|
|
33
80
|
if (!userId && !event.allowGuestParticipation) {
|
|
34
|
-
return { eventId, userId, reason:
|
|
81
|
+
return { eventId, userId, reason: EVENT_DRAW_REASON.LOGIN_REQUIRED };
|
|
35
82
|
}
|
|
36
|
-
|
|
83
|
+
// Active prizes only β see the `isActive` note on SpinPrize. The weighted
|
|
84
|
+
// pick below iterates this same array, so the gate and the draw agree.
|
|
85
|
+
const prizes = (Array.isArray(event.spinPrizes) ? event.spinPrizes : []).filter((p) => p.isActive !== false);
|
|
37
86
|
const totalWeight = prizes.reduce((s, p) => s + (p.weight ?? 0), 0);
|
|
38
87
|
if (totalWeight <= 0) {
|
|
39
|
-
return { eventId, userId, reason:
|
|
88
|
+
return { eventId, userId, reason: EVENT_DRAW_REASON.NO_PRIZES_CONFIGURED };
|
|
40
89
|
}
|
|
41
90
|
const windowStart = resolveDate(event.spinWindowStart);
|
|
42
91
|
const windowEnd = resolveDate(event.spinWindowEnd);
|
|
43
92
|
if ((windowStart && ctx.now < windowStart) || (windowEnd && ctx.now > windowEnd)) {
|
|
44
|
-
return { eventId, userId, reason:
|
|
93
|
+
return { eventId, userId, reason: EVENT_DRAW_REASON.OUTSIDE_SPIN_WINDOW };
|
|
45
94
|
}
|
|
46
95
|
const maxPerUser = typeof event.spinMaxPerUser === "number" && event.spinMaxPerUser > 0
|
|
47
96
|
? event.spinMaxPerUser
|
|
@@ -59,11 +108,23 @@ export async function runAssignSpinPrize(input, ctx) {
|
|
|
59
108
|
const existingData = existingDoc?.data();
|
|
60
109
|
const priorSpinCount = existingData?.spinCount ?? (existingData?.spinUsed ? 1 : 0);
|
|
61
110
|
if (priorSpinCount >= maxPerUser) {
|
|
111
|
+
/*
|
|
112
|
+
* π `reason` is REQUIRED here, and its absence was a bug.
|
|
113
|
+
*
|
|
114
|
+
* Both entry points gate on `if (data.reason && !data.spinPrizeId)`, so
|
|
115
|
+
* this branch used to fall through to `successResponse(β¦, "Spin
|
|
116
|
+
* recorded")` β HTTP 200 for a refusal. When the stored entry happened
|
|
117
|
+
* to carry no `spinPrizeId`, the client then saw a 200 with no prize and
|
|
118
|
+
* printed "Spin failed. Please try again." for what is really "you have
|
|
119
|
+
* already spun".
|
|
120
|
+
*/
|
|
62
121
|
return {
|
|
63
122
|
eventId,
|
|
64
123
|
userId,
|
|
65
124
|
spinPrizeId: existingData?.spinPrizeId,
|
|
125
|
+
spinPrizeCouponCode: existingData?.spinPrizeCouponCode ?? undefined,
|
|
66
126
|
alreadyUsed: true,
|
|
127
|
+
reason: EVENT_DRAW_REASON.ALREADY_USED,
|
|
67
128
|
};
|
|
68
129
|
}
|
|
69
130
|
const roll = crypto.randomInt(0, totalWeight);
|
|
@@ -211,10 +211,19 @@ async function settleAuction(ctx, product) {
|
|
|
211
211
|
});
|
|
212
212
|
}
|
|
213
213
|
export async function runAuctionSettlement(ctx) {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
214
|
+
/*
|
|
215
|
+
* π `FEATURE_AUCTIONS` gate DELETED 2026-10-19, and this one was live.
|
|
216
|
+
*
|
|
217
|
+
* The flag mechanism was retired on 2026-08-29, but `audit-feature-flags`
|
|
218
|
+
* only matched `process.env.FEATURE_*` and this read it through
|
|
219
|
+
* `ctx.env(...)` β so it survived unseen. This is a SCHEDULED Firebase
|
|
220
|
+
* Function, which reads `functions/.env.<projectId>`, and measured on
|
|
221
|
+
* 2026-10-19 that file contains exactly one flag: `FEATURE_PAYOUTS=true`.
|
|
222
|
+
* `FEATURE_AUCTIONS` was never set there, so this sweep returned on its
|
|
223
|
+
* first line on every run β no expired auction was ever settled in
|
|
224
|
+
* production, no winner ever got a cart line, and the only trace was an
|
|
225
|
+
* `info` log saying it had been skipped.
|
|
226
|
+
*/
|
|
218
227
|
ctx.logger.info("Starting auction settlement sweep");
|
|
219
228
|
const expired = await productRepository.getExpiredAuctions(ctx.now);
|
|
220
229
|
if (expired.length === 0) {
|
|
@@ -12,10 +12,10 @@ function getBusinessDayCutoff(daysAgo) {
|
|
|
12
12
|
return cutoff;
|
|
13
13
|
}
|
|
14
14
|
export async function runAutoPayoutEligibility(ctx) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
// `FEATURE_PAYOUTS` gate deleted 2026-10-19 β see `auctionSettlement.ts`.
|
|
16
|
+
// This was the one flag actually set (`functions/.env.letitrip-in-app`), so
|
|
17
|
+
// unlike its four siblings this job was running; removing the gate is a
|
|
18
|
+
// no-op in behaviour and removes the lever that could silently stop payouts.
|
|
19
19
|
ctx.logger.info("Starting daily auto-payout eligibility sweep", {
|
|
20
20
|
windowDays: AUTO_PAYOUT_WINDOW_DAYS,
|
|
21
21
|
});
|
|
@@ -48,6 +48,26 @@ export async function runAutoPayoutEligibility(ctx) {
|
|
|
48
48
|
ctx.logger.warn(`Store/seller ${storeId} not found β skipping ${orders.length} order(s)`, { orderIds: orders.map((o) => o.id) });
|
|
49
49
|
continue;
|
|
50
50
|
}
|
|
51
|
+
/*
|
|
52
|
+
* π REVEALED before building a payout. This is the fix for active data
|
|
53
|
+
* corruption, not a style change.
|
|
54
|
+
*
|
|
55
|
+
* `userRepository.findById` is ciphertext-by-default, and
|
|
56
|
+
* `payoutRepository.createPayout` ENCRYPTS `sellerEmail` and `upiId`
|
|
57
|
+
* (`PAYOUT_PII_FIELDS`). Passing the stored values straight through
|
|
58
|
+
* encrypted them a SECOND time, and nothing in the codebase ever
|
|
59
|
+
* double-decrypts β so every payout this cron wrote carried a
|
|
60
|
+
* permanently unreadable `upiId`, which is the field the money is sent to.
|
|
61
|
+
*
|
|
62
|
+
* It also poisoned the blind index: `piiIndicesFor` HMACs whatever it is
|
|
63
|
+
* given, so hashing already-encrypted input produced a valid-looking
|
|
64
|
+
* `sellerEmailIndex` that can never match a lookup by the real address.
|
|
65
|
+
*
|
|
66
|
+
* `payoutDetails` needs its own unwrap because it is encrypted by
|
|
67
|
+
* `encryptPayoutDetails`, a separate scheme from the `piiFields` path, so
|
|
68
|
+
* `revealUser` handles it explicitly.
|
|
69
|
+
*/
|
|
70
|
+
const sellerPlain = userRepository.revealUser(seller);
|
|
51
71
|
const sellerId = store.ownerId;
|
|
52
72
|
/*
|
|
53
73
|
* The TAXABLE VALUE β see `orderTaxableValue`. Two narrowings, both
|
|
@@ -65,8 +85,9 @@ export async function runAutoPayoutEligibility(ctx) {
|
|
|
65
85
|
const { platformFee, gatewayFee, gstOnFee: gstAmount, netAmount } = computePayoutDeduction(grossAmount, commissions);
|
|
66
86
|
const payoutInput = {
|
|
67
87
|
storeId,
|
|
68
|
-
|
|
69
|
-
|
|
88
|
+
// `displayName` is plaintext by D1; the email fallback must be revealed.
|
|
89
|
+
sellerName: (seller.displayName ?? sellerPlain.email ?? sellerId),
|
|
90
|
+
sellerEmail: sellerPlain.email ?? "",
|
|
70
91
|
orderIds: orders.map((o) => o.id),
|
|
71
92
|
amount: netAmount,
|
|
72
93
|
grossAmount,
|
|
@@ -79,23 +100,31 @@ export async function runAutoPayoutEligibility(ctx) {
|
|
|
79
100
|
isAutomatic: true,
|
|
80
101
|
currency: getDefaultCurrency(),
|
|
81
102
|
status: "pending",
|
|
82
|
-
paymentMethod:
|
|
103
|
+
paymentMethod: sellerPlain.payoutDetails?.method === "upi"
|
|
83
104
|
? "upi"
|
|
84
105
|
: "bank_transfer",
|
|
85
|
-
upiId:
|
|
86
|
-
|
|
87
|
-
|
|
106
|
+
upiId: sellerPlain.payoutDetails?.method === "upi"
|
|
107
|
+
? sellerPlain.payoutDetails.upiId
|
|
108
|
+
: undefined,
|
|
109
|
+
/*
|
|
110
|
+
* Only the MASKED account fields are copied, which is why this block
|
|
111
|
+
* escaped the double-encryption above β `accountNumberMasked`,
|
|
112
|
+
* `ifscCode` and `bankName` are in no PII list. The real
|
|
113
|
+
* `accountNumber` is deliberately not carried onto the payout.
|
|
114
|
+
*/
|
|
115
|
+
bankAccount: sellerPlain.payoutDetails?.method === "bank_transfer" &&
|
|
116
|
+
sellerPlain.payoutDetails.bankAccount
|
|
88
117
|
? {
|
|
89
|
-
accountHolderName:
|
|
90
|
-
accountNumberMasked:
|
|
91
|
-
ifscCode:
|
|
92
|
-
bankName:
|
|
118
|
+
accountHolderName: sellerPlain.payoutDetails.bankAccount.accountHolderName,
|
|
119
|
+
accountNumberMasked: sellerPlain.payoutDetails.bankAccount.accountNumberMasked,
|
|
120
|
+
ifscCode: sellerPlain.payoutDetails.bankAccount.ifscCode,
|
|
121
|
+
bankName: sellerPlain.payoutDetails.bankAccount.bankName,
|
|
93
122
|
}
|
|
94
123
|
: undefined,
|
|
95
124
|
notes: `Auto-payout β ${orders.length} delivered order(s) past ${AUTO_PAYOUT_WINDOW_DAYS}-day window`,
|
|
96
125
|
requestedAt: new Date(),
|
|
97
126
|
};
|
|
98
|
-
const { id: payoutId } = await payoutRepository.
|
|
127
|
+
const { id: payoutId } = await payoutRepository.createPayout(payoutInput);
|
|
99
128
|
for (let i = 0; i < orders.length; i += BATCH_LIMIT) {
|
|
100
129
|
const slice = orders.slice(i, i + BATCH_LIMIT);
|
|
101
130
|
const batch = ctx.db.batch();
|
|
@@ -51,10 +51,9 @@ async function sweepBundleMembers(productIds, ctx) {
|
|
|
51
51
|
};
|
|
52
52
|
}
|
|
53
53
|
export async function runBundleStockSync(ctx) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
54
|
+
// `FEATURE_BUNDLES` gate deleted 2026-10-19 β see `auctionSettlement.ts` for
|
|
55
|
+
// why these survived the 2026-08-29 flag retirement. Unset in
|
|
56
|
+
// `functions/.env.letitrip-in-app`, so this scheduled sweep had never run.
|
|
58
57
|
ctx.logger.info("Bundle stock sync starting (SB-UNI-V categories)");
|
|
59
58
|
const snap = await ctx.db
|
|
60
59
|
.collection(CATEGORIES_COLLECTION)
|
|
@@ -16,6 +16,16 @@ const EMAIL_STALE_MS = 60 * 60 * 1000;
|
|
|
16
16
|
/** Long enough for an open thread to notice a ping before it prunes; the
|
|
17
17
|
* message itself lives in Firestore regardless β this only clears the ping. */
|
|
18
18
|
const CHAT_STALE_MS = 15 * 60 * 1000;
|
|
19
|
+
/**
|
|
20
|
+
* π SIXTY minutes, and the four-times-longer window is load-bearing rather
|
|
21
|
+
* than cautious. A `max`-tier trace fans out across up to sixty parts and can
|
|
22
|
+
* exceed fifteen minutes end to end; a channel pruned while the run is still
|
|
23
|
+
* working reads to the client as "it died", which is the one signal this
|
|
24
|
+
* channel exists to make impossible. The durable history is on the run
|
|
25
|
+
* document, so the cost of keeping the node an hour is a handful of small
|
|
26
|
+
* nodes and the cost of dropping it early is a false failure report.
|
|
27
|
+
*/
|
|
28
|
+
const STICKER_TRACE_STALE_MS = 60 * 60 * 1000;
|
|
19
29
|
const JOBS_TTL_DAYS = 30;
|
|
20
30
|
export async function runCleanupRtdbEvents(ctx) {
|
|
21
31
|
ctx.logger.info("Starting RTDB events cleanup");
|
|
@@ -111,6 +121,40 @@ export async function runCleanupRtdbEvents(ctx) {
|
|
|
111
121
|
void normalizeError(emailErr);
|
|
112
122
|
ctx.logger.error("Email events cleanup failed (non-fatal)", emailErr);
|
|
113
123
|
}
|
|
124
|
+
/*
|
|
125
|
+
* Sticker kiss-cut tracer progress channels. One node per run, overwritten
|
|
126
|
+
* in place as the trace advances, so the channel's size is bounded by
|
|
127
|
+
* concurrent runs rather than by history β but only because this prunes it.
|
|
128
|
+
* `auction-bids/*` is the Firebase budget's one family with no TTL; do not
|
|
129
|
+
* make this the second.
|
|
130
|
+
*
|
|
131
|
+
* The run DOCUMENT keeps the durable event log, so removing a node loses
|
|
132
|
+
* nothing a retry panel or a post-mortem reads.
|
|
133
|
+
*/
|
|
134
|
+
try {
|
|
135
|
+
const traceSnap = await rtdb.ref(RTDB_PATHS.STICKER_TRACE).get();
|
|
136
|
+
if (traceSnap.exists()) {
|
|
137
|
+
const allTraceNodes = traceSnap.val();
|
|
138
|
+
const staleTraceIds = Object.entries(allTraceNodes)
|
|
139
|
+
.filter(([, node]) => {
|
|
140
|
+
const at = node.updatedAt ?? 0;
|
|
141
|
+
// Missing or non-finite is stale BY DEFINITION β it can never age
|
|
142
|
+
// out on its own, so leaving it would pin the node forever.
|
|
143
|
+
return !Number.isFinite(at) || at === 0 || at < now - STICKER_TRACE_STALE_MS;
|
|
144
|
+
})
|
|
145
|
+
.map(([id]) => id);
|
|
146
|
+
if (staleTraceIds.length > 0) {
|
|
147
|
+
await Promise.all(staleTraceIds.map((id) => rtdb.ref(`${RTDB_PATHS.STICKER_TRACE}/${id}`).remove()));
|
|
148
|
+
ctx.logger.info("Sticker trace progress nodes removed", {
|
|
149
|
+
count: staleTraceIds.length,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch (traceErr) {
|
|
155
|
+
void normalizeError(traceErr);
|
|
156
|
+
ctx.logger.error("Sticker trace cleanup failed (non-fatal)", traceErr);
|
|
157
|
+
}
|
|
114
158
|
/*
|
|
115
159
|
* D9 β chat new-message pings. Its own file says it: "an unpruned RTDB
|
|
116
160
|
* channel is precisely the thing that quietly accumulates⦠Do not make it
|
|
@@ -0,0 +1,78 @@
|
|
|
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
|
+
export declare const EVENT_DRAW_REASON: {
|
|
42
|
+
/** Neither a signed-in user nor a hashed guest identity was supplied. */
|
|
43
|
+
readonly IDENTITY_REQUIRED: "identity_required";
|
|
44
|
+
/** Guest attempt on an event that has not opted into guest participation. */
|
|
45
|
+
readonly LOGIN_REQUIRED: "login_required";
|
|
46
|
+
readonly EVENT_NOT_FOUND: "event_not_found";
|
|
47
|
+
/** Draft / paused / cancelled / ended β see each core's status precondition. */
|
|
48
|
+
readonly NOT_ACTIVE: "not_active";
|
|
49
|
+
readonly NO_PRIZES_CONFIGURED: "no_prizes_configured";
|
|
50
|
+
readonly OUTSIDE_SPIN_WINDOW: "outside_spin_window";
|
|
51
|
+
/** This identity has already consumed its `spinMaxPerUser` allowance. */
|
|
52
|
+
readonly ALREADY_USED: "already_used";
|
|
53
|
+
readonly NOT_A_SPIN_WHEEL: "not_a_spin_wheel";
|
|
54
|
+
readonly NOT_A_RAFFLE: "not_a_raffle";
|
|
55
|
+
/** A winner is already recorded; a second draw would mean two winners. */
|
|
56
|
+
readonly ALREADY_TRIGGERED: "already_triggered";
|
|
57
|
+
readonly NO_ELIGIBLE_ENTRIES: "no_eligible_entries";
|
|
58
|
+
};
|
|
59
|
+
export type EventDrawReason = (typeof EVENT_DRAW_REASON)[keyof typeof EVENT_DRAW_REASON];
|
|
60
|
+
export interface EventDrawHttpMapping {
|
|
61
|
+
status: number;
|
|
62
|
+
/** Stable code the client resolves through `toUserMessage` / `errors.codes.*`. */
|
|
63
|
+
code: string;
|
|
64
|
+
/**
|
|
65
|
+
* Developer-facing fallback sentence. The client renders copy from `code`, so
|
|
66
|
+
* this is what shows in a log, a curl, or a locale with no key β never the
|
|
67
|
+
* primary UI string.
|
|
68
|
+
*/
|
|
69
|
+
message: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Translate a core's `reason` into the response shape both entry points use.
|
|
73
|
+
*
|
|
74
|
+
* An unrecognised reason maps to **500**, not to the old 409 fallback: a reason
|
|
75
|
+
* this map has never heard of is a bug in the core, and a 5xx is what gets it
|
|
76
|
+
* recorded by `onRequestError` instead of being filed as an ordinary conflict.
|
|
77
|
+
*/
|
|
78
|
+
export declare function reasonToHttp(reason: string | undefined): EventDrawHttpMapping;
|