@mohasinac/appkit 4.52.4 → 4.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/server/features/auctions/actions.js +1 -1
- package/dist/_internal/server/features/categories/data.js +23 -7
- package/dist/_internal/server/features/checkout/actions.js +10 -3
- package/dist/_internal/server/features/checkout/data.d.ts +15 -0
- package/dist/_internal/server/features/checkout/data.js +20 -3
- 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 +4 -0
- 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/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/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 +1 -1
- 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 +80 -0
- package/dist/_internal/server/features/sticker-trace/adapters.js +174 -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.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 +141 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.js +279 -0
- package/dist/_internal/server/features/sticker-trace/storage.d.ts +135 -0
- package/dist/_internal/server/features/sticker-trace/storage.js +282 -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/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/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 +11 -0
- package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/art/config.js +1 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/auction/config.js +1 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/classified/config.js +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +1 -0
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
- package/dist/_internal/shared/listing-types/feature-flags.js +9 -0
- package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/live/config.js +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/standard/config.js +1 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +1 -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 +65 -0
- package/dist/_internal/shared/search/match.js +263 -0
- package/dist/client.d.ts +8 -7
- package/dist/client.js +12 -5
- package/dist/configs/eslint.js +22 -2
- package/dist/constants/api-endpoints.d.ts +68 -0
- package/dist/constants/api-endpoints.js +32 -0
- package/dist/constants/field-names.d.ts +7 -1
- package/dist/constants/field-names.js +36 -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/account/api/[userId]/addresses/route.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/addresses/repository/addresses.repository.d.ts +17 -6
- package/dist/features/addresses/repository/addresses.repository.js +65 -9
- package/dist/features/addresses/schemas/firestore.d.ts +17 -6
- 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 +0 -1
- package/dist/features/admin/components/AdminContactView.js +1 -1
- package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
- package/dist/features/admin/components/AdminNewsletterView.js +1 -1
- package/dist/features/admin/components/AdminOrdersView.js +9 -2
- 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 +24 -37
- 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/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 +1 -1
- 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/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 +62 -1
- 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/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 +33 -7
- package/dist/features/auth/repository/user.repository.js +100 -15
- package/dist/features/auth/schemas/firestore.d.ts +63 -12
- package/dist/features/auth/schemas/firestore.js +11 -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/cart/api/route.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/route.js +10 -10
- package/dist/features/categories/components/CategoryDetailPageView.js +35 -5
- package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
- package/dist/features/categories/components/index.d.ts +0 -2
- package/dist/features/categories/components/index.js +0 -1
- package/dist/features/categories/repository/categories.repository.d.ts +1 -0
- package/dist/features/categories/repository/categories.repository.js +31 -1
- package/dist/features/categories/schemas/index.d.ts +2 -2
- package/dist/features/categories/utils/taxonomy-visual.d.ts +21 -0
- package/dist/features/categories/utils/taxonomy-visual.js +58 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
- 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/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/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/GroupedListingEditorView.js +17 -2
- 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/api/route.js +2 -2
- package/dist/features/homepage/api/sections/route.js +1 -1
- package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
- package/dist/features/homepage/components/AnnouncementBar.js +13 -19
- package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
- package/dist/features/homepage/components/index.d.ts +0 -2
- package/dist/features/homepage/components/index.js +0 -1
- package/dist/features/homepage/repository/homepage.repository.js +1 -1
- package/dist/features/homepage/schemas/firestore.d.ts +6 -0
- package/dist/features/homepage/schemas/index.d.ts +10 -10
- package/dist/features/layout/AppLayoutShell.d.ts +12 -3
- 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/BottomNavbar.d.ts +14 -0
- package/dist/features/layout/BottomNavbar.js +43 -3
- 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.d.ts +1 -3
- package/dist/features/layout/TitleBarLayout.js +3 -4
- 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/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/modals/ImageEditor.js +5 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
- package/dist/features/media/repository/media-assets.repository.d.ts +19 -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/payments/repository/payments.repository.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +23 -6
- package/dist/features/payments/repository/payout.repository.js +63 -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/repository/pre-orders.repository.d.ts +3 -3
- package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
- package/dist/features/products/api/[id]/route.js +1 -1
- package/dist/features/products/components/ListingBottomActions.js +4 -0
- package/dist/features/products/components/ProductDetailPageView.js +2 -1
- package/dist/features/products/components/ProductGalleryClient.js +2 -2
- package/dist/features/products/components/ProductGrid.js +12 -1
- 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/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.js +13 -1
- package/dist/features/products/schemas/index.d.ts +2 -2
- package/dist/features/products/types/index.d.ts +1 -1
- 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/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/search/components/SearchResultsPageView.js +2 -1
- package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
- package/dist/features/search/hooks/useSearchIndex.js +172 -0
- package/dist/features/search/repository/search.repository.js +2 -2
- 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.js +9 -1
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutSettingsView.js +0 -1
- package/dist/features/seller/components/SellerPayoutsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.js +0 -1
- package/dist/features/seller/components/SellerProductsView.js +1 -1
- package/dist/features/seller/components/SellerShippingView.js +0 -1
- package/dist/features/seller/components/SellerStorefrontView.js +0 -1
- package/dist/features/seller/components/index.d.ts +0 -4
- package/dist/features/seller/components/index.js +0 -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/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 +248 -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/StoreNavTabs.js +17 -2
- package/dist/features/stores/manifest.js +8 -4
- 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/content-discovery__authenticity-checker.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +243 -0
- 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/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/design-ux__header-controls-and-messages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +85 -0
- package/dist/features/tester/seed-data/authored/index.js +10 -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/tools__sticker-tracer.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +283 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +235 -22
- package/dist/index.d.ts +10 -23
- package/dist/index.js +27 -19
- 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 +4 -4
- package/dist/next/routing/route-map.js +25 -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 +11 -9
- package/dist/providers/db-firebase/base.repository.js +19 -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 +13 -20
- package/dist/schemas/registry.js +31 -14
- package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
- package/dist/security/encrypted.d.ts +117 -0
- package/dist/security/encrypted.js +100 -0
- package/dist/security/index.d.ts +5 -2
- package/dist/security/index.js +16 -2
- 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/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 +34 -0
- package/dist/seed/authenticity-knowledge-seed-data.js +1277 -0
- package/dist/seed/bids-seed-data.d.ts +2 -2
- package/dist/seed/bids-seed-data.js +23 -2
- 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/homepage-sections-seed-data.js +39 -23
- package/dist/seed/index.d.ts +1 -0
- package/dist/seed/index.js +1 -0
- package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
- 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/payouts-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.js +1 -1
- 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 +1 -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.js +5 -1
- package/dist/server.d.ts +18 -3
- package/dist/server.js +59 -3
- package/dist/styles.css +237 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Button.js +7 -1
- package/dist/ui/components/FilterChipGroup.d.ts +11 -0
- package/dist/ui/components/FilterChipGroup.js +1 -1
- package/dist/ui/components/ImageGallery.js +6 -1
- package/dist/ui/components/ListingLayout.js +14 -8
- 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/RecordDetailModal.js +14 -1
- package/dist/ui/components/RowActionMenu.js +5 -1
- package/dist/ui/components/SideDrawer.js +5 -1
- package/dist/ui/components/SideModal.js +9 -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 +1 -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 +6 -0
- package/dist/ui/icons/icon-registry.js +17 -1
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +1 -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/validation/schemas.d.ts +8 -8
- package/package.json +6 -2
- package/scripts/seed-cli.mjs +3 -0
- 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/components/HowItWorksInfoView.d.ts +0 -36
- package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
- 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/seller/components/SellerStoreView.d.ts +0 -8
- package/dist/features/seller/components/SellerStoreView.js +0 -8
package/dist/index.js
CHANGED
|
@@ -1875,11 +1875,7 @@ export { ProfileView } from "./features/account/index.js";
|
|
|
1875
1875
|
// UserAccountHubView - Component for user account hub view.
|
|
1876
1876
|
export { UserAccountHubView } from "./features/account/index.js";
|
|
1877
1877
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
1878
|
-
// UserAddressesView - Component for user addresses view.
|
|
1879
|
-
export { UserAddressesView } from "./features/account/index.js";
|
|
1880
1878
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
1881
|
-
// UserNotificationsView - Component for user notifications view.
|
|
1882
|
-
export { UserNotificationsView } from "./features/account/index.js";
|
|
1883
1879
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
1884
1880
|
// [CLIENT]-Runs in browser only â€" interactive buyer offers panel with accept/withdraw actions.
|
|
1885
1881
|
// UserOffersPanel - Interactive buyer offers panel.
|
|
@@ -1891,8 +1887,6 @@ export { UserOrderTrackView } from "./features/account/index.js";
|
|
|
1891
1887
|
// UserOrdersView - Component for user orders view.
|
|
1892
1888
|
export { UserOrdersView } from "./features/account/index.js";
|
|
1893
1889
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
1894
|
-
// UserSettingsView - Component for user settings view.
|
|
1895
|
-
export { UserSettingsView } from "./features/account/index.js";
|
|
1896
1890
|
// [CLIENT-SSR]-Runs in both SSR and browser — React component that lets users manage their notification channel and type preferences.
|
|
1897
1891
|
// NotificationPreferencesPanel - Panel for user notification preferences.
|
|
1898
1892
|
export { NotificationPreferencesPanel } from "./features/account/index.js";
|
|
@@ -1952,6 +1946,10 @@ export { useUpdateProfile } from "./features/account/index.js";
|
|
|
1952
1946
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
1953
1947
|
// userProfileSchema - Model for user profile schema.
|
|
1954
1948
|
export { userProfileSchema } from "./features/account/index.js";
|
|
1949
|
+
// [TYPE]-TypeScript type-only export â€" erased at compile time, zero runtime cost.
|
|
1950
|
+
// UserSettingsViewLabels - Type contract for user settings view labels.
|
|
1951
|
+
// [TYPE]-TypeScript type-only export â€" erased at compile time, zero runtime cost.
|
|
1952
|
+
// UserSettingsViewProps - Type contract for user settings view props.
|
|
1955
1953
|
// ./features/account/server
|
|
1956
1954
|
// [DB]-Database layer â€" uses firebase-admin or another server-side DB SDK; can only run in a trusted server environment.
|
|
1957
1955
|
// AccountRepository - Shared export for account repository.
|
|
@@ -2194,7 +2192,6 @@ export { DEFAULT_TRUST_BAR_ITEMS } from "./features/admin/index.js";
|
|
|
2194
2192
|
// DashboardStatsGrid - Component for dashboard stats grid.
|
|
2195
2193
|
export { DashboardStatsGrid } from "./features/admin/index.js";
|
|
2196
2194
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
2197
|
-
// DemoSeedView — removed from main barrel (dev-only, load via dynamic import)
|
|
2198
2195
|
// AdminTeamView - Employee management list view.
|
|
2199
2196
|
export { AdminTeamView } from "./features/admin/index.js";
|
|
2200
2197
|
// AdminEmployeeEditorView - Invite/edit employee permissions SideDrawer.
|
|
@@ -2874,8 +2871,6 @@ export { CategoryForm } from "./features/categories/index.js";
|
|
|
2874
2871
|
// CategoryGrid - Component for category grid.
|
|
2875
2872
|
export { CategoryGrid } from "./features/categories/index.js";
|
|
2876
2873
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
2877
|
-
// CategoryProductsView - Component for category products view.
|
|
2878
|
-
export { CategoryProductsView } from "./features/categories/index.js";
|
|
2879
2874
|
// CategoryProductsListing - Client toolbar listing for category detail pages.
|
|
2880
2875
|
export { CategoryProductsListing } from "./features/categories/index.js";
|
|
2881
2876
|
export { CategoriesIndexListing } from "./features/categories/index.js";
|
|
@@ -3174,6 +3169,15 @@ export { AdminEventEditorView } from "./features/events/index.js";
|
|
|
3174
3169
|
// [SCHEMA]-Schema / data-shape constant â€" Zod validator, default-value object, or Firestore collection/field name constant.
|
|
3175
3170
|
// EVENTS_COLLECTION - Constant used across modules.
|
|
3176
3171
|
export { EVENTS_COLLECTION } from "./features/events/index.js";
|
|
3172
|
+
/*
|
|
3173
|
+
* [SHARED] RAFFLE_MAX_ENTRIES_PER_USER — one entry per person in a raffle.
|
|
3174
|
+
*
|
|
3175
|
+
* Public because the consumer's participate page must hand the SAME number to
|
|
3176
|
+
* `EventRaffleEntryForm` that `enterEvent` enforces server-side. Two mirrored
|
|
3177
|
+
* literals is the shape that caused the bug: the form already said "you've
|
|
3178
|
+
* used all 1 entry slot" while the server enforced nothing at all.
|
|
3179
|
+
*/
|
|
3180
|
+
export { RAFFLE_MAX_ENTRIES_PER_USER } from "./_internal/shared/features/events/config.js";
|
|
3177
3181
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
3178
3182
|
// EVENT_ADMIN_SORT_OPTIONS - Constant used across modules.
|
|
3179
3183
|
export { EVENT_ADMIN_SORT_OPTIONS } from "./features/events/index.js";
|
|
@@ -3593,8 +3597,6 @@ export { HomepageSkeleton } from "./features/homepage/index.js";
|
|
|
3593
3597
|
// HomepageView - Component for homepage view.
|
|
3594
3598
|
export { HomepageView } from "./features/homepage/index.js";
|
|
3595
3599
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
3596
|
-
// HowItWorksInfoView - Component for how it works info view.
|
|
3597
|
-
export { HowItWorksInfoView } from "./features/homepage/index.js";
|
|
3598
3600
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
3599
3601
|
// HowItWorksSection - Shared export for how it works section.
|
|
3600
3602
|
export { HowItWorksSection } from "./features/homepage/index.js";
|
|
@@ -3760,8 +3762,13 @@ export { AutoBreadcrumbs } from "./features/layout/index.js";
|
|
|
3760
3762
|
// BackToTop - Shared export for back to top.
|
|
3761
3763
|
export { BackToTop } from "./features/layout/index.js";
|
|
3762
3764
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
3763
|
-
// BottomActions - Shared export for bottom actions.
|
|
3765
|
+
// BottomActions - Shared export for bottom actions. @deprecated — alias of SideActionDock.
|
|
3764
3766
|
export { BottomActions } from "./features/layout/index.js";
|
|
3767
|
+
// [CLIENT-SSR]-Runs in both SSR and browser — React component or hook that does not depend on browser-only APIs.
|
|
3768
|
+
// SideActionDock - The floating action dock that replaced the bottom action bar.
|
|
3769
|
+
export { SideActionDock } from "./features/layout/index.js";
|
|
3770
|
+
// [SHARED]-Pure helper — marks a page's inline primary CTA so the dock reveals only after it scrolls out of view.
|
|
3771
|
+
export { ctaAnchorProps, CTA_ANCHOR_ATTR } from "./features/layout/index.js";
|
|
3765
3772
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
3766
3773
|
// BottomActionsProvider - Component for bottom actions provider.
|
|
3767
3774
|
export { BottomActionsProvider } from "./features/layout/index.js";
|
|
@@ -4302,8 +4309,6 @@ export { ProductTabs } from "./features/products/index.js";
|
|
|
4302
4309
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
4303
4310
|
// ProductsIndexPageView - Component for products index page view.
|
|
4304
4311
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
4305
|
-
// ProductsView - Component for products view.
|
|
4306
|
-
export { ProductsView } from "./features/products/index.js";
|
|
4307
4312
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
4308
4313
|
// RelatedProducts - Shared export for related products.
|
|
4309
4314
|
export { RelatedProducts } from "./features/products/index.js";
|
|
@@ -4336,7 +4341,7 @@ export { normalizeListingType, isAuctionListing, isPreOrderListing, isStandardLi
|
|
|
4336
4341
|
// `finalSale` field. See the module docstring for why `!p.finalSale` is wrong.
|
|
4337
4342
|
export { isFinalSale, acceptsChangeOfMindReturns, } from "./features/products/constants/final-sale.js";
|
|
4338
4343
|
// SB-UNI-X4 2026-05-13 â€" per-type feature-flag helpers.
|
|
4339
|
-
export { isListingTypeEnabled, isCategoryTypeEnabled, enabledListingTypes, enabledCategoryTypes, ALL_LISTING_TYPES, } from "./_internal/shared/listing-types/feature-flags.js";
|
|
4344
|
+
export { isListingTypeEnabled, isCategoryTypeEnabled, enabledListingTypes, enabledCategoryTypes, ALL_LISTING_TYPES, isListingType, } from "./_internal/shared/listing-types/feature-flags.js";
|
|
4340
4345
|
// SB-UNI-X5 2026-05-13 â€" action telemetry sink.
|
|
4341
4346
|
export { actionTracker, setActionTrackerSink, resetActionTrackerSink, } from "./_internal/shared/listing-types/action-tracker.js";
|
|
4342
4347
|
// SB-UNI-S 2026-05-13 â€" cart-level shipping-requirement helpers.
|
|
@@ -4733,6 +4738,9 @@ export { useNavSuggestions } from "./features/search/index.js";
|
|
|
4733
4738
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
4734
4739
|
// useSearch - React hook for use search.
|
|
4735
4740
|
export { useSearch } from "./features/search/index.js";
|
|
4741
|
+
// [CLIENT]-Browser only. Fetches the public search artifact once per page session.
|
|
4742
|
+
// Exported from the defining module, not the feature barrel — see client.ts.
|
|
4743
|
+
export { useSearchIndex, ensureSearchIndex } from "./features/search/hooks/useSearchIndex.js";
|
|
4736
4744
|
// ./features/search/server
|
|
4737
4745
|
// [DB]-Database layer â€" uses firebase-admin or another server-side DB SDK; can only run in a trusted server environment.
|
|
4738
4746
|
// SearchRepository - Shared export for search repository.
|
|
@@ -4832,8 +4840,6 @@ export { SellerShippingView } from "./features/seller/index.js";
|
|
|
4832
4840
|
// SellerStoreSetupView - Component for seller store setup view.
|
|
4833
4841
|
export { SellerStoreSetupView } from "./features/seller/index.js";
|
|
4834
4842
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
4835
|
-
// SellerStoreView - Component for seller store view.
|
|
4836
|
-
export { SellerStoreView } from "./features/seller/index.js";
|
|
4837
4843
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
4838
4844
|
// SellerStorefrontView - Component for seller storefront view.
|
|
4839
4845
|
export { SellerStorefrontView } from "./features/seller/index.js";
|
|
@@ -4869,7 +4875,6 @@ export { SellerProductsView as StoreProductListingsView } from "./features/selle
|
|
|
4869
4875
|
// StoreShippingView - Alias for SellerShippingView.
|
|
4870
4876
|
export { SellerShippingView as StoreShippingView } from "./features/seller/index.js";
|
|
4871
4877
|
// StoreStorefrontView - Alias for SellerStorefrontView.
|
|
4872
|
-
export { SellerStorefrontView as StoreStorefrontView } from "./features/seller/index.js";
|
|
4873
4878
|
// [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
|
|
4874
4879
|
// buildPayoutColumns - Helper for build payout columns.
|
|
4875
4880
|
export { buildPayoutColumns } from "./features/seller/index.js";
|
|
@@ -5349,6 +5354,8 @@ export { CardBody, MenuTrigger, MenuContent, MenuSeparator, RoleBadge, SkipToMai
|
|
|
5349
5354
|
export { Tabs, TabsList, TabsTrigger, TabsContent, PasswordStrengthIndicator, TablePagination } from "./ui/index.js";
|
|
5350
5355
|
// TabBarShell - rail + overflow scroll arrows around a role="tablist"; TabBarButton / TabsNavSelect - its two trigger flavours
|
|
5351
5356
|
export { TabBarShell, TabBarButton, TabsNavSelect } from "./ui/index.js";
|
|
5357
|
+
// OverflowRow - pill/tab row that collapses into a searchable dropdown when it measures wider than its container
|
|
5358
|
+
export { OverflowRow } from "./ui/index.js";
|
|
5352
5359
|
export { Stack, classNames, mergeTailwindClasses, SideModal, SideDrawer, RichText, RichTextRenderer } from "./ui/index.js";
|
|
5353
5360
|
export { SlottedListingView, DetailViewShell, StackedViewShell } from "./ui/index.js";
|
|
5354
5361
|
export { buildColumns, createColumnBuilder } from "./ui/index.js";
|
|
@@ -5367,7 +5374,7 @@ export { historyRepository, UserHistoryRepository, trackHistoryView, getHistoryF
|
|
|
5367
5374
|
export { useMediaQuery, useBreakpoint, useClickOutside, useKeyPress, useLongPress, useGesture, useSwipe, useSession, useAuth, useCountdown, useCamera, useBulkSelection, useUrlTable, usePendingFilters, usePendingTable, useUnsavedChanges, UNSAVED_CHANGES_EVENT, useBulkAction, useEntityDelete, useContainerGrid, useMessage, useModalStack, RTDBPayloadStatus, } from "./react/index.js";
|
|
5368
5375
|
// Missing core types (already exported above; skipped to avoid duplicates)
|
|
5369
5376
|
// Missing auth feature components
|
|
5370
|
-
export { RoleGate, ProtectedRoute, SocialAuthButtons,
|
|
5377
|
+
export { RoleGate, ProtectedRoute, SocialAuthButtons, LoginForm, RegisterForm, ForgotPasswordView, ResetPasswordView, VerifyEmailView, OAuthLoadingView } from "./features/auth/index.js";
|
|
5371
5378
|
// Missing cart and checkout feature components
|
|
5372
5379
|
export { CartItemRow, CartDrawer, CartView, CartSummary, ShippingPicker } from "./features/cart/index.js";
|
|
5373
5380
|
export { CheckoutView, CheckoutAddressStep, CheckoutSuccessView } from "./features/cart/index.js";
|
|
@@ -5454,6 +5461,7 @@ export { groupedListingFormSchema, groupedListingCreateSchema, groupedListingUpd
|
|
|
5454
5461
|
export { scammersSeedData } from "./seed/index.js";
|
|
5455
5462
|
// Product features â€" seed data (FI2)
|
|
5456
5463
|
export { productFeaturesSeedData } from "./seed/index.js";
|
|
5464
|
+
export { authenticityKnowledgeSeedData, AUTHENTICITY_KNOWLEDGE_COLLECTION, AUTHENTICITY_KNOWLEDGE_COUNT, } from "./seed/index.js";
|
|
5457
5465
|
/*
|
|
5458
5466
|
* 🛑 Registering a seed collection takes FOUR edits and three of them are
|
|
5459
5467
|
* silent if missed: seed/index.ts, THIS re-export, and seed-cli's own import
|
|
@@ -116,6 +116,15 @@ function shouldPersist(mapped) {
|
|
|
116
116
|
function resolveBodySchema(schema) {
|
|
117
117
|
if (typeof schema !== "string")
|
|
118
118
|
return schema;
|
|
119
|
+
/*
|
|
120
|
+
* `SCHEMAS.api` is empty by design (see its own comment in registry.ts):
|
|
121
|
+
* the key form had 6 registered keys and ZERO routes passing one, so the
|
|
122
|
+
* lookup is kept for the contract while `RegisteredApiRouteKey` narrows to
|
|
123
|
+
* `never`. The cast is what lets an indexed read of an empty literal type
|
|
124
|
+
* compile; the `!entry` branch below is the whole behaviour — a key string
|
|
125
|
+
* resolves to nothing and `createRouteHandler` throws "Route schema not
|
|
126
|
+
* registered", which is the correct answer for a key nobody registered.
|
|
127
|
+
*/
|
|
119
128
|
const entry = SCHEMAS.api[schema];
|
|
120
129
|
if (!entry || !("body" in entry) || !entry.body)
|
|
121
130
|
return null;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface RequireRecordOptions {
|
|
2
|
+
/** `route` field on the persisted degraded-read entry, e.g. "/admin/events/[id]/edit". */
|
|
3
|
+
route: string;
|
|
4
|
+
/** Stable identifier for the read site, e.g. "events.findById". */
|
|
5
|
+
key: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Calls `notFound()` when `read()` resolves to `null` / `undefined`.
|
|
9
|
+
*
|
|
10
|
+
* Returns the record when it exists, so a caller that already needs the
|
|
11
|
+
* document does not pay for a second read.
|
|
12
|
+
*/
|
|
13
|
+
export declare function requireRecord<T>(read: () => Promise<T | null | undefined>, opts: RequireRecordOptions): Promise<T | null>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { notFound } from "next/navigation.js";
|
|
2
|
+
import { safeRead } from "../../errors/safe-read.js";
|
|
3
|
+
/**
|
|
4
|
+
* 404 a dynamic detail page whose record does not exist.
|
|
5
|
+
*
|
|
6
|
+
* ## The defect this closes
|
|
7
|
+
*
|
|
8
|
+
* `/admin/coupons/zzzznope-not-a-coupon-42/edit` rendered a fully editable
|
|
9
|
+
* coupon form — twelve inputs, "Save changes", "Delete coupon" — because its
|
|
10
|
+
* `page.tsx` was a bare shim that passed the id straight to an editor. The
|
|
11
|
+
* sibling `/admin/orders/[id]/view` fetched server-side and 404'd correctly;
|
|
12
|
+
* the two differed only because one never grew the check. `audit-admin-detail-notfound`
|
|
13
|
+
* found **fourteen** more, and the danger is Root Cause #98's: the form looks
|
|
14
|
+
* ready to save, and what it saves is a record keyed on an id nobody meant to
|
|
15
|
+
* create.
|
|
16
|
+
*
|
|
17
|
+
* ## 🛑 A FAILED read is not an ABSENT record
|
|
18
|
+
*
|
|
19
|
+
* This is the whole subtlety, and it is why the helper exists rather than each
|
|
20
|
+
* page writing `if (!(await repo.findById(id))) notFound()`.
|
|
21
|
+
*
|
|
22
|
+
* Dashboard pages sit under a layout that `await`s the session, so Next still
|
|
23
|
+
* ATTEMPTS to prerender them and an unguarded throw there is **fatal to the
|
|
24
|
+
* build** (§ "a dynamic API in a DASHBOARD layout is the correct lever"). The
|
|
25
|
+
* read therefore has to go through `safeRead`. But `safeRead` returns its
|
|
26
|
+
* fallback on failure — so a naive `fallback: null` would turn a transient
|
|
27
|
+
* Firestore error, a missing composite index, or a quota exception into a
|
|
28
|
+
* **404 on a record that exists**. That is strictly worse than the bug being
|
|
29
|
+
* fixed: the admin is told their data is gone.
|
|
30
|
+
*
|
|
31
|
+
* So failure and absence are separated by a sentinel. `notFound()` fires ONLY
|
|
32
|
+
* when the read succeeded and returned nothing. When the read fails the page
|
|
33
|
+
* renders, the degradation is recorded as a `DEGRADED_READ` row by `safeRead`
|
|
34
|
+
* itself, and the editor's own fetch surfaces whatever is really wrong.
|
|
35
|
+
*
|
|
36
|
+
* ## Cost
|
|
37
|
+
*
|
|
38
|
+
* One document read, on a route that is per-request anyway. Well inside Rule
|
|
39
|
+
* #6's ~3-round-trip budget, and the editor's client fetch is unchanged — this
|
|
40
|
+
* does not replace it, because the editor is also reachable from a drawer.
|
|
41
|
+
*/
|
|
42
|
+
/** Distinguishes "the read threw" from "the record is absent". */
|
|
43
|
+
const READ_FAILED = Symbol("read-failed");
|
|
44
|
+
/**
|
|
45
|
+
* Calls `notFound()` when `read()` resolves to `null` / `undefined`.
|
|
46
|
+
*
|
|
47
|
+
* Returns the record when it exists, so a caller that already needs the
|
|
48
|
+
* document does not pay for a second read.
|
|
49
|
+
*/
|
|
50
|
+
export async function requireRecord(read, opts) {
|
|
51
|
+
const result = await safeRead(read, {
|
|
52
|
+
route: opts.route,
|
|
53
|
+
key: opts.key,
|
|
54
|
+
fallback: READ_FAILED,
|
|
55
|
+
});
|
|
56
|
+
// The read itself broke. Render the page; `safeRead` has already recorded it.
|
|
57
|
+
if (result === READ_FAILED)
|
|
58
|
+
return null;
|
|
59
|
+
if (result === null || result === undefined)
|
|
60
|
+
notFound();
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
@@ -63,7 +63,6 @@ export declare const DEFAULT_ROUTE_MAP: {
|
|
|
63
63
|
readonly ABOUT: "/about";
|
|
64
64
|
readonly DEVELOPER: "/developer";
|
|
65
65
|
readonly CONTACT: "/contact";
|
|
66
|
-
readonly BLOG: "/blog";
|
|
67
66
|
readonly HELP: "/help";
|
|
68
67
|
readonly HELP_SHOPPING: "/help/shopping";
|
|
69
68
|
readonly HELP_AUCTIONS: "/help/auctions";
|
|
@@ -100,7 +99,6 @@ export declare const DEFAULT_ROUTE_MAP: {
|
|
|
100
99
|
readonly EVENT_SPIN_RESULTS: (id: string) => string;
|
|
101
100
|
readonly LOTTERIES: "/lottery";
|
|
102
101
|
readonly LOTTERY_DETAIL: (id: string) => string;
|
|
103
|
-
readonly SUBLISTING_CATEGORIES: "/sublisting-categories";
|
|
104
102
|
readonly SUBLISTING_CATEGORY: (slug: string) => string;
|
|
105
103
|
readonly SUPPORT: "/support";
|
|
106
104
|
readonly SCAMS: "/scams";
|
|
@@ -112,6 +110,8 @@ export declare const DEFAULT_ROUTE_MAP: {
|
|
|
112
110
|
readonly ITEM_REQUESTS_NEW: "/item-requests/new";
|
|
113
111
|
readonly TOOLS: "/tools";
|
|
114
112
|
readonly TOOL_PRICE_INDEX: "/tools/price-index";
|
|
113
|
+
readonly TOOL_STICKER_TRACER: "/tools/sticker-tracer";
|
|
114
|
+
readonly TOOL_STICKER_SHEET: (sheetId: string) => string;
|
|
115
115
|
readonly PARTS: "/parts";
|
|
116
116
|
readonly PART_CLASSIFICATION: (classification: string) => string;
|
|
117
117
|
readonly PART_DETAIL: (classification: string, code: string) => string;
|
|
@@ -479,7 +479,6 @@ export declare const ROUTES: {
|
|
|
479
479
|
readonly ABOUT: "/about";
|
|
480
480
|
readonly DEVELOPER: "/developer";
|
|
481
481
|
readonly CONTACT: "/contact";
|
|
482
|
-
readonly BLOG: "/blog";
|
|
483
482
|
readonly HELP: "/help";
|
|
484
483
|
readonly HELP_SHOPPING: "/help/shopping";
|
|
485
484
|
readonly HELP_AUCTIONS: "/help/auctions";
|
|
@@ -516,7 +515,6 @@ export declare const ROUTES: {
|
|
|
516
515
|
readonly EVENT_SPIN_RESULTS: (id: string) => string;
|
|
517
516
|
readonly LOTTERIES: "/lottery";
|
|
518
517
|
readonly LOTTERY_DETAIL: (id: string) => string;
|
|
519
|
-
readonly SUBLISTING_CATEGORIES: "/sublisting-categories";
|
|
520
518
|
readonly SUBLISTING_CATEGORY: (slug: string) => string;
|
|
521
519
|
readonly SUPPORT: "/support";
|
|
522
520
|
readonly SCAMS: "/scams";
|
|
@@ -528,6 +526,8 @@ export declare const ROUTES: {
|
|
|
528
526
|
readonly ITEM_REQUESTS_NEW: "/item-requests/new";
|
|
529
527
|
readonly TOOLS: "/tools";
|
|
530
528
|
readonly TOOL_PRICE_INDEX: "/tools/price-index";
|
|
529
|
+
readonly TOOL_STICKER_TRACER: "/tools/sticker-tracer";
|
|
530
|
+
readonly TOOL_STICKER_SHEET: (sheetId: string) => string;
|
|
531
531
|
readonly PARTS: "/parts";
|
|
532
532
|
readonly PART_CLASSIFICATION: (classification: string) => string;
|
|
533
533
|
readonly PART_DETAIL: (classification: string, code: string) => string;
|
|
@@ -63,7 +63,14 @@ export const DEFAULT_ROUTE_MAP = {
|
|
|
63
63
|
ABOUT: "/about",
|
|
64
64
|
DEVELOPER: "/developer",
|
|
65
65
|
CONTACT: "/contact",
|
|
66
|
-
|
|
66
|
+
/*
|
|
67
|
+
* 🛑 No `PUBLIC.BLOG`. `BLOG.LIST` is the one key for "/blog", and it sits
|
|
68
|
+
* beside `BLOG.ARTICLE` — which is the ONLY blog detail key, so `BLOG` was
|
|
69
|
+
* always the canonical section and `PUBLIC.BLOG` was an alias of its index.
|
|
70
|
+
* Two keys for one path is Root Cause #61's family: the duplicate was
|
|
71
|
+
* reported by `audit-dead-route-key` on every run, and nine call sites had
|
|
72
|
+
* drifted onto the alias while one used the real key.
|
|
73
|
+
*/
|
|
67
74
|
HELP: "/help",
|
|
68
75
|
HELP_SHOPPING: "/help/shopping",
|
|
69
76
|
HELP_AUCTIONS: "/help/auctions",
|
|
@@ -119,7 +126,14 @@ export const DEFAULT_ROUTE_MAP = {
|
|
|
119
126
|
EVENT_SPIN_RESULTS: (id) => `/events/${id}/spin-results`,
|
|
120
127
|
LOTTERIES: "/lottery",
|
|
121
128
|
LOTTERY_DETAIL: (id) => `/lottery/${id}`,
|
|
122
|
-
|
|
129
|
+
/*
|
|
130
|
+
* 🛑 There is deliberately NO public `SUBLISTING_CATEGORIES` index key.
|
|
131
|
+
* `src/app/[locale]/sublisting-categories/` holds only `[slug]/`, so the
|
|
132
|
+
* index has never existed; the key promised a route with no page behind
|
|
133
|
+
* it, had zero references anywhere, and `audit-dead-route-key` carried it
|
|
134
|
+
* as its one grandfathered entry. A sub-listing is reached from the
|
|
135
|
+
* category or product it belongs to, not from a top-level list.
|
|
136
|
+
*/
|
|
123
137
|
SUBLISTING_CATEGORY: (slug) => `/sublisting-categories/${slug}`,
|
|
124
138
|
SUPPORT: "/support",
|
|
125
139
|
SCAMS: "/scams",
|
|
@@ -138,6 +152,14 @@ export const DEFAULT_ROUTE_MAP = {
|
|
|
138
152
|
*/
|
|
139
153
|
TOOLS: "/tools",
|
|
140
154
|
TOOL_PRICE_INDEX: "/tools/price-index",
|
|
155
|
+
/*
|
|
156
|
+
* Admin-only, and under a PUBLIC prefix on purpose — it is a tool, and
|
|
157
|
+
* /tools is where tools live. The guard is the layout, not the path: a
|
|
158
|
+
* non-admin is redirected server-side before any HTML is produced, so
|
|
159
|
+
* there is nothing indexable at this URL regardless of robots.txt.
|
|
160
|
+
*/
|
|
161
|
+
TOOL_STICKER_TRACER: "/tools/sticker-tracer",
|
|
162
|
+
TOOL_STICKER_SHEET: (sheetId) => `/tools/sticker-tracer/${sheetId}`,
|
|
141
163
|
/*
|
|
142
164
|
* The PARTS database. A reference surface, so it lives beside the other
|
|
143
165
|
* two things that answer a question rather than sell you something.
|
|
@@ -552,7 +574,7 @@ export const PUBLIC_ROUTES = [
|
|
|
552
574
|
ROUTES.PUBLIC.PROMOTIONS,
|
|
553
575
|
ROUTES.PUBLIC.ABOUT,
|
|
554
576
|
ROUTES.PUBLIC.CONTACT,
|
|
555
|
-
ROUTES.
|
|
577
|
+
ROUTES.BLOG.LIST,
|
|
556
578
|
ROUTES.PUBLIC.HELP,
|
|
557
579
|
ROUTES.PUBLIC.TERMS,
|
|
558
580
|
ROUTES.PUBLIC.PRIVACY,
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import type { CollectionReference, DocumentData, DocumentSnapshot, Firestore } from "firebase-admin/firestore";
|
|
21
21
|
import type { IRepository, PagedResult, SieveQuery, WhereOp } from "../../contracts";
|
|
22
|
+
import type { Plaintext } from "../../security/encrypted";
|
|
22
23
|
export declare class FirebaseRepository<T extends DocumentData> implements IRepository<T> {
|
|
23
24
|
protected readonly collection: string;
|
|
24
25
|
constructor(collectionName: string);
|
|
@@ -29,8 +30,9 @@ export declare class FirebaseRepository<T extends DocumentData> implements IRepo
|
|
|
29
30
|
findById(id: string): Promise<T | null>;
|
|
30
31
|
findAll(query?: SieveQuery): Promise<PagedResult<T>>;
|
|
31
32
|
findWhere(field: keyof T, op: WhereOp, value: unknown): Promise<T[]>;
|
|
32
|
-
create(data: Omit<T
|
|
33
|
-
|
|
33
|
+
create(data: Omit<Plaintext<T>, "id" | "createdAt" | "updatedAt">): Promise<T>;
|
|
34
|
+
/** Accepts the PLAINTEXT shape — see `create` for why. */
|
|
35
|
+
update(id: string, data: Partial<Plaintext<T>>): Promise<T>;
|
|
34
36
|
delete(id: string): Promise<void>;
|
|
35
37
|
batchCreate(items: Array<Omit<T, "id" | "createdAt" | "updatedAt">>): Promise<T[]>;
|
|
36
38
|
batchDelete(ids: string[]): Promise<void>;
|
|
@@ -46,7 +46,7 @@ export class FirebaseRepository {
|
|
|
46
46
|
}
|
|
47
47
|
async findAll(query) {
|
|
48
48
|
const page = Math.max(1, query?.page ?? 1);
|
|
49
|
-
const
|
|
49
|
+
const pageSize = Math.max(1, Math.min(query?.pageSize ?? 20, 500));
|
|
50
50
|
let q = this.getCollection();
|
|
51
51
|
// -- Sort ------------------------------------------------------------------
|
|
52
52
|
// SieveQuery.sort supports a leading "-" prefix for descending order
|
|
@@ -89,11 +89,11 @@ export class FirebaseRepository {
|
|
|
89
89
|
// -- Count -----------------------------------------------------------------
|
|
90
90
|
const total = await getFirestoreCount(q);
|
|
91
91
|
// -- Paginate --------------------------------------------------------------
|
|
92
|
-
const offset = (page - 1) *
|
|
93
|
-
const pagedSnap = await q.offset(offset).limit(
|
|
92
|
+
const offset = (page - 1) * pageSize;
|
|
93
|
+
const pagedSnap = await q.offset(offset).limit(pageSize).get();
|
|
94
94
|
const data = pagedSnap.docs.map((d) => this.mapDoc(d));
|
|
95
|
-
const totalPages = total === 0 ? 0 : Math.max(1, Math.ceil(total /
|
|
96
|
-
return { data, total, page,
|
|
95
|
+
const totalPages = total === 0 ? 0 : Math.max(1, Math.ceil(total / pageSize));
|
|
96
|
+
return { data, total, page, pageSize, totalPages };
|
|
97
97
|
}
|
|
98
98
|
async findWhere(field, op, value) {
|
|
99
99
|
const snap = await this.getCollection()
|
|
@@ -102,6 +102,21 @@ export class FirebaseRepository {
|
|
|
102
102
|
return snap.docs.map((d) => this.mapDoc(d));
|
|
103
103
|
}
|
|
104
104
|
// -- IWriteRepository -------------------------------------------------------
|
|
105
|
+
/*
|
|
106
|
+
* 🛑 Accepts the PLAINTEXT shape, because this method ENCRYPTS.
|
|
107
|
+
*
|
|
108
|
+
* `applyWriteHooks` runs `encryptPiiFields` over the subclass's `piiFields`,
|
|
109
|
+
* so a caller legitimately hands over a real email and gets ciphertext in
|
|
110
|
+
* Firestore. Typing the parameter `Omit<T, …>` demanded `Encrypted<string>`
|
|
111
|
+
* from every caller — and the only way to produce one without encrypting is
|
|
112
|
+
* `asEncrypted(value)`, which labels plaintext as ciphertext and is the
|
|
113
|
+
* misuse that helper's own docstring forbids. The alternative was a cast at
|
|
114
|
+
* each of the dozens of write sites across fourteen repositories; one honest
|
|
115
|
+
* signature here is the same change made once.
|
|
116
|
+
*
|
|
117
|
+
* `Plaintext<T>` is the identity on any document with no branded field, so
|
|
118
|
+
* this is a no-op for every repository that holds no PII.
|
|
119
|
+
*/
|
|
105
120
|
async create(data) {
|
|
106
121
|
const now = new Date();
|
|
107
122
|
const payload = prepareForFirestore({
|
|
@@ -113,6 +128,7 @@ export class FirebaseRepository {
|
|
|
113
128
|
const snap = await ref.get();
|
|
114
129
|
return this.mapDoc(snap);
|
|
115
130
|
}
|
|
131
|
+
/** Accepts the PLAINTEXT shape — see `create` for why. */
|
|
116
132
|
async update(id, data) {
|
|
117
133
|
const payload = prepareForFirestore({
|
|
118
134
|
...data,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Plaintext } from "../../security/encrypted";
|
|
1
2
|
import type { FirestoreDocument } from "@mohasinac/appkit";
|
|
2
3
|
import type { CollectionReference, DocumentData, DocumentReference, DocumentSnapshot, Firestore, Query, Transaction, WriteBatch } from "firebase-admin/firestore";
|
|
3
4
|
import { type FirebaseSieveFields, type FirebaseSieveOptions, type FirebaseSieveResult, type SieveModel } from "./sieve";
|
|
@@ -111,7 +112,7 @@ export declare abstract class BaseRepository<T extends DocumentData> {
|
|
|
111
112
|
doc: T | null | undefined;
|
|
112
113
|
patch: Partial<T>;
|
|
113
114
|
}>): Promise<number>;
|
|
114
|
-
create(data: Partial<T
|
|
115
|
+
create(data: Partial<Plaintext<T>> | FirestoreDocument): Promise<T>;
|
|
115
116
|
/**
|
|
116
117
|
* Write a document at a CALLER-CHOSEN id.
|
|
117
118
|
*
|
|
@@ -143,8 +144,9 @@ export declare abstract class BaseRepository<T extends DocumentData> {
|
|
|
143
144
|
* NAME: `createWithId` reads as "create" and behaves as "replace", and that
|
|
144
145
|
* gap is what made the wrong conclusion so easy to reach.
|
|
145
146
|
*/
|
|
146
|
-
createWithId(id: string, data: Partial<T
|
|
147
|
-
|
|
147
|
+
createWithId(id: string, data: Partial<Plaintext<T>>): Promise<T>;
|
|
148
|
+
/** Accepts the PLAINTEXT shape — see `create` for why. */
|
|
149
|
+
update(id: string, data: Partial<Plaintext<T>>): Promise<T>;
|
|
148
150
|
delete(id: string): Promise<void>;
|
|
149
151
|
exists(id: string): Promise<boolean>;
|
|
150
152
|
/**
|
|
@@ -195,12 +197,12 @@ export declare abstract class BaseRepository<T extends DocumentData> {
|
|
|
195
197
|
}): Promise<Record<string, number | undefined>>;
|
|
196
198
|
findByIdInTx(tx: Transaction, id: string): Promise<T | null>;
|
|
197
199
|
findByIdOrFailInTx(tx: Transaction, id: string): Promise<T>;
|
|
198
|
-
createInTx(tx: Transaction, data: Partial<T
|
|
199
|
-
createWithIdInTx(tx: Transaction, id: string, data: Partial<T
|
|
200
|
-
updateInTx(tx: Transaction, id: string, data: Partial<T
|
|
200
|
+
createInTx(tx: Transaction, data: Partial<Plaintext<T>> | FirestoreDocument): DocumentReference;
|
|
201
|
+
createWithIdInTx(tx: Transaction, id: string, data: Partial<Plaintext<T>> | FirestoreDocument): DocumentReference;
|
|
202
|
+
updateInTx(tx: Transaction, id: string, data: Partial<Plaintext<T>>): void;
|
|
201
203
|
deleteInTx(tx: Transaction, id: string): void;
|
|
202
|
-
createInBatch(batch: WriteBatch, data: Partial<T
|
|
203
|
-
createWithIdInBatch(batch: WriteBatch, id: string, data: Partial<T
|
|
204
|
-
updateInBatch(batch: WriteBatch, id: string, data: Partial<T
|
|
204
|
+
createInBatch(batch: WriteBatch, data: Partial<Plaintext<T>> | FirestoreDocument): DocumentReference;
|
|
205
|
+
createWithIdInBatch(batch: WriteBatch, id: string, data: Partial<Plaintext<T>> | FirestoreDocument): void;
|
|
206
|
+
updateInBatch(batch: WriteBatch, id: string, data: Partial<Plaintext<T>>): void;
|
|
205
207
|
deleteInBatch(batch: WriteBatch, id: string): void;
|
|
206
208
|
}
|
|
@@ -268,6 +268,21 @@ export class BaseRepository {
|
|
|
268
268
|
await batch.commit();
|
|
269
269
|
return present.length;
|
|
270
270
|
}
|
|
271
|
+
/*
|
|
272
|
+
* 🛑 Accepts the PLAINTEXT shape, because this method ENCRYPTS.
|
|
273
|
+
*
|
|
274
|
+
* `applyWriteHooks` runs `encryptPiiFields` over the subclass's `piiFields`,
|
|
275
|
+
* so a caller legitimately hands over a real email and Firestore holds
|
|
276
|
+
* ciphertext. Typing this `Partial<T>` demanded `Encrypted<string>` from
|
|
277
|
+
* every caller once the PII fields were branded — and the only way to make
|
|
278
|
+
* one without encrypting is `asEncrypted(value)`, which labels plaintext as
|
|
279
|
+
* ciphertext and is the misuse that helper's docstring forbids. The
|
|
280
|
+
* alternative was a cast at each of the dozens of write sites across
|
|
281
|
+
* fourteen repositories; one honest signature here is that change made once.
|
|
282
|
+
*
|
|
283
|
+
* `Plaintext<T>` is the identity on a document with no branded member, so
|
|
284
|
+
* this is a no-op for every repository holding no PII.
|
|
285
|
+
*/
|
|
271
286
|
async create(data) {
|
|
272
287
|
try {
|
|
273
288
|
const cleanData = prepareForFirestore({
|
|
@@ -315,6 +330,7 @@ export class BaseRepository {
|
|
|
315
330
|
* NAME: `createWithId` reads as "create" and behaves as "replace", and that
|
|
316
331
|
* gap is what made the wrong conclusion so easy to reach.
|
|
317
332
|
*/
|
|
333
|
+
// Plaintext<T> — these methods ENCRYPT via applyWriteHooks; see `create`.
|
|
318
334
|
async createWithId(id, data) {
|
|
319
335
|
try {
|
|
320
336
|
const now = new Date();
|
|
@@ -339,6 +355,7 @@ export class BaseRepository {
|
|
|
339
355
|
throw new DatabaseError(`Failed to create document with ID: ${id}: ${detailOf(error)}`, error);
|
|
340
356
|
}
|
|
341
357
|
}
|
|
358
|
+
/** Accepts the PLAINTEXT shape — see `create` for why. */
|
|
342
359
|
async update(id, data) {
|
|
343
360
|
try {
|
|
344
361
|
const cleanData = prepareForFirestore({
|
|
@@ -496,6 +513,7 @@ export class BaseRepository {
|
|
|
496
513
|
}));
|
|
497
514
|
return docRef;
|
|
498
515
|
}
|
|
516
|
+
// Plaintext<T> — these methods ENCRYPT via applyWriteHooks; see `create`.
|
|
499
517
|
updateInTx(tx, id, data) {
|
|
500
518
|
const docRef = this.getCollection().doc(id);
|
|
501
519
|
tx.update(docRef, prepareForFirestore({ ...this.applyWriteHooks(data), updatedAt: new Date() }));
|
|
@@ -523,6 +541,7 @@ export class BaseRepository {
|
|
|
523
541
|
updatedAt: now,
|
|
524
542
|
}));
|
|
525
543
|
}
|
|
544
|
+
// Plaintext<T> — these methods ENCRYPT via applyWriteHooks; see `create`.
|
|
526
545
|
updateInBatch(batch, id, data) {
|
|
527
546
|
const docRef = this.getCollection().doc(id);
|
|
528
547
|
batch.update(docRef, prepareForFirestore({ ...this.applyWriteHooks(data), updatedAt: new Date() }));
|
|
@@ -34,4 +34,16 @@ export declare const RTDB_PATHS: {
|
|
|
34
34
|
* Pruned by `cleanupRtdbEvents`'s sixth block.
|
|
35
35
|
*/
|
|
36
36
|
readonly CHAT_EVENTS: "chat_events";
|
|
37
|
+
/**
|
|
38
|
+
* Per-run progress for the sticker kiss-cut tracer — stage, pct, parts and
|
|
39
|
+
* shards done. The DURABLE record is `stickerTraceRuns.events[]`; this is
|
|
40
|
+
* only the live bar, which is why losing it is survivable and why the run
|
|
41
|
+
* document is what a failure is diagnosed from weeks later.
|
|
42
|
+
*
|
|
43
|
+
* 🛑 Pruned at SIXTY minutes, not fifteen. A `max`-tier fan-out across sixty
|
|
44
|
+
* parts can outlast a fifteen-minute window, and a channel pruned mid-run
|
|
45
|
+
* reads to the client as "it died" — the same false negative `EMAIL_EVENTS`
|
|
46
|
+
* carries a longer window to avoid.
|
|
47
|
+
*/
|
|
48
|
+
readonly STICKER_TRACE: "sticker_trace";
|
|
37
49
|
};
|
|
@@ -34,4 +34,16 @@ export const RTDB_PATHS = {
|
|
|
34
34
|
* Pruned by `cleanupRtdbEvents`'s sixth block.
|
|
35
35
|
*/
|
|
36
36
|
CHAT_EVENTS: "chat_events",
|
|
37
|
+
/**
|
|
38
|
+
* Per-run progress for the sticker kiss-cut tracer — stage, pct, parts and
|
|
39
|
+
* shards done. The DURABLE record is `stickerTraceRuns.events[]`; this is
|
|
40
|
+
* only the live bar, which is why losing it is survivable and why the run
|
|
41
|
+
* document is what a failure is diagnosed from weeks later.
|
|
42
|
+
*
|
|
43
|
+
* 🛑 Pruned at SIXTY minutes, not fifteen. A `max`-tier fan-out across sixty
|
|
44
|
+
* parts can outlast a fifteen-minute window, and a channel pruned mid-run
|
|
45
|
+
* reads to the client as "it died" — the same false negative `EMAIL_EVENTS`
|
|
46
|
+
* carries a longer window to avoid.
|
|
47
|
+
*/
|
|
48
|
+
STICKER_TRACE: "sticker_trace",
|
|
37
49
|
};
|
|
@@ -10,7 +10,12 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
10
10
|
*/
|
|
11
11
|
import { Component } from "react";
|
|
12
12
|
import { Logger } from "../core/Logger.js";
|
|
13
|
-
|
|
13
|
+
// Defining modules, not the sibling barrel — Root Cause #18. `ui/index.ts` and
|
|
14
|
+
// `react/index.ts` re-exported into each other, which is the whole of
|
|
15
|
+
// `audit-import-cycles` component 1: an 18-module knot held together entirely
|
|
16
|
+
// by barrel hops, none of which needed the barrel.
|
|
17
|
+
import { Button } from "../ui/components/Button.js";
|
|
18
|
+
import { Heading, Text } from "../ui/components/Typography.js";
|
|
14
19
|
import { trackError, ErrorCategory, ErrorSeverity, } from "../monitoring/error-tracking.js";
|
|
15
20
|
function DefaultFallback({ error, onReset, }) {
|
|
16
21
|
return (_jsxs("div", { role: "alert", style: {
|
|
@@ -20,6 +20,7 @@ export declare const RealtimeEventType: {
|
|
|
20
20
|
readonly CHAT: "chat";
|
|
21
21
|
readonly BID: "bid";
|
|
22
22
|
readonly BULK: "bulk";
|
|
23
|
+
readonly STICKER_TRACE: "sticker-trace";
|
|
23
24
|
};
|
|
24
25
|
export type RealtimeEventType = (typeof RealtimeEventType)[keyof typeof RealtimeEventType];
|
|
25
26
|
export declare const RealtimeEventStatus: {
|
|
@@ -19,6 +19,14 @@ export const RealtimeEventType = {
|
|
|
19
19
|
CHAT: "chat",
|
|
20
20
|
BID: "bid",
|
|
21
21
|
BULK: "bulk",
|
|
22
|
+
/*
|
|
23
|
+
* The sticker kiss-cut tracer's per-run progress channel. Added rather than
|
|
24
|
+
* reusing BULK: the type selects this event's message strings and its
|
|
25
|
+
* claim/path conventions, and a trace reports a STAGE out of eleven where a
|
|
26
|
+
* bulk job reports a count — borrowing BULK's vocabulary would make the
|
|
27
|
+
* progress row say the wrong thing about every failure.
|
|
28
|
+
*/
|
|
29
|
+
STICKER_TRACE: "sticker-trace",
|
|
22
30
|
};
|
|
23
31
|
export const RealtimeEventStatus = {
|
|
24
32
|
IDLE: "idle",
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { normalizeError } from "../../errors/normalize.js";
|
|
3
3
|
import { useState, useCallback } from "react";
|
|
4
|
-
|
|
4
|
+
// Defining modules, not the sibling barrel — Root Cause #18. `ui/index.ts` and
|
|
5
|
+
// `react/index.ts` re-exported into each other, which is the whole of
|
|
6
|
+
// `audit-import-cycles` component 1: an 18-module knot held together entirely
|
|
7
|
+
// by barrel hops, none of which needed the barrel.
|
|
8
|
+
import { useToast } from "../../ui/components/toast-context.js";
|
|
5
9
|
export function useEntityDelete(opts) {
|
|
6
10
|
const [deletingId, setDeletingId] = useState(null);
|
|
7
11
|
const { showToast } = useToast();
|
|
@@ -10,7 +10,11 @@
|
|
|
10
10
|
* inline (e.g. reviews, settings views).
|
|
11
11
|
*/
|
|
12
12
|
import { useState, useCallback, useRef, useEffect } from "react";
|
|
13
|
-
|
|
13
|
+
// Defining modules, not the sibling barrel — Root Cause #18. `ui/index.ts` and
|
|
14
|
+
// `react/index.ts` re-exported into each other, which is the whole of
|
|
15
|
+
// `audit-import-cycles` component 1: an 18-module knot held together entirely
|
|
16
|
+
// by barrel hops, none of which needed the barrel.
|
|
17
|
+
import { useToast } from "../../ui/components/toast-context.js";
|
|
14
18
|
export function useMessage() {
|
|
15
19
|
const { showToast } = useToast();
|
|
16
20
|
const [message, setMessage] = useState(null);
|