@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
|
@@ -4,11 +4,13 @@ import { normalizeError } from "../../../errors/normalize.js";
|
|
|
4
4
|
*
|
|
5
5
|
* Data access layer for bid documents in Firestore
|
|
6
6
|
*/
|
|
7
|
-
import { BaseRepository, getFirestoreCount, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase/index.js";
|
|
7
|
+
import { BaseRepository, getFirestoreCount, prepareForFirestore, parseSieveDateValue, applySieveToFirestore, } from "../../../providers/db-firebase/index.js";
|
|
8
8
|
import { DatabaseError } from "../../../errors/index.js";
|
|
9
|
+
import { buildBidSearchTxt } from "../../../utils/search-txt-builders.js";
|
|
10
|
+
import { planSearchTxt, beginSearchWindow, emptySearchResult, } from "../../../utils/search-txt-query.js";
|
|
9
11
|
import { BID_COLLECTION, BID_TRACKED_FIELDS, BID_HISTORY_PII_FIELDS, createBidId } from "../schemas/index.js";
|
|
10
12
|
import { withHistory } from "../../../_internal/shared/history/index.js";
|
|
11
|
-
import {
|
|
13
|
+
import { BID_PII_FIELDS, maskPii, revealPii, } from "../../../security/index.js";
|
|
12
14
|
import { BID_FIELDS } from "../../../constants/field-names.js";
|
|
13
15
|
export class BidRepository extends BaseRepository {
|
|
14
16
|
constructor() {
|
|
@@ -34,22 +36,64 @@ export class BidRepository extends BaseRepository {
|
|
|
34
36
|
this.piiFields = BID_PII_FIELDS;
|
|
35
37
|
}
|
|
36
38
|
/** Override mapDoc to auto-decrypt PII on every bid read */
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
/*
|
|
40
|
+
* 🛑 `mapDoc` is NOT overridden, and that absence IS the change.
|
|
41
|
+
*
|
|
42
|
+
* It used to decrypt on every read, so ciphertext never left the database
|
|
43
|
+
* and every caller handled plaintext without ever saying so. Following
|
|
44
|
+
* `SiteSettingsRepository`: reads return what Firestore holds, and plaintext
|
|
45
|
+
* requires one of the two named methods below.
|
|
46
|
+
*
|
|
47
|
+
* A convention would not hold this. `BidDocument`'s PII fields are
|
|
48
|
+
* `Encrypted<string>`, assignable to nothing that wants a plain `string`, so
|
|
49
|
+
* a reader that skips both accessors is a compile error naming file and line.
|
|
50
|
+
*/
|
|
51
|
+
/** Plaintext PII. **Opt-in and named** — shows up in review and in a grep. */
|
|
52
|
+
revealBid(doc) {
|
|
53
|
+
return revealPii(doc, BID_PII_FIELDS);
|
|
54
|
+
}
|
|
55
|
+
/** As `revealBid`, for a list read. */
|
|
56
|
+
revealBids(docs) {
|
|
57
|
+
return docs.map((d) => this.revealBid(d));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Masked PII — **the default for any surface that only needs to identify a
|
|
61
|
+
* row to a human.** Decrypts first, then masks: the mask helpers refuse
|
|
62
|
+
* ciphertext by design, so passing a stored field straight in would return
|
|
63
|
+
* "Anonymous" for every row.
|
|
64
|
+
*/
|
|
65
|
+
maskedBid(doc) {
|
|
66
|
+
return maskPii(doc, BID_PII_FIELDS);
|
|
67
|
+
}
|
|
68
|
+
/** As `maskedBid`, for a list read. */
|
|
69
|
+
maskedBids(docs) {
|
|
70
|
+
return docs.map((d) => this.maskedBid(d));
|
|
42
71
|
}
|
|
43
72
|
/**
|
|
44
73
|
* Create new bid with auto-generated ID
|
|
45
74
|
*/
|
|
46
|
-
|
|
75
|
+
/*
|
|
76
|
+
* 🛑 NOT an `override` of `create`, and the rename is forced rather than
|
|
77
|
+
* stylistic.
|
|
78
|
+
*
|
|
79
|
+
* `BaseRepository.create` is declared `(data: Partial<Doc> | FirestoreDocument)`,
|
|
80
|
+
* i.e. it promises to accept the CIPHERTEXT shape. This method accepts
|
|
81
|
+
* PLAINTEXT and encrypts. `string` and `Encrypted<string>` are incompatible
|
|
82
|
+
* in both directions, so an override is a TS2416 no matter which way the
|
|
83
|
+
* check runs — and it should be, because the two signatures genuinely
|
|
84
|
+
* disagree about what the caller is holding.
|
|
85
|
+
*
|
|
86
|
+
* Five call sites across both repositories; `create` remains inherited for
|
|
87
|
+
* anything that legitimately has ciphertext already.
|
|
88
|
+
*/
|
|
89
|
+
async createBid(input) {
|
|
47
90
|
const bidIdInput = {
|
|
48
91
|
productName: input.productTitle,
|
|
49
92
|
userFirstName: input.userName.split(" ")[0] || input.userName,
|
|
50
93
|
date: new Date(),
|
|
51
94
|
};
|
|
52
95
|
const id = createBidId(bidIdInput);
|
|
96
|
+
// Plain in, ciphertext out — the write hook encrypts below.
|
|
53
97
|
const bidData = {
|
|
54
98
|
...input,
|
|
55
99
|
status: "active",
|
|
@@ -64,7 +108,16 @@ export class BidRepository extends BaseRepository {
|
|
|
64
108
|
.collection(this.collection)
|
|
65
109
|
.doc(id)
|
|
66
110
|
.set(prepareForFirestore(encrypted));
|
|
67
|
-
|
|
111
|
+
/*
|
|
112
|
+
* Returns `BidPlain`, and the declared type now says so.
|
|
113
|
+
*
|
|
114
|
+
* This line's own comment has always read "return plaintext to caller"
|
|
115
|
+
* while the signature promised `BidDocument` — the exact mismatch
|
|
116
|
+
* `Encrypted<string>` exists to surface. It echoes the input rather than
|
|
117
|
+
* re-reading, which is deliberate (a read-after-write costs a Firestore
|
|
118
|
+
* read on every bid), so what comes back is the plaintext that went in.
|
|
119
|
+
*/
|
|
120
|
+
return { id, ...bidData };
|
|
68
121
|
}
|
|
69
122
|
/**
|
|
70
123
|
* Find bids by product ID
|
|
@@ -441,11 +494,53 @@ export class BidRepository extends BaseRepository {
|
|
|
441
494
|
/**
|
|
442
495
|
* Paginated, Firestore-native bid list (admin use).
|
|
443
496
|
*/
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
497
|
+
/** Derived on every write path via `applyWriteHooks`. */
|
|
498
|
+
buildSearchTxtFor(data) {
|
|
499
|
+
return buildBidSearchTxt(data);
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* `opts.search` is a searchTxt PUSHDOWN, not a Sieve clause.
|
|
503
|
+
*
|
|
504
|
+
* ## What this replaces, on both of its two surfaces
|
|
505
|
+
*
|
|
506
|
+
* `/api/store/bids` searched the bidder with `userName@=`, a CASE-SENSITIVE
|
|
507
|
+
* prefix — the only thing Firestore can do for a prefix — so a seller typing
|
|
508
|
+
* "ravi" did not find "Ravi", and "kumar" never found anyone at all.
|
|
509
|
+
* `/api/user/bids` filtered `productTitle.includes(q)` in memory AFTER
|
|
510
|
+
* paging, so a match on page 2 was unreachable.
|
|
511
|
+
*
|
|
512
|
+
* Token search fixes both: `buildSearchTxt` normalises case and indexes word
|
|
513
|
+
* prefixes, so the query and the index meet on tokens rather than on a
|
|
514
|
+
* substring of one field.
|
|
515
|
+
*
|
|
516
|
+
* 🛑 `planSearchTxt`'s `empty` guard is the load-bearing part. A query that
|
|
517
|
+
* normalises to no usable token (`"!!!"`, `"—"`) MUST return nothing —
|
|
518
|
+
* emitting no clause instead returns the whole collection and calls it a
|
|
519
|
+
* search result, which is the shape of every silent-search bug in this
|
|
520
|
+
* codebase.
|
|
521
|
+
*/
|
|
522
|
+
async list(model, opts) {
|
|
523
|
+
const plan = planSearchTxt(opts?.search);
|
|
524
|
+
if (plan.empty)
|
|
525
|
+
return emptySearchResult();
|
|
526
|
+
if (!plan.head) {
|
|
527
|
+
return this.sieveQuery(model, BidRepository.SIEVE_FIELDS, {
|
|
528
|
+
defaultPageSize: 50,
|
|
529
|
+
maxPageSize: 200,
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
const baseQuery = this.getCollection().where("searchTxt", "array-contains", plan.head);
|
|
533
|
+
// One bounded window, one raised maxPageSize, one page slice — hand-rolling
|
|
534
|
+
// the three is how other repositories each ended up with two of them.
|
|
535
|
+
const win = beginSearchWindow(model, plan);
|
|
536
|
+
const result = await applySieveToFirestore({
|
|
537
|
+
baseQuery,
|
|
538
|
+
model: win.model,
|
|
539
|
+
options: { maxPageSize: win.maxPageSize(200) },
|
|
540
|
+
fields: BidRepository.SIEVE_FIELDS,
|
|
541
|
+
mapDoc: (snap) => this.mapDoc(snap),
|
|
448
542
|
});
|
|
543
|
+
return win.finish(result);
|
|
449
544
|
}
|
|
450
545
|
}
|
|
451
546
|
// ---------------------------------------------------------------------------
|
|
@@ -457,6 +552,12 @@ BidRepository.SIEVE_FIELDS = {
|
|
|
457
552
|
productTitle: { canFilter: true, canSort: true },
|
|
458
553
|
userId: { canFilter: true, canSort: false },
|
|
459
554
|
userName: { canFilter: true, canSort: true },
|
|
555
|
+
/*
|
|
556
|
+
* Filterable so the grammar admits it; the real read is an
|
|
557
|
+
* `array-contains` pushdown in `list()`, not a Sieve clause — Sieve cannot
|
|
558
|
+
* express array membership.
|
|
559
|
+
*/
|
|
560
|
+
searchTxt: { canFilter: true, canSort: false },
|
|
460
561
|
// Encrypted (BID_PII_FIELDS). Filtering compares plaintext against
|
|
461
562
|
// `enc:v1:…` and matches ZERO rows with a 200; sorting orders by base64
|
|
462
563
|
// noise. It appeared to work only because the column was still
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { type GenerateBidIdInput } from "../../../utils/id-generators";
|
|
5
5
|
import type { StatusChangeEntry } from "../../../_internal/shared/history/types";
|
|
6
6
|
import type { BaseDocument } from "../../../_internal/shared/types/base-document";
|
|
7
|
+
import type { Encrypted, Plaintext } from "../../../security/encrypted";
|
|
7
8
|
export type BidStatus = "active" | "outbid" | "won" | "lost" | "cancelled"
|
|
8
9
|
/** Won, then the buyer let the 48h payment window lapse. */
|
|
9
10
|
| "forfeited";
|
|
@@ -16,12 +17,22 @@ export declare const BidStatusValues: {
|
|
|
16
17
|
readonly CANCELLED: "cancelled";
|
|
17
18
|
readonly FORFEITED: "forfeited";
|
|
18
19
|
};
|
|
20
|
+
/**
|
|
21
|
+
* `BidDocument` with its PII as plain `string` — what the named repository
|
|
22
|
+
* accessors return, and what a WRITE path accepts (the repository encrypts).
|
|
23
|
+
*
|
|
24
|
+
* `Plaintext<T>` is the one definition of this shape; see `security/encrypted.ts`.
|
|
25
|
+
* It is deliberately NOT distinguishable from a MASKED value — `maskPii`
|
|
26
|
+
* returns plain strings too, and no type can express "these characters are
|
|
27
|
+
* asterisks". The distinction is which named method you called.
|
|
28
|
+
*/
|
|
29
|
+
export type BidPlain = Plaintext<BidDocument>;
|
|
19
30
|
export interface BidDocument extends BaseDocument {
|
|
20
31
|
productId: string;
|
|
21
32
|
productTitle: string;
|
|
22
33
|
userId: string;
|
|
23
34
|
userName: string;
|
|
24
|
-
userEmail: string
|
|
35
|
+
userEmail: Encrypted<string>;
|
|
25
36
|
bidAmount: number;
|
|
26
37
|
currency: string;
|
|
27
38
|
status: BidStatus;
|
|
@@ -29,6 +40,15 @@ export interface BidDocument extends BaseDocument {
|
|
|
29
40
|
previousBidAmount?: number;
|
|
30
41
|
bidDate: Date;
|
|
31
42
|
autoMaxBid?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Token index over `productTitle` + `userName`, derived on every write.
|
|
45
|
+
*
|
|
46
|
+
* 🛑 `userEmail` is deliberately ABSENT — it is the one entry in
|
|
47
|
+
* `BID_PII_FIELDS`, and a searchTxt over an encrypted field IS that field in
|
|
48
|
+
* plaintext (decision D1). `userName` is not in that registry and is already
|
|
49
|
+
* in `BID_PUBLIC_FIELDS`, so indexing it discloses nothing new.
|
|
50
|
+
*/
|
|
51
|
+
searchTxt?: string[];
|
|
32
52
|
/**
|
|
33
53
|
* The order this winning bid was settled into. Written by
|
|
34
54
|
* `finalizeLockedLines` once the winner actually pays; absent on a won-but-
|
|
@@ -65,13 +85,13 @@ export interface BidDocument extends BaseDocument {
|
|
|
65
85
|
statusHistoryTruncated?: number;
|
|
66
86
|
}
|
|
67
87
|
export declare const BID_COLLECTION: "bids";
|
|
68
|
-
export declare const BID_INDEXED_FIELDS: readonly ["productId", "userId", "status", "isWinning", "bidDate", "createdAt"];
|
|
88
|
+
export declare const BID_INDEXED_FIELDS: readonly ["productId", "userId", "status", "isWinning", "bidDate", "createdAt", "searchTxt"];
|
|
69
89
|
export declare const DEFAULT_BID_DATA: Partial<BidDocument>;
|
|
70
90
|
export declare const BID_PUBLIC_FIELDS: readonly ["id", "productId", "productTitle", "userName", "bidAmount", "currency", "bidDate", "isWinning", "createdAt"];
|
|
71
91
|
export declare const BID_UPDATABLE_FIELDS: readonly ["autoMaxBid"];
|
|
72
|
-
export type BidCreateInput = Omit<
|
|
92
|
+
export type BidCreateInput = Omit<BidPlain, "id" | "createdAt" | "updatedAt" | "status" | "isWinning">;
|
|
73
93
|
export type BidUpdateInput = Partial<Pick<BidDocument, (typeof BID_UPDATABLE_FIELDS)[number]>>;
|
|
74
|
-
export type BidAdminUpdateInput = Partial<Omit<
|
|
94
|
+
export type BidAdminUpdateInput = Partial<Omit<BidPlain, "id" | "createdAt">>;
|
|
75
95
|
export declare const bidQueryHelpers: {
|
|
76
96
|
readonly byProduct: (productId: string) => readonly ["productId", "==", string];
|
|
77
97
|
readonly byUser: (userId: string) => readonly ["userId", "==", string];
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* Auth, rate-limiting, and Next.js specifics are handled by the consumer.
|
|
6
6
|
*/
|
|
7
7
|
import { cache } from "react";
|
|
8
|
-
import { maskPublicReview } from "../../../security/index.js";
|
|
9
8
|
import { safeRead } from "../../../errors/safe-read.js";
|
|
10
9
|
import { finalizeStagedMediaField } from "../../media/finalize.js";
|
|
11
10
|
import { userRepository } from "../repository/user.repository.js";
|
|
@@ -86,7 +85,16 @@ export async function getSellerReviews(storeId) {
|
|
|
86
85
|
productId: r.productId,
|
|
87
86
|
productTitle: r.productTitle,
|
|
88
87
|
userId: r.userId,
|
|
89
|
-
|
|
88
|
+
/*
|
|
89
|
+
* 🛑 `maskedReview`, not `maskPublicReview`.
|
|
90
|
+
*
|
|
91
|
+
* `maskPublicReview` calls `maskName`, which refuses a ciphertext input by
|
|
92
|
+
* design and answers "Anonymous". Since `ReviewRepository.mapDoc` stopped
|
|
93
|
+
* decrypting, `r.userName` IS ciphertext — so this rendered every reviewer
|
|
94
|
+
* on every public profile as "Anonymous". `maskedReview` decrypts first,
|
|
95
|
+
* then masks, which is the whole reason it exists.
|
|
96
|
+
*/
|
|
97
|
+
userName: reviewRepository.maskedReview(r).userName,
|
|
90
98
|
userAvatar: r.userAvatar,
|
|
91
99
|
rating: r.rating,
|
|
92
100
|
title: r.title,
|
|
@@ -117,7 +125,16 @@ export async function getReviewsAuthoredBy(userId) {
|
|
|
117
125
|
productId: r.productId,
|
|
118
126
|
productTitle: r.productTitle,
|
|
119
127
|
userId: r.userId,
|
|
120
|
-
|
|
128
|
+
/*
|
|
129
|
+
* 🛑 `maskedReview`, not `maskPublicReview`.
|
|
130
|
+
*
|
|
131
|
+
* `maskPublicReview` calls `maskName`, which refuses a ciphertext input by
|
|
132
|
+
* design and answers "Anonymous". Since `ReviewRepository.mapDoc` stopped
|
|
133
|
+
* decrypting, `r.userName` IS ciphertext — so this rendered every reviewer
|
|
134
|
+
* on every public profile as "Anonymous". `maskedReview` decrypts first,
|
|
135
|
+
* then masks, which is the whole reason it exists.
|
|
136
|
+
*/
|
|
137
|
+
userName: reviewRepository.maskedReview(r).userName,
|
|
121
138
|
userAvatar: r.userAvatar,
|
|
122
139
|
rating: r.rating,
|
|
123
140
|
title: r.title,
|
|
@@ -142,7 +159,16 @@ export async function getReviewsReceivedBy(userId) {
|
|
|
142
159
|
productId: r.productId,
|
|
143
160
|
productTitle: r.productTitle,
|
|
144
161
|
userId: r.userId,
|
|
145
|
-
|
|
162
|
+
/*
|
|
163
|
+
* 🛑 `maskedReview`, not `maskPublicReview`.
|
|
164
|
+
*
|
|
165
|
+
* `maskPublicReview` calls `maskName`, which refuses a ciphertext input by
|
|
166
|
+
* design and answers "Anonymous". Since `ReviewRepository.mapDoc` stopped
|
|
167
|
+
* decrypting, `r.userName` IS ciphertext — so this rendered every reviewer
|
|
168
|
+
* on every public profile as "Anonymous". `maskedReview` decrypts first,
|
|
169
|
+
* then masks, which is the whole reason it exists.
|
|
170
|
+
*/
|
|
171
|
+
userName: reviewRepository.maskedReview(r).userName,
|
|
146
172
|
userAvatar: r.userAvatar,
|
|
147
173
|
rating: r.rating,
|
|
148
174
|
title: r.title,
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export { RoleGate, ProtectedRoute } from "./Guards";
|
|
2
2
|
export type { RoleGateProps, ProtectedRouteProps, AuthGuardUser, AuthRouteConfig, } from "./Guards";
|
|
3
3
|
export { SocialAuthButtons } from "./SocialAuthButtons";
|
|
4
|
-
export { AuthStatusPanel } from "./AuthStatusPanel";
|
|
5
4
|
export { LoginForm } from "./LoginForm";
|
|
6
5
|
export type { LoginFormProps, LoginFormValues } from "./LoginForm";
|
|
7
6
|
export { RegisterForm } from "./RegisterForm";
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export { RoleGate, ProtectedRoute } from "./Guards.js";
|
|
2
2
|
export { SocialAuthButtons } from "./SocialAuthButtons.js";
|
|
3
|
-
export { AuthStatusPanel } from "./AuthStatusPanel.js";
|
|
4
3
|
export { LoginForm } from "./LoginForm.js";
|
|
5
4
|
export { RegisterForm } from "./RegisterForm.js";
|
|
6
5
|
export { ForgotPasswordView } from "./ForgotPasswordView.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { DocumentReference
|
|
1
|
+
import type { DocumentReference } from "firebase-admin/firestore";
|
|
2
2
|
import { BaseRepository, type FirebaseSieveFields, type FirebaseSieveResult, type SieveModel } from "../../../providers/db-firebase";
|
|
3
|
-
import { type SessionCreateInput, type SessionDocument, type SessionUpdateInput } from "../schemas";
|
|
3
|
+
import { type SessionCreateInput, type SessionDocument, type SessionPlain, type SessionUpdateInput } from "../schemas";
|
|
4
4
|
export declare class SessionRepository extends BaseRepository<SessionDocument> {
|
|
5
5
|
static readonly SIEVE_FIELDS: FirebaseSieveFields;
|
|
6
6
|
/**
|
|
@@ -18,7 +18,21 @@ export declare class SessionRepository extends BaseRepository<SessionDocument> {
|
|
|
18
18
|
protected piiFields: readonly ["deviceInfo.ip", "deviceInfo.userAgent", "location.city"];
|
|
19
19
|
constructor();
|
|
20
20
|
/** Decrypt on read so callers see the same shape they wrote. */
|
|
21
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Plaintext PII. **Opt-in and named** — for the security page that shows a
|
|
23
|
+
* user their own sessions, and for abuse investigation.
|
|
24
|
+
*/
|
|
25
|
+
revealSession(doc: SessionDocument): SessionPlain;
|
|
26
|
+
/** As `revealSession`, for a list read. */
|
|
27
|
+
revealSessions(docs: readonly SessionDocument[]): SessionPlain[];
|
|
28
|
+
/**
|
|
29
|
+
* Masked PII — the default. `deviceInfo.ip` becomes a last-four mask, which
|
|
30
|
+
* is what every admin surface here actually needs: enough to tell two
|
|
31
|
+
* sessions apart, not enough to geolocate a person.
|
|
32
|
+
*/
|
|
33
|
+
maskedSession(doc: SessionDocument): SessionPlain;
|
|
34
|
+
/** As `maskedSession`, for a list read. */
|
|
35
|
+
maskedSessions(docs: readonly SessionDocument[]): SessionPlain[];
|
|
22
36
|
list(model: SieveModel): Promise<FirebaseSieveResult<SessionDocument>>;
|
|
23
37
|
listForUser(userId: string, model: SieveModel): Promise<FirebaseSieveResult<SessionDocument>>;
|
|
24
38
|
createSession(userId: string, data: Omit<SessionCreateInput, "userId" | "expiresAt" | "isActive">): Promise<SessionDocument>;
|
|
@@ -3,7 +3,7 @@ import { DatabaseError } from "../../../errors/index.js";
|
|
|
3
3
|
import { serverLogger } from "../../../monitoring/index.js";
|
|
4
4
|
import { BaseRepository, parseSieveDateValue, } from "../../../providers/db-firebase/index.js";
|
|
5
5
|
import { generateSessionId } from "../token-helpers.js";
|
|
6
|
-
import {
|
|
6
|
+
import { maskPii, revealPii } from "../../../security/pii-accessors.js";
|
|
7
7
|
import { SESSION_COLLECTION, SESSION_EXPIRATION_MS, SESSION_FIELDS, } from "../schemas/index.js";
|
|
8
8
|
export class SessionRepository extends BaseRepository {
|
|
9
9
|
constructor() {
|
|
@@ -27,9 +27,36 @@ export class SessionRepository extends BaseRepository {
|
|
|
27
27
|
];
|
|
28
28
|
}
|
|
29
29
|
/** Decrypt on read so callers see the same shape they wrote. */
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
/*
|
|
31
|
+
* 🛑 `mapDoc` is NOT overridden — it used to decrypt on every read, so the
|
|
32
|
+
* device IP and user-agent of every session left the database in the clear.
|
|
33
|
+
*
|
|
34
|
+
* All three PII fields here are NESTED, which is why `maskPii` had to learn
|
|
35
|
+
* dotted paths rather than skip them: a masked session that returned the real
|
|
36
|
+
* IP would be a function whose name is the only evidence it did anything.
|
|
37
|
+
*/
|
|
38
|
+
/**
|
|
39
|
+
* Plaintext PII. **Opt-in and named** — for the security page that shows a
|
|
40
|
+
* user their own sessions, and for abuse investigation.
|
|
41
|
+
*/
|
|
42
|
+
revealSession(doc) {
|
|
43
|
+
return revealPii(doc, this.piiFields);
|
|
44
|
+
}
|
|
45
|
+
/** As `revealSession`, for a list read. */
|
|
46
|
+
revealSessions(docs) {
|
|
47
|
+
return docs.map((d) => this.revealSession(d));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Masked PII — the default. `deviceInfo.ip` becomes a last-four mask, which
|
|
51
|
+
* is what every admin surface here actually needs: enough to tell two
|
|
52
|
+
* sessions apart, not enough to geolocate a person.
|
|
53
|
+
*/
|
|
54
|
+
maskedSession(doc) {
|
|
55
|
+
return maskPii(doc, this.piiFields);
|
|
56
|
+
}
|
|
57
|
+
/** As `maskedSession`, for a list read. */
|
|
58
|
+
maskedSessions(docs) {
|
|
59
|
+
return docs.map((d) => this.maskedSession(d));
|
|
33
60
|
}
|
|
34
61
|
async list(model) {
|
|
35
62
|
return this.sieveQuery(model, SessionRepository.SIEVE_FIELDS);
|
|
@@ -43,6 +70,8 @@ export class SessionRepository extends BaseRepository {
|
|
|
43
70
|
const now = new Date();
|
|
44
71
|
const expiresAt = new Date(now.getTime() + SESSION_EXPIRATION_MS);
|
|
45
72
|
const sessionId = generateSessionId();
|
|
73
|
+
// Plain in, ciphertext out — the write hook encrypts the three nested
|
|
74
|
+
// `piiFields` paths below.
|
|
46
75
|
const sessionData = {
|
|
47
76
|
userId,
|
|
48
77
|
deviceInfo: data.deviceInfo,
|
|
@@ -69,7 +98,19 @@ export class SessionRepository extends BaseRepository {
|
|
|
69
98
|
// that supplies a location — the hot activity ping stays a single write.
|
|
70
99
|
if (data?.location) {
|
|
71
100
|
const current = await this.findById(sessionId); // mapDoc → already decrypted
|
|
72
|
-
|
|
101
|
+
/*
|
|
102
|
+
* Merged off the REVEALED current session, not the stored one.
|
|
103
|
+
*
|
|
104
|
+
* `location.city` is one of this repository's three nested PII paths, so
|
|
105
|
+
* `current.location` holds ciphertext — spreading it into a plaintext
|
|
106
|
+
* patch would re-encrypt the city on the way down and make it
|
|
107
|
+
* permanently unreadable, the same defect as the payout crons.
|
|
108
|
+
*/
|
|
109
|
+
const currentPlain = current ? this.revealSession(current) : null;
|
|
110
|
+
updateData.location = {
|
|
111
|
+
...(currentPlain?.location ?? {}),
|
|
112
|
+
...data.location,
|
|
113
|
+
};
|
|
73
114
|
}
|
|
74
115
|
try {
|
|
75
116
|
await this.update(sessionId, updateData);
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type { DocumentSnapshot } from "../../../providers/db-firebase";
|
|
2
1
|
import { BaseRepository } from "../../../providers/db-firebase";
|
|
3
|
-
import { type EmailVerificationTokenDocument, type PasswordResetTokenDocument } from "../schemas";
|
|
2
|
+
import { type EmailVerificationTokenDocument, type EmailVerificationTokenPlain, type PasswordResetTokenDocument, type PasswordResetTokenPlain } from "../schemas";
|
|
4
3
|
export declare class EmailVerificationTokenRepository extends BaseRepository<EmailVerificationTokenDocument> {
|
|
5
4
|
constructor();
|
|
6
5
|
/**
|
|
@@ -19,7 +18,19 @@ export declare class EmailVerificationTokenRepository extends BaseRepository<Ema
|
|
|
19
18
|
*/
|
|
20
19
|
protected piiFields: readonly ["email"];
|
|
21
20
|
protected piiIndexMap: Record<string, string>;
|
|
22
|
-
|
|
21
|
+
/** Plaintext PII. **Opt-in and named** — shows up in review and in a grep. */
|
|
22
|
+
revealToken(doc: EmailVerificationTokenDocument): EmailVerificationTokenPlain;
|
|
23
|
+
/** As `revealToken`, for a list read. */
|
|
24
|
+
revealTokens(docs: readonly EmailVerificationTokenDocument[]): EmailVerificationTokenPlain[];
|
|
25
|
+
/**
|
|
26
|
+
* Masked PII — **the default for any surface that only needs to identify a
|
|
27
|
+
* row to a human.** Decrypts first, then masks: the mask helpers refuse
|
|
28
|
+
* ciphertext by design, so passing a stored field straight in would return
|
|
29
|
+
* "Anonymous" for every row.
|
|
30
|
+
*/
|
|
31
|
+
maskedToken(doc: EmailVerificationTokenDocument): EmailVerificationTokenPlain;
|
|
32
|
+
/** As `maskedToken`, for a list read. */
|
|
33
|
+
maskedTokens(docs: readonly EmailVerificationTokenDocument[]): EmailVerificationTokenPlain[];
|
|
23
34
|
findByToken(token: string): Promise<EmailVerificationTokenDocument | null>;
|
|
24
35
|
findByUserId(userId: string): Promise<EmailVerificationTokenDocument[]>;
|
|
25
36
|
findByEmail(email: string): Promise<EmailVerificationTokenDocument[]>;
|
|
@@ -39,7 +50,19 @@ export declare class PasswordResetTokenRepository extends BaseRepository<Passwor
|
|
|
39
50
|
*/
|
|
40
51
|
protected piiFields: readonly ["email"];
|
|
41
52
|
protected piiIndexMap: Record<string, string>;
|
|
42
|
-
|
|
53
|
+
/** Plaintext PII. **Opt-in and named** — shows up in review and in a grep. */
|
|
54
|
+
revealResetToken(doc: PasswordResetTokenDocument): PasswordResetTokenPlain;
|
|
55
|
+
/** As `revealResetToken`, for a list read. */
|
|
56
|
+
revealResetTokens(docs: readonly PasswordResetTokenDocument[]): PasswordResetTokenPlain[];
|
|
57
|
+
/**
|
|
58
|
+
* Masked PII — **the default for any surface that only needs to identify a
|
|
59
|
+
* row to a human.** Decrypts first, then masks: the mask helpers refuse
|
|
60
|
+
* ciphertext by design, so passing a stored field straight in would return
|
|
61
|
+
* "Anonymous" for every row.
|
|
62
|
+
*/
|
|
63
|
+
maskedResetToken(doc: PasswordResetTokenDocument): PasswordResetTokenPlain;
|
|
64
|
+
/** As `maskedResetToken`, for a list read. */
|
|
65
|
+
maskedResetTokens(docs: readonly PasswordResetTokenDocument[]): PasswordResetTokenPlain[];
|
|
43
66
|
findByToken(token: string): Promise<PasswordResetTokenDocument | null>;
|
|
44
67
|
findByUserId(userId: string): Promise<PasswordResetTokenDocument[]>;
|
|
45
68
|
findByEmail(email: string): Promise<PasswordResetTokenDocument[]>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { normalizeError } from "../../../errors/normalize.js";
|
|
2
2
|
import { DatabaseError } from "../../../errors/index.js";
|
|
3
3
|
import { BaseRepository } from "../../../providers/db-firebase/index.js";
|
|
4
|
-
import { TOKEN_PII_FIELDS, TOKEN_PII_INDEX_MAP,
|
|
4
|
+
import { TOKEN_PII_FIELDS, TOKEN_PII_INDEX_MAP, maskPii, piiBlindIndex, revealPii, } from "../../../security/index.js";
|
|
5
5
|
import { resolveDate } from "../../../utils/index.js";
|
|
6
6
|
import { EMAIL_VERIFICATION_COLLECTION, PASSWORD_RESET_COLLECTION, TOKEN_FIELDS, } from "../schemas/index.js";
|
|
7
7
|
export class EmailVerificationTokenRepository extends BaseRepository {
|
|
@@ -24,11 +24,38 @@ export class EmailVerificationTokenRepository extends BaseRepository {
|
|
|
24
24
|
this.piiFields = TOKEN_PII_FIELDS;
|
|
25
25
|
this.piiIndexMap = TOKEN_PII_INDEX_MAP;
|
|
26
26
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
/*
|
|
28
|
+
* 🛑 `mapDoc` is NOT overridden, and that absence IS the change.
|
|
29
|
+
*
|
|
30
|
+
* It used to decrypt on every read, so ciphertext never left the database
|
|
31
|
+
* and every caller handled plaintext without ever saying so. Following
|
|
32
|
+
* `SiteSettingsRepository`: reads return what Firestore holds, and plaintext
|
|
33
|
+
* requires one of the two named methods below.
|
|
34
|
+
*
|
|
35
|
+
* A convention would not hold this. `EmailVerificationTokenDocument`'s PII fields are
|
|
36
|
+
* `Encrypted<string>`, assignable to nothing that wants a plain `string`, so
|
|
37
|
+
* a reader that skips both accessors is a compile error naming file and line.
|
|
38
|
+
*/
|
|
39
|
+
/** Plaintext PII. **Opt-in and named** — shows up in review and in a grep. */
|
|
40
|
+
revealToken(doc) {
|
|
41
|
+
return revealPii(doc, TOKEN_PII_FIELDS);
|
|
42
|
+
}
|
|
43
|
+
/** As `revealToken`, for a list read. */
|
|
44
|
+
revealTokens(docs) {
|
|
45
|
+
return docs.map((d) => this.revealToken(d));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Masked PII — **the default for any surface that only needs to identify a
|
|
49
|
+
* row to a human.** Decrypts first, then masks: the mask helpers refuse
|
|
50
|
+
* ciphertext by design, so passing a stored field straight in would return
|
|
51
|
+
* "Anonymous" for every row.
|
|
52
|
+
*/
|
|
53
|
+
maskedToken(doc) {
|
|
54
|
+
return maskPii(doc, TOKEN_PII_FIELDS);
|
|
55
|
+
}
|
|
56
|
+
/** As `maskedToken`, for a list read. */
|
|
57
|
+
maskedTokens(docs) {
|
|
58
|
+
return docs.map((d) => this.maskedToken(d));
|
|
32
59
|
}
|
|
33
60
|
async findByToken(token) {
|
|
34
61
|
return this.findOneBy(TOKEN_FIELDS.TOKEN, token);
|
|
@@ -97,11 +124,38 @@ export class PasswordResetTokenRepository extends BaseRepository {
|
|
|
97
124
|
this.piiFields = TOKEN_PII_FIELDS;
|
|
98
125
|
this.piiIndexMap = TOKEN_PII_INDEX_MAP;
|
|
99
126
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
127
|
+
/*
|
|
128
|
+
* 🛑 `mapDoc` is NOT overridden, and that absence IS the change.
|
|
129
|
+
*
|
|
130
|
+
* It used to decrypt on every read, so ciphertext never left the database
|
|
131
|
+
* and every caller handled plaintext without ever saying so. Following
|
|
132
|
+
* `SiteSettingsRepository`: reads return what Firestore holds, and plaintext
|
|
133
|
+
* requires one of the two named methods below.
|
|
134
|
+
*
|
|
135
|
+
* A convention would not hold this. `PasswordResetTokenDocument`'s PII fields are
|
|
136
|
+
* `Encrypted<string>`, assignable to nothing that wants a plain `string`, so
|
|
137
|
+
* a reader that skips both accessors is a compile error naming file and line.
|
|
138
|
+
*/
|
|
139
|
+
/** Plaintext PII. **Opt-in and named** — shows up in review and in a grep. */
|
|
140
|
+
revealResetToken(doc) {
|
|
141
|
+
return revealPii(doc, TOKEN_PII_FIELDS);
|
|
142
|
+
}
|
|
143
|
+
/** As `revealResetToken`, for a list read. */
|
|
144
|
+
revealResetTokens(docs) {
|
|
145
|
+
return docs.map((d) => this.revealResetToken(d));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Masked PII — **the default for any surface that only needs to identify a
|
|
149
|
+
* row to a human.** Decrypts first, then masks: the mask helpers refuse
|
|
150
|
+
* ciphertext by design, so passing a stored field straight in would return
|
|
151
|
+
* "Anonymous" for every row.
|
|
152
|
+
*/
|
|
153
|
+
maskedResetToken(doc) {
|
|
154
|
+
return maskPii(doc, TOKEN_PII_FIELDS);
|
|
155
|
+
}
|
|
156
|
+
/** As `maskedResetToken`, for a list read. */
|
|
157
|
+
maskedResetTokens(docs) {
|
|
158
|
+
return docs.map((d) => this.maskedResetToken(d));
|
|
105
159
|
}
|
|
106
160
|
async findByToken(token) {
|
|
107
161
|
return this.findOneBy(TOKEN_FIELDS.TOKEN, token);
|