@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
|
@@ -1,11 +1,39 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { JsonValue } from "../../../schemas/types";
|
|
2
2
|
import { BaseRepository, type FirebaseSieveFields, type FirebaseSieveResult, type SieveModel } from "../../../providers/db-firebase";
|
|
3
3
|
import type { UserRole } from "../types";
|
|
4
|
-
import { type UserDocument } from "../schemas";
|
|
4
|
+
import { type UserDocument, type UserPlain } from "../schemas";
|
|
5
5
|
export declare class UserRepository extends BaseRepository<UserDocument> {
|
|
6
6
|
static readonly SIEVE_FIELDS: FirebaseSieveFields;
|
|
7
7
|
constructor();
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Plaintext PII. **Opt-in and named** — for the account's own settings page,
|
|
10
|
+
* the payout run, and any mail that has to reach the person.
|
|
11
|
+
*/
|
|
12
|
+
revealUser(doc: UserDocument): UserPlain;
|
|
13
|
+
/** As `revealUser`, for a list read. */
|
|
14
|
+
revealUsers(docs: readonly UserDocument[]): UserPlain[];
|
|
15
|
+
/**
|
|
16
|
+
* Masked PII — **the default for every admin list and every public
|
|
17
|
+
* surface.** Decrypts first, then masks, because the mask helpers refuse
|
|
18
|
+
* ciphertext by design.
|
|
19
|
+
*
|
|
20
|
+
* `payoutDetails` and `shippingConfig` are decrypted and then masked
|
|
21
|
+
* member-by-member: a UPI handle or account number reaching an admin table
|
|
22
|
+
* unmasked is the most damaging value this document carries.
|
|
23
|
+
*/
|
|
24
|
+
maskedUser(doc: UserDocument): UserPlain;
|
|
25
|
+
/** As `maskedUser`, for a list read. */
|
|
26
|
+
maskedUsers(docs: readonly UserDocument[]): UserPlain[];
|
|
27
|
+
/**
|
|
28
|
+
* Mask every string member of an already-decrypted nested object.
|
|
29
|
+
*
|
|
30
|
+
* The field list is derived from the object rather than hard-coded, because
|
|
31
|
+
* `USER_PII_FIELDS` does not name these members and a second list here would
|
|
32
|
+
* have to be kept in step with `decryptPayoutDetails`'s own (Root Cause #42).
|
|
33
|
+
* Every string in a payout or shipping block is sensitive, so "all of them"
|
|
34
|
+
* is the correct list, not an approximation.
|
|
35
|
+
*/
|
|
36
|
+
private maskNested;
|
|
9
37
|
/**
|
|
10
38
|
* Declared, not hand-rolled.
|
|
11
39
|
*
|
|
@@ -19,6 +47,18 @@ export declare class UserRepository extends BaseRepository<UserDocument> {
|
|
|
19
47
|
*/
|
|
20
48
|
protected piiFields: readonly ["email", "phoneNumber", "googleLinkedEmail"];
|
|
21
49
|
protected piiIndexMap: Record<string, string>;
|
|
50
|
+
/**
|
|
51
|
+
* Admin search by first/last name or email local-part, without decryption.
|
|
52
|
+
* `displayName` and `email` only — `phoneNumber` is excluded on purpose: a
|
|
53
|
+
* phone number has no word boundaries, so tokenising it yields one token
|
|
54
|
+
* that is the whole number, an exact lookup `phoneIndex` already covers.
|
|
55
|
+
*
|
|
56
|
+
* Running through `applyWriteHooks` is what makes a `users` row that
|
|
57
|
+
* SURVIVES a tester cascade (it is PRESERVE-tier and never wiped) keep a
|
|
58
|
+
* correct index going forward, and what makes a NEWLY signed-up real user
|
|
59
|
+
* searchable without anyone having to remember to re-run the backfill.
|
|
60
|
+
*/
|
|
61
|
+
protected buildTokensIndexFor(data: Record<string, JsonValue>): Record<string, string[]> | null;
|
|
22
62
|
/**
|
|
23
63
|
* The base hook, plus the nested objects it cannot see.
|
|
24
64
|
*
|
|
@@ -28,9 +68,8 @@ export declare class UserRepository extends BaseRepository<UserDocument> {
|
|
|
28
68
|
* that have to agree — which is what the hand-rolled override was.
|
|
29
69
|
*/
|
|
30
70
|
protected applyWriteHooks<D extends object>(data: D): D;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
create(input: Omit<UserDocument, "id" | "createdAt" | "updatedAt">): Promise<UserDocument>;
|
|
71
|
+
createWithId(id: string, data: Partial<UserPlain>): Promise<UserDocument>;
|
|
72
|
+
create(input: Omit<UserPlain, "id" | "createdAt" | "updatedAt">): Promise<UserDocument>;
|
|
34
73
|
findByUid(uid: string): Promise<UserDocument | null>;
|
|
35
74
|
/**
|
|
36
75
|
* Resolve a public profile slug.
|
|
@@ -51,7 +90,7 @@ export declare class UserRepository extends BaseRepository<UserDocument> {
|
|
|
51
90
|
* Permanent bans (`hardBanExpiresAt` null/absent) never match this query.
|
|
52
91
|
*/
|
|
53
92
|
getExpiredHardBans(): Promise<UserDocument[]>;
|
|
54
|
-
update(uid: string, data: Partial<
|
|
93
|
+
update(uid: string, data: Partial<UserPlain>): Promise<UserDocument>;
|
|
55
94
|
markEmailAsVerified(uid: string): Promise<UserDocument>;
|
|
56
95
|
disable(uid: string): Promise<UserDocument>;
|
|
57
96
|
enable(uid: string): Promise<UserDocument>;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { normalizeError } from "../../../errors/normalize.js";
|
|
2
|
+
import { buildTokensIndex } from "../../../security/blind-index-tokens.js";
|
|
2
3
|
import { DatabaseError } from "../../../errors/index.js";
|
|
3
4
|
import { BaseRepository, getFirestoreCount, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase/index.js";
|
|
4
|
-
import { USER_PII_FIELDS, USER_PII_INDEX_MAP, decryptPayoutDetails,
|
|
5
|
+
import { USER_PII_FIELDS, USER_PII_INDEX_MAP, decryptPayoutDetails, maskPii, revealPii, decryptShippingConfig, encryptPayoutDetails, encryptShippingConfig, piiBlindIndex, } from "../../../security/index.js";
|
|
5
6
|
import { USER_COLLECTION, USER_FIELDS, } from "../schemas/index.js";
|
|
6
7
|
export class UserRepository extends BaseRepository {
|
|
7
8
|
constructor() {
|
|
@@ -20,15 +21,92 @@ export class UserRepository extends BaseRepository {
|
|
|
20
21
|
this.piiFields = USER_PII_FIELDS;
|
|
21
22
|
this.piiIndexMap = USER_PII_INDEX_MAP;
|
|
22
23
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
/*
|
|
25
|
+
* 🛑 `mapDoc` no longer decrypts. This is the widest-reaching of the
|
|
26
|
+
* fourteen — 73 files touch this repository — and it is why ciphertext never
|
|
27
|
+
* leaving the database matters most here: `email` and `phoneNumber` belong
|
|
28
|
+
* to every account on the platform.
|
|
29
|
+
*
|
|
30
|
+
* `payoutDetails` and `shippingConfig` are handled inside the accessors
|
|
31
|
+
* rather than by `revealPii`, because each is encrypted by its OWN scheme
|
|
32
|
+
* and not by a `USER_PII_FIELDS` path. An accessor that silently skipped
|
|
33
|
+
* them would hand a caller a UPI id it could not read — worse than refusing,
|
|
34
|
+
* because the value looks present.
|
|
35
|
+
*/
|
|
36
|
+
/**
|
|
37
|
+
* Plaintext PII. **Opt-in and named** — for the account's own settings page,
|
|
38
|
+
* the payout run, and any mail that has to reach the person.
|
|
39
|
+
*/
|
|
40
|
+
revealUser(doc) {
|
|
41
|
+
const revealed = revealPii(doc, USER_PII_FIELDS);
|
|
42
|
+
if (revealed.payoutDetails) {
|
|
43
|
+
revealed.payoutDetails = decryptPayoutDetails(revealed.payoutDetails);
|
|
27
44
|
}
|
|
28
|
-
if (
|
|
29
|
-
|
|
45
|
+
if (revealed.shippingConfig) {
|
|
46
|
+
revealed.shippingConfig = decryptShippingConfig(revealed.shippingConfig);
|
|
30
47
|
}
|
|
31
|
-
return
|
|
48
|
+
return revealed;
|
|
49
|
+
}
|
|
50
|
+
/** As `revealUser`, for a list read. */
|
|
51
|
+
revealUsers(docs) {
|
|
52
|
+
return docs.map((d) => this.revealUser(d));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Masked PII — **the default for every admin list and every public
|
|
56
|
+
* surface.** Decrypts first, then masks, because the mask helpers refuse
|
|
57
|
+
* ciphertext by design.
|
|
58
|
+
*
|
|
59
|
+
* `payoutDetails` and `shippingConfig` are decrypted and then masked
|
|
60
|
+
* member-by-member: a UPI handle or account number reaching an admin table
|
|
61
|
+
* unmasked is the most damaging value this document carries.
|
|
62
|
+
*/
|
|
63
|
+
maskedUser(doc) {
|
|
64
|
+
const masked = maskPii(doc, USER_PII_FIELDS);
|
|
65
|
+
if (masked.payoutDetails) {
|
|
66
|
+
masked.payoutDetails = this.maskNested(decryptPayoutDetails(masked.payoutDetails));
|
|
67
|
+
}
|
|
68
|
+
if (masked.shippingConfig) {
|
|
69
|
+
masked.shippingConfig = this.maskNested(decryptShippingConfig(masked.shippingConfig));
|
|
70
|
+
}
|
|
71
|
+
return masked;
|
|
72
|
+
}
|
|
73
|
+
/** As `maskedUser`, for a list read. */
|
|
74
|
+
maskedUsers(docs) {
|
|
75
|
+
return docs.map((d) => this.maskedUser(d));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Mask every string member of an already-decrypted nested object.
|
|
79
|
+
*
|
|
80
|
+
* The field list is derived from the object rather than hard-coded, because
|
|
81
|
+
* `USER_PII_FIELDS` does not name these members and a second list here would
|
|
82
|
+
* have to be kept in step with `decryptPayoutDetails`'s own (Root Cause #42).
|
|
83
|
+
* Every string in a payout or shipping block is sensitive, so "all of them"
|
|
84
|
+
* is the correct list, not an approximation.
|
|
85
|
+
*/
|
|
86
|
+
maskNested(value) {
|
|
87
|
+
if (!value)
|
|
88
|
+
return undefined;
|
|
89
|
+
return maskPii(value, Object.entries(value)
|
|
90
|
+
.filter(([, v]) => typeof v === "string")
|
|
91
|
+
.map(([k]) => k));
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Admin search by first/last name or email local-part, without decryption.
|
|
95
|
+
* `displayName` and `email` only — `phoneNumber` is excluded on purpose: a
|
|
96
|
+
* phone number has no word boundaries, so tokenising it yields one token
|
|
97
|
+
* that is the whole number, an exact lookup `phoneIndex` already covers.
|
|
98
|
+
*
|
|
99
|
+
* Running through `applyWriteHooks` is what makes a `users` row that
|
|
100
|
+
* SURVIVES a tester cascade (it is PRESERVE-tier and never wiped) keep a
|
|
101
|
+
* correct index going forward, and what makes a NEWLY signed-up real user
|
|
102
|
+
* searchable without anyone having to remember to re-run the backfill.
|
|
103
|
+
*/
|
|
104
|
+
buildTokensIndexFor(data) {
|
|
105
|
+
const displayName = typeof data.displayName === "string" ? data.displayName : undefined;
|
|
106
|
+
const email = typeof data.email === "string" ? data.email : undefined;
|
|
107
|
+
if (!displayName && !email)
|
|
108
|
+
return null;
|
|
109
|
+
return { nameTokensIndex: buildTokensIndex(displayName, email) };
|
|
32
110
|
}
|
|
33
111
|
/**
|
|
34
112
|
* The base hook, plus the nested objects it cannot see.
|
|
@@ -47,10 +125,11 @@ export class UserRepository extends BaseRepository {
|
|
|
47
125
|
access.shippingConfig = encryptShippingConfig(access.shippingConfig);
|
|
48
126
|
return out;
|
|
49
127
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
128
|
+
/*
|
|
129
|
+
* Takes PLAINTEXT, like the base it overrides — the three real signup paths
|
|
130
|
+
* hand over the email Firebase just gave them, and `applyWriteHooks` below
|
|
131
|
+
* is what encrypts it.
|
|
132
|
+
*/
|
|
54
133
|
async createWithId(id, data) {
|
|
55
134
|
// `uid` is a required UserDocument field read directly off the mapped
|
|
56
135
|
// object (SessionUser.uid, getServerPermissions(uid), etc.) — mapDoc()
|
|
@@ -76,6 +155,7 @@ export class UserRepository extends BaseRepository {
|
|
|
76
155
|
// request an O(1) lookup). The readable public identifier is `slug`, minted
|
|
77
156
|
// by `reserveUserSlug` from displayName only.
|
|
78
157
|
const id = this.db.collection(this.collection).doc().id;
|
|
158
|
+
// Plain in, ciphertext out — `applyWriteHooks` encrypts below.
|
|
79
159
|
const userData = {
|
|
80
160
|
...input,
|
|
81
161
|
createdAt: new Date(),
|
|
@@ -86,7 +166,15 @@ export class UserRepository extends BaseRepository {
|
|
|
86
166
|
.collection(this.collection)
|
|
87
167
|
.doc(id)
|
|
88
168
|
.set(prepareForFirestore(encrypted));
|
|
89
|
-
|
|
169
|
+
/*
|
|
170
|
+
* Returns what was PERSISTED, not the plaintext input.
|
|
171
|
+
*
|
|
172
|
+
* `encrypted` is the exact object just written, so this is both honest and
|
|
173
|
+
* assignable to the base's `Promise<UserDocument>` — the declaration
|
|
174
|
+
* previously said `UserDocument` while returning `userData`, the plaintext.
|
|
175
|
+
* No re-read, so no extra Firestore read (Rule #6).
|
|
176
|
+
*/
|
|
177
|
+
return { id, ...encrypted };
|
|
90
178
|
}
|
|
91
179
|
async findByUid(uid) {
|
|
92
180
|
return this.findOneBy(USER_FIELDS.UID, uid);
|
|
@@ -157,6 +245,11 @@ export class UserRepository extends BaseRepository {
|
|
|
157
245
|
throw new DatabaseError("Failed to fetch expired hard bans", error);
|
|
158
246
|
}
|
|
159
247
|
}
|
|
248
|
+
/*
|
|
249
|
+
* Takes PLAINTEXT, like the base it overrides — this method is the thing
|
|
250
|
+
* that encrypts (`applyWriteHooks`), so demanding ciphertext from callers
|
|
251
|
+
* inverted its own contract.
|
|
252
|
+
*/
|
|
160
253
|
async update(uid, data) {
|
|
161
254
|
const encrypted = this.applyWriteHooks(data);
|
|
162
255
|
return super.update(uid, encrypted);
|
|
@@ -181,11 +274,22 @@ export class UserRepository extends BaseRepository {
|
|
|
181
274
|
if (!currentUser) {
|
|
182
275
|
throw new DatabaseError(`User not found: ${uid}`);
|
|
183
276
|
}
|
|
277
|
+
/*
|
|
278
|
+
* Plain in, ciphertext out — `this.update` encrypts via the write hook.
|
|
279
|
+
*
|
|
280
|
+
* 🛑 The comparison below (`data.email !== currentUser.email`) now
|
|
281
|
+
* compares PLAINTEXT to CIPHERTEXT, so it is always true and
|
|
282
|
+
* `emailVerified` is cleared on every profile save that includes an
|
|
283
|
+
* email — even an unchanged one. `currentUser` comes from `findById`,
|
|
284
|
+
* which no longer decrypts. Fixed by comparing against the revealed
|
|
285
|
+
* value, which is the one place in this method that needs plaintext.
|
|
286
|
+
*/
|
|
184
287
|
const updateData = { ...data };
|
|
185
|
-
|
|
288
|
+
const current = this.revealUser(currentUser);
|
|
289
|
+
if (data.email && data.email !== current.email) {
|
|
186
290
|
updateData.emailVerified = false;
|
|
187
291
|
}
|
|
188
|
-
if (data.phoneNumber && data.phoneNumber !==
|
|
292
|
+
if (data.phoneNumber && data.phoneNumber !== current.phoneNumber) {
|
|
189
293
|
updateData.phoneVerified = false;
|
|
190
294
|
}
|
|
191
295
|
return this.update(uid, updateData);
|
|
@@ -296,6 +400,15 @@ UserRepository.SIEVE_FIELDS = {
|
|
|
296
400
|
// filter matched every employee. The composite indexes it needs are already
|
|
297
401
|
// declared and deployed — (permissionGroup, role, createdAt|displayName).
|
|
298
402
|
permissionGroup: { canFilter: true, canSort: false },
|
|
403
|
+
/*
|
|
404
|
+
* Whole-word admin name search. `canSort: false` — an array field has no
|
|
405
|
+
* sort order Firestore can express. Without this entry, `@=` (Firestore
|
|
406
|
+
* `array-contains`) on `nameTokensIndex` is dropped SILENTLY by Sieve
|
|
407
|
+
* (`throwExceptions: false`), and the clause after it goes with it —
|
|
408
|
+
* which here would be nothing, but is the exact mechanism Root Cause #62
|
|
409
|
+
* documents for every other field this has happened to.
|
|
410
|
+
*/
|
|
411
|
+
nameTokensIndex: { canFilter: true, canSort: false },
|
|
299
412
|
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
300
413
|
updatedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
301
414
|
};
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import type { UserRole } from "../types";
|
|
8
8
|
import type { BannedAction, EmployeeGroup, Permission } from "../permissions/constants";
|
|
9
9
|
import type { BaseDocument } from "../../../_internal/shared/types/base-document";
|
|
10
|
+
import type { Encrypted, Plaintext } from "../../../security/encrypted";
|
|
10
11
|
/**
|
|
11
12
|
* Generic schema defaults for user-related data.
|
|
12
13
|
* Consumer-specific values (admin email, currency) belong in SiteConfig, not here.
|
|
@@ -31,6 +32,16 @@ export interface AvatarMetadata {
|
|
|
31
32
|
};
|
|
32
33
|
zoom: number;
|
|
33
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* `UserDocument` with its PII as plain `string` — what the named repository
|
|
37
|
+
* accessors return, and what a WRITE path accepts (the repository encrypts).
|
|
38
|
+
*
|
|
39
|
+
* `Plaintext<T>` is the one definition of this shape; see `security/encrypted.ts`.
|
|
40
|
+
* It is deliberately NOT distinguishable from a MASKED value — `maskPii`
|
|
41
|
+
* returns plain strings too, and no type can express "these characters are
|
|
42
|
+
* asterisks". The distinction is which named method you called.
|
|
43
|
+
*/
|
|
44
|
+
export type UserPlain = Plaintext<UserDocument>;
|
|
34
45
|
export interface UserDocument extends BaseDocument {
|
|
35
46
|
uid: string;
|
|
36
47
|
/**
|
|
@@ -52,8 +63,14 @@ export interface UserDocument extends BaseDocument {
|
|
|
52
63
|
* profile resolution falls back to id and then uid.
|
|
53
64
|
*/
|
|
54
65
|
slug?: string;
|
|
55
|
-
|
|
56
|
-
|
|
66
|
+
/**
|
|
67
|
+
* PII — CIPHERTEXT at rest, kept true by `UserRepository` no longer
|
|
68
|
+
* decrypting in `mapDoc`. Readers call `userRepository.maskedUser(doc)` (the
|
|
69
|
+
* default) or `revealUser(doc)` (opt-in, named, greppable).
|
|
70
|
+
*/
|
|
71
|
+
email: Encrypted<string> | null;
|
|
72
|
+
/** PII — ciphertext at rest; see `email`. */
|
|
73
|
+
phoneNumber: Encrypted<string> | null;
|
|
57
74
|
phoneVerified?: boolean;
|
|
58
75
|
displayName: string | null;
|
|
59
76
|
photoURL: string | null;
|
|
@@ -133,7 +150,8 @@ export interface UserDocument extends BaseDocument {
|
|
|
133
150
|
* exchange rather than the client SDK's linkWithCredential(). */
|
|
134
151
|
googleLinked?: boolean;
|
|
135
152
|
/** The Google account email this profile is linked to, once linked. */
|
|
136
|
-
|
|
153
|
+
/** PII — ciphertext at rest; see `email`. */
|
|
154
|
+
googleLinkedEmail?: Encrypted<string> | null;
|
|
137
155
|
uiPreferences?: {
|
|
138
156
|
/** IDs of collapsible dashboard sections currently collapsed, flat across
|
|
139
157
|
* every page (IDs are page-prefixed, e.g. "admin-dashboard:alerts", to
|
|
@@ -216,13 +234,13 @@ export interface SellerPayoutDetails {
|
|
|
216
234
|
isConfigured: boolean;
|
|
217
235
|
}
|
|
218
236
|
export declare const USER_COLLECTION: "users";
|
|
219
|
-
export declare const DEFAULT_USER_DATA: Partial<
|
|
237
|
+
export declare const DEFAULT_USER_DATA: Partial<UserPlain>;
|
|
220
238
|
export declare const USER_INDEXED_FIELDS: readonly ["email", "emailIndex", "phoneNumber", "phoneIndex", "role", "disabled", "emailVerified", "phoneVerified", "storeSlug", "storeStatus", "isTester", "slug"];
|
|
221
239
|
export declare const USER_PUBLIC_FIELDS: readonly ["uid", "displayName", "photoURL", "avatarMetadata", "role", "createdAt", "storeSlug", "publicProfile", "stats"];
|
|
222
240
|
export declare const USER_UPDATABLE_FIELDS: readonly ["displayName", "photoURL"];
|
|
223
241
|
export type UserCreateInput = Omit<UserDocument, "uid" | "id" | "createdAt" | "updatedAt">;
|
|
224
242
|
export type UserUpdateInput = Partial<Pick<UserDocument, "displayName" | "photoURL">>;
|
|
225
|
-
export type UserAdminUpdateInput = Partial<Omit<
|
|
243
|
+
export type UserAdminUpdateInput = Partial<Omit<UserPlain, "uid" | "id" | "createdAt">>;
|
|
226
244
|
export interface UserQueryFilter {
|
|
227
245
|
email?: string;
|
|
228
246
|
phoneNumber?: string;
|
|
@@ -253,6 +271,8 @@ export declare const USER_FIELDS: {
|
|
|
253
271
|
readonly DISPLAY_NAME: "displayName";
|
|
254
272
|
readonly EMAIL_INDEX: "emailIndex";
|
|
255
273
|
readonly PHONE_INDEX: "phoneIndex";
|
|
274
|
+
/** Whole-word HMAC digests of `displayName` + `email`. See `blind-index-tokens.ts`. */
|
|
275
|
+
readonly NAME_TOKENS_INDEX: "nameTokensIndex";
|
|
256
276
|
readonly PHOTO_URL: "photoURL";
|
|
257
277
|
readonly AVATAR_METADATA: "avatarMetadata";
|
|
258
278
|
readonly ROLE: "role";
|
|
@@ -308,18 +328,38 @@ export declare const USER_FIELDS: {
|
|
|
308
328
|
readonly LOGIN_COUNT: "metadata.loginCount";
|
|
309
329
|
};
|
|
310
330
|
};
|
|
331
|
+
/**
|
|
332
|
+
* `EmailVerificationTokenDocument` with its PII as plain `string` — what the named repository
|
|
333
|
+
* accessors return, and what a WRITE path accepts (the repository encrypts).
|
|
334
|
+
*
|
|
335
|
+
* `Plaintext<T>` is the one definition of this shape; see `security/encrypted.ts`.
|
|
336
|
+
* It is deliberately NOT distinguishable from a MASKED value — `maskPii`
|
|
337
|
+
* returns plain strings too, and no type can express "these characters are
|
|
338
|
+
* asterisks". The distinction is which named method you called.
|
|
339
|
+
*/
|
|
340
|
+
export type EmailVerificationTokenPlain = Plaintext<EmailVerificationTokenDocument>;
|
|
311
341
|
export type EmailVerificationTokenDocument = {
|
|
312
342
|
id?: string;
|
|
313
343
|
userId: string;
|
|
314
|
-
email: string
|
|
344
|
+
email: Encrypted<string>;
|
|
315
345
|
token: string;
|
|
316
346
|
expiresAt: Date;
|
|
317
347
|
createdAt: Date;
|
|
318
348
|
};
|
|
349
|
+
/**
|
|
350
|
+
* `PasswordResetTokenDocument` with its PII as plain `string` — what the named repository
|
|
351
|
+
* accessors return, and what a WRITE path accepts (the repository encrypts).
|
|
352
|
+
*
|
|
353
|
+
* `Plaintext<T>` is the one definition of this shape; see `security/encrypted.ts`.
|
|
354
|
+
* It is deliberately NOT distinguishable from a MASKED value — `maskPii`
|
|
355
|
+
* returns plain strings too, and no type can express "these characters are
|
|
356
|
+
* asterisks". The distinction is which named method you called.
|
|
357
|
+
*/
|
|
358
|
+
export type PasswordResetTokenPlain = Plaintext<PasswordResetTokenDocument>;
|
|
319
359
|
export type PasswordResetTokenDocument = {
|
|
320
360
|
id?: string;
|
|
321
361
|
userId: string;
|
|
322
|
-
email: string
|
|
362
|
+
email: Encrypted<string>;
|
|
323
363
|
token: string;
|
|
324
364
|
expiresAt: Date;
|
|
325
365
|
createdAt: Date;
|
|
@@ -353,19 +393,32 @@ export declare const TOKEN_FIELDS: {
|
|
|
353
393
|
readonly USED: "used";
|
|
354
394
|
readonly USED_AT: "usedAt";
|
|
355
395
|
};
|
|
396
|
+
/**
|
|
397
|
+
* The session shape with its PII as plain `string`.
|
|
398
|
+
*
|
|
399
|
+
* Was a hand-written twin, because `Plaintext<T>` un-branded top-level members
|
|
400
|
+
* only and all three of this document's PII fields are NESTED. Making the
|
|
401
|
+
* generic recurse removed the twin — which is the better outcome: a
|
|
402
|
+
* hand-written copy of a derived shape is the drift this whole file's
|
|
403
|
+
* `*Plain` convention exists to avoid.
|
|
404
|
+
*/
|
|
405
|
+
export type SessionPlain = Plaintext<SessionDocument>;
|
|
356
406
|
export type SessionDocument = {
|
|
357
407
|
id: string;
|
|
358
408
|
userId: string;
|
|
359
409
|
deviceInfo?: {
|
|
360
|
-
|
|
410
|
+
/** PII — ciphertext at rest. See `SessionRepository.revealSession`. */
|
|
411
|
+
userAgent?: Encrypted<string>;
|
|
361
412
|
browser?: string;
|
|
362
413
|
os?: string;
|
|
363
414
|
device?: string;
|
|
364
|
-
|
|
415
|
+
/** PII — ciphertext at rest. */
|
|
416
|
+
ip?: Encrypted<string>;
|
|
365
417
|
};
|
|
366
418
|
location?: {
|
|
367
419
|
country?: string;
|
|
368
|
-
|
|
420
|
+
/** PII — ciphertext at rest. */
|
|
421
|
+
city?: Encrypted<string>;
|
|
369
422
|
};
|
|
370
423
|
createdAt: Date;
|
|
371
424
|
lastActivity: Date;
|
|
@@ -382,7 +435,7 @@ export declare const SESSION_PUBLIC_FIELDS: readonly ["id", "deviceInfo", "locat
|
|
|
382
435
|
export declare const SESSION_EXPIRATION_MS: number;
|
|
383
436
|
/** 30 days — auto-cleanup threshold */
|
|
384
437
|
export declare const SESSION_CLEANUP_AFTER_MS: number;
|
|
385
|
-
export type SessionCreateInput = Omit<
|
|
438
|
+
export type SessionCreateInput = Omit<SessionPlain, "id" | "createdAt" | "lastActivity">;
|
|
386
439
|
export type SessionUpdateInput = {
|
|
387
440
|
lastActivity: Date;
|
|
388
441
|
location?: SessionDocument["location"];
|
|
@@ -400,7 +453,7 @@ export declare const sessionQueryHelpers: {
|
|
|
400
453
|
readonly notExpired: () => readonly ["expiresAt", ">=", Date];
|
|
401
454
|
readonly recentActivity: (since: Date) => readonly ["lastActivity", ">=", Date];
|
|
402
455
|
};
|
|
403
|
-
export declare function parseUserAgent(userAgent: string):
|
|
456
|
+
export declare function parseUserAgent(userAgent: string): SessionPlain["deviceInfo"];
|
|
404
457
|
export declare const SESSION_FIELDS: {
|
|
405
458
|
readonly ID: "id";
|
|
406
459
|
readonly USER_ID: "userId";
|
|
@@ -24,6 +24,12 @@ export const UserSchemaDefaults = {
|
|
|
24
24
|
UNKNOWN_USER_AGENT: "Unknown",
|
|
25
25
|
};
|
|
26
26
|
export const USER_COLLECTION = "users";
|
|
27
|
+
/*
|
|
28
|
+
* The PLAIN shape: this is spread into a brand-new account's payload at
|
|
29
|
+
* signup, where every value is plaintext and `createWithId` encrypts. Typed
|
|
30
|
+
* as the document it would have demanded `Encrypted<string>` from all three
|
|
31
|
+
* signup routes.
|
|
32
|
+
*/
|
|
27
33
|
export const DEFAULT_USER_DATA = {
|
|
28
34
|
role: "user",
|
|
29
35
|
emailVerified: false,
|
|
@@ -96,6 +102,8 @@ export const USER_FIELDS = {
|
|
|
96
102
|
DISPLAY_NAME: "displayName",
|
|
97
103
|
EMAIL_INDEX: "emailIndex",
|
|
98
104
|
PHONE_INDEX: "phoneIndex",
|
|
105
|
+
/** Whole-word HMAC digests of `displayName` + `email`. See `blind-index-tokens.ts`. */
|
|
106
|
+
NAME_TOKENS_INDEX: "nameTokensIndex",
|
|
99
107
|
PHOTO_URL: "photoURL",
|
|
100
108
|
AVATAR_METADATA: "avatarMetadata",
|
|
101
109
|
ROLE: "role",
|
|
@@ -215,6 +223,11 @@ export const sessionQueryHelpers = {
|
|
|
215
223
|
notExpired: () => ["expiresAt", ">=", new Date()],
|
|
216
224
|
recentActivity: (since) => ["lastActivity", ">=", since],
|
|
217
225
|
};
|
|
226
|
+
/*
|
|
227
|
+
* Returns the PLAIN device shape: it parses a raw UA header, so everything it
|
|
228
|
+
* produces is plaintext and the repository's write hook encrypts it. Declaring
|
|
229
|
+
* `SessionDocument["deviceInfo"]` claimed the parser emitted ciphertext.
|
|
230
|
+
*/
|
|
218
231
|
export function parseUserAgent(userAgent) {
|
|
219
232
|
const ua = userAgent.toLowerCase();
|
|
220
233
|
const BROWSER_TOKENS = [
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import React from "react";
|
|
3
3
|
import Link from "next/link.js";
|
|
4
|
-
import { Article,
|
|
4
|
+
import { Article, Div, Grid, Heading, OverflowRow, Pagination, Row, Span, Stack, Text } from "../../../ui/index.js";
|
|
5
5
|
import { MediaImage } from "../../media/MediaImage.js";
|
|
6
6
|
import { getDefaultLocale } from "../../../core/baseline-resolver.js";
|
|
7
7
|
import { getMediaUrl } from "../../media/types/index.js";
|
|
@@ -11,7 +11,6 @@ const __P = {
|
|
|
11
11
|
};
|
|
12
12
|
const __O = {
|
|
13
13
|
hidden: "overflow-hidden",
|
|
14
|
-
xAuto: "overflow-x-auto",
|
|
15
14
|
};
|
|
16
15
|
const CLS_FEATURED_BADGE = "rounded-full bg-warning-surface px-[var(--appkit-space-2)] py-[var(--appkit-space-0-5)] text-warning dark:bg-warning-surface dark:text-warning";
|
|
17
16
|
export function BlogCard({ post, href, onClick, className = "" }) {
|
|
@@ -33,7 +32,21 @@ export function BlogCard({ post, href, onClick, className = "" }) {
|
|
|
33
32
|
return card;
|
|
34
33
|
}
|
|
35
34
|
export function BlogCategoryTabs({ categories, active, onSelect, labels = {}, }) {
|
|
36
|
-
|
|
35
|
+
/*
|
|
36
|
+
* `ALL_ID` is a sentinel, not a category. It cannot be `""` because that is
|
|
37
|
+
* also `OverflowRow`'s "nothing selected" state, which would leave the
|
|
38
|
+
* collapsed trigger showing the placeholder instead of "All".
|
|
39
|
+
*/
|
|
40
|
+
const ALL_ID = "__all__";
|
|
41
|
+
const items = [
|
|
42
|
+
{ id: ALL_ID, label: labels.all ?? "All", onSelect: () => onSelect(null) },
|
|
43
|
+
...categories.map((cat) => ({
|
|
44
|
+
id: cat,
|
|
45
|
+
label: labels[cat] ?? cat,
|
|
46
|
+
onSelect: () => onSelect(cat),
|
|
47
|
+
})),
|
|
48
|
+
];
|
|
49
|
+
return (_jsx(OverflowRow, { items: items, ariaLabel: "Blog categories", activeId: active ?? ALL_ID, searchPlaceholder: "Search categories\u2026", noResultsText: "No matching category" }));
|
|
37
50
|
}
|
|
38
51
|
export function BlogListView({ posts, isLoading, totalPages = 1, currentPage = 1, total = 0, onPageChange, onPostClick, emptyLabel = "No posts found", slots, }) {
|
|
39
52
|
if (isLoading) {
|
|
@@ -55,5 +55,5 @@ export function BlogPostView({ slug, initialData, labels = {}, renderImage, rend
|
|
|
55
55
|
})
|
|
56
56
|
: "";
|
|
57
57
|
const coverImageUrl = getMediaUrl(post.coverImage);
|
|
58
|
-
return (_jsxs(Div, { className: `min-h-screen ${className}`, children: [coverImageUrl && (_jsxs(Div, { className: `relative h-72 md:h-96 ${__O.hidden}`, children: [renderImage ? (renderImage(post)) : (_jsx(MediaImage, { src: coverImageUrl, alt: post.title, size: "hero" })), _jsx(Scrim, { direction: "bottom-up", intensity: "subtle", className: "absolute inset-0" })] })), _jsxs(Div, { className: "max-w-3xl mx-auto", paddingY: "y-3xl", paddingX: "x-md", children: [renderBlogPostHeader(post, date, labels), post.youtubeId && /^[A-Za-z0-9_-]{6,20}$/.test(post.youtubeId) && (_jsx(Div, { className: "mb-8", children: _jsx(Iframe, { src: `https://www.youtube-nocookie.com/embed/${post.youtubeId}`, title: `${post.title} — video`, aspect: "video", rounded: "lg" }) })), post.tags && post.tags.length > 0 && (_jsx(Row, { wrap: true, gap: "sm", className: "mb-8", children: post.tags.map((tag) => (_jsxs(Link, { href: `${String(ROUTES.
|
|
58
|
+
return (_jsxs(Div, { className: `min-h-screen ${className}`, children: [coverImageUrl && (_jsxs(Div, { className: `relative h-72 md:h-96 ${__O.hidden}`, children: [renderImage ? (renderImage(post)) : (_jsx(MediaImage, { src: coverImageUrl, alt: post.title, size: "hero" })), _jsx(Scrim, { direction: "bottom-up", intensity: "subtle", className: "absolute inset-0" })] })), _jsxs(Div, { className: "max-w-3xl mx-auto", paddingY: "y-3xl", paddingX: "x-md", children: [renderBlogPostHeader(post, date, labels), post.youtubeId && /^[A-Za-z0-9_-]{6,20}$/.test(post.youtubeId) && (_jsx(Div, { className: "mb-8", children: _jsx(Iframe, { src: `https://www.youtube-nocookie.com/embed/${post.youtubeId}`, title: `${post.title} — video`, aspect: "video", rounded: "lg" }) })), post.tags && post.tags.length > 0 && (_jsx(Row, { wrap: true, gap: "sm", className: "mb-8", children: post.tags.map((tag) => (_jsxs(Link, { href: `${String(ROUTES.BLOG.LIST)}?tags=${encodeURIComponent(tag)}`, className: "inline-block px-[var(--appkit-space-3)] py-[var(--appkit-space-1)] rounded-full bg-[var(--appkit-color-surface)] bg-[var(--appkit-color-surface-elevated)] hover:bg-primary/10 text-[var(--appkit-color-text-muted)] hover:text-primary text-[length:var(--appkit-text-xs)] font-medium transition-colors", children: ["#", tag] }, tag))) })), renderAuthorBio && _jsx(Div, { className: "mb-6", children: renderAuthorBio(post) }), _jsx(Div, { surface: "card", padding: "xl", className: "mb-12", children: renderContent ? renderContent(post) : (_jsx(RichText, { html: normalizeRichTextHtml(post.content ?? ""), proseClass: "prose max-w-none dark:prose-invert" })) }), _jsxs(Stack, { gap: "xl", children: [renderBlogPostRelated(related, labels?.relatedTitle ?? "Related Posts", renderRelatedCard), renderBlogPostRelated(relatedByTags, labels?.relatedByTagsTitle ?? "You might also like", renderRelatedCard), renderBlogPostRelated(relatedByAuthor, labels?.relatedByAuthorTitle ?? `More from ${post.authorName}`, renderRelatedCard)] }), renderBackButton && _jsx(Div, { border: "default", className: "mt-10 border-t", padding: "t-xl", children: renderBackButton() })] })] }));
|
|
59
59
|
}
|
|
@@ -467,18 +467,18 @@ export declare const blogListParamsSchema: z.ZodObject<{
|
|
|
467
467
|
sort?: string | undefined;
|
|
468
468
|
page?: number | undefined;
|
|
469
469
|
q?: string | undefined;
|
|
470
|
-
perPage?: number | undefined;
|
|
471
470
|
pageSize?: number | undefined;
|
|
472
471
|
category?: "news" | "tips" | "guides" | "updates" | "community" | undefined;
|
|
473
472
|
featured?: boolean | undefined;
|
|
474
473
|
tags?: string | undefined;
|
|
474
|
+
perPage?: number | undefined;
|
|
475
475
|
}, {
|
|
476
476
|
sort?: string | undefined;
|
|
477
477
|
page?: number | undefined;
|
|
478
478
|
q?: string | undefined;
|
|
479
|
-
perPage?: number | undefined;
|
|
480
479
|
pageSize?: number | undefined;
|
|
481
480
|
category?: "news" | "tips" | "guides" | "updates" | "community" | undefined;
|
|
482
481
|
featured?: boolean | undefined;
|
|
483
482
|
tags?: string | undefined;
|
|
483
|
+
perPage?: number | undefined;
|
|
484
484
|
}>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BusinessDocumentsRepository — thin wrapper over the `businessDocuments`
|
|
3
|
+
* collection. See `../schemas/firestore.ts` for the doc shape and for why the
|
|
4
|
+
* bytes are not in Firestore.
|
|
5
|
+
*/
|
|
6
|
+
import { BaseRepository, parseSieveDateValue, type SieveModel, type FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
7
|
+
import { type BusinessDocumentDocument, type BusinessDocumentKind } from "../schemas/firestore";
|
|
8
|
+
export declare class BusinessDocumentsRepository extends BaseRepository<BusinessDocumentDocument> {
|
|
9
|
+
constructor();
|
|
10
|
+
static readonly SIEVE_FIELDS: {
|
|
11
|
+
id: {
|
|
12
|
+
canFilter: boolean;
|
|
13
|
+
canSort: boolean;
|
|
14
|
+
};
|
|
15
|
+
kind: {
|
|
16
|
+
canFilter: boolean;
|
|
17
|
+
canSort: boolean;
|
|
18
|
+
};
|
|
19
|
+
fileName: {
|
|
20
|
+
canFilter: boolean;
|
|
21
|
+
canSort: boolean;
|
|
22
|
+
};
|
|
23
|
+
uploadedBy: {
|
|
24
|
+
canFilter: boolean;
|
|
25
|
+
canSort: boolean;
|
|
26
|
+
};
|
|
27
|
+
uploadedAt: {
|
|
28
|
+
canFilter: boolean;
|
|
29
|
+
canSort: boolean;
|
|
30
|
+
parseValue: typeof parseSieveDateValue;
|
|
31
|
+
};
|
|
32
|
+
createdAt: {
|
|
33
|
+
canFilter: boolean;
|
|
34
|
+
canSort: boolean;
|
|
35
|
+
parseValue: typeof parseSieveDateValue;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
list(model: SieveModel): Promise<FirebaseSieveResult<BusinessDocumentDocument>>;
|
|
39
|
+
/**
|
|
40
|
+
* The current document of a given kind — newest `uploadedAt` wins.
|
|
41
|
+
*
|
|
42
|
+
* Re-uploading a re-issued certificate is normal and both copies are kept:
|
|
43
|
+
* the superseded one is the evidence of what was true at the time, which is
|
|
44
|
+
* the entire point of keeping a registration document. So this resolves the
|
|
45
|
+
* current one rather than assuming a single row per kind.
|
|
46
|
+
*
|
|
47
|
+
* 🛑 Ordered by `createdAt`, NOT `uploadedAt`, even though the latter reads
|
|
48
|
+
* more naturally here. `BaseRepository.create()` stamps `createdAt` on every
|
|
49
|
+
* document it writes, so it is guaranteed present; `uploadedAt` is set by the
|
|
50
|
+
* caller and a single write path that forgot it would make that row vanish
|
|
51
|
+
* from this query — a Firestore `orderBy` on a field a document lacks is a
|
|
52
|
+
* silent `WHERE field IS NOT NULL` (Root Cause #100). The two are written in
|
|
53
|
+
* the same operation and agree, so there is nothing to gain by taking the
|
|
54
|
+
* field that can be missed.
|
|
55
|
+
*/
|
|
56
|
+
findCurrentByKind(kind: BusinessDocumentKind): Promise<BusinessDocumentDocument | null>;
|
|
57
|
+
}
|
|
58
|
+
export declare const businessDocumentsRepository: BusinessDocumentsRepository;
|