@mohasinac/appkit 4.52.5 → 4.53.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp.json +4 -4
- package/dist/_internal/client/features/sticker-trace/canvas-codec.d.ts +2 -0
- package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
- package/dist/_internal/client/scaffolds/AppShell.js +1 -1
- package/dist/_internal/server/features/auctions/actions.js +1 -1
- package/dist/_internal/server/features/auctions/og.d.ts +3 -1
- package/dist/_internal/server/features/auctions/og.js +3 -1
- package/dist/_internal/server/features/bundles/actions.js +1 -1
- package/dist/_internal/server/features/business-documents/download.d.ts +41 -0
- package/dist/_internal/server/features/business-documents/download.js +91 -0
- package/dist/_internal/server/features/categories/adapters.d.ts +1 -1
- package/dist/_internal/server/features/categories/adapters.js +10 -0
- package/dist/_internal/server/features/categories/data.js +23 -7
- package/dist/_internal/server/features/checkout/actions.d.ts +14 -0
- package/dist/_internal/server/features/checkout/actions.js +116 -15
- package/dist/_internal/server/features/checkout/bundle-expansion.js +17 -0
- package/dist/_internal/server/features/checkout/data.d.ts +37 -0
- package/dist/_internal/server/features/checkout/data.js +20 -3
- package/dist/_internal/server/features/checkout/group-rule-revalidation.d.ts +34 -0
- package/dist/_internal/server/features/checkout/group-rule-revalidation.js +124 -0
- package/dist/_internal/server/features/checkout/supplier-identity.d.ts +55 -0
- package/dist/_internal/server/features/checkout/supplier-identity.js +81 -0
- package/dist/_internal/server/features/classified/metadata.js +1 -1
- package/dist/_internal/server/features/classified/og.d.ts +3 -1
- package/dist/_internal/server/features/classified/og.js +3 -1
- package/dist/_internal/server/features/digital-code/metadata.js +1 -1
- package/dist/_internal/server/features/digital-code/og.d.ts +3 -1
- package/dist/_internal/server/features/digital-code/og.js +3 -1
- package/dist/_internal/server/features/digital-code/pool.d.ts +19 -4
- package/dist/_internal/server/features/digital-code/pool.js +19 -4
- package/dist/_internal/server/features/live/metadata.js +1 -1
- package/dist/_internal/server/features/live/og.d.ts +3 -1
- package/dist/_internal/server/features/live/og.js +3 -1
- package/dist/_internal/server/features/lottery/actions.js +9 -1
- package/dist/_internal/server/features/lottery/og.d.ts +40 -0
- package/dist/_internal/server/features/lottery/og.js +79 -0
- package/dist/_internal/server/features/messages/actions.js +5 -1
- package/dist/_internal/server/features/offers/adapters.js +17 -3
- package/dist/_internal/server/features/orders/actions.js +7 -2
- package/dist/_internal/server/features/parts/og.js +1 -1
- package/dist/_internal/server/features/pre-orders/og.d.ts +3 -1
- package/dist/_internal/server/features/pre-orders/og.js +3 -1
- package/dist/_internal/server/features/price-index/search.d.ts +18 -0
- package/dist/_internal/server/features/price-index/search.js +47 -7
- package/dist/_internal/server/features/prize-draws/og.d.ts +3 -1
- package/dist/_internal/server/features/prize-draws/og.js +3 -1
- package/dist/_internal/server/features/products/group-members.d.ts +26 -0
- package/dist/_internal/server/features/products/group-members.js +7 -1
- package/dist/_internal/server/features/products/og.d.ts +3 -1
- package/dist/_internal/server/features/products/og.js +3 -1
- package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
- package/dist/_internal/server/features/raffle/actions.js +25 -0
- package/dist/_internal/server/features/reviews/actions.js +1 -1
- package/dist/_internal/server/features/reviews/data.d.ts +1 -1
- package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
- package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
- package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
- package/dist/_internal/server/features/search/index-build/build.js +285 -0
- package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
- package/dist/_internal/server/features/search/index-build/sources.js +385 -0
- package/dist/_internal/server/features/search/scoped-sources.d.ts +26 -0
- package/dist/_internal/server/features/search/scoped-sources.js +252 -0
- package/dist/_internal/server/features/search/search-everything.d.ts +57 -0
- package/dist/_internal/server/features/search/search-everything.js +70 -20
- package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
- package/dist/_internal/server/features/search/search-sources.js +142 -7
- package/dist/_internal/server/features/seo/robots.js +21 -1
- package/dist/_internal/server/features/seo/sitemap.js +7 -1
- package/dist/_internal/server/features/shared/listing-adapters.js +4 -2
- package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
- package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
- package/dist/_internal/server/features/site-settings/adapters.js +26 -0
- package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
- package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
- package/dist/_internal/server/features/sticker-trace/adapters.d.ts +91 -0
- package/dist/_internal/server/features/sticker-trace/adapters.js +175 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
- package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
- package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
- package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
- package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
- package/dist/_internal/server/features/sticker-trace/promote-to-listings.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/promote-to-listings.js +264 -0
- package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
- package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
- package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
- package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +143 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.js +311 -0
- package/dist/_internal/server/features/sticker-trace/storage.d.ts +154 -0
- package/dist/_internal/server/features/sticker-trace/storage.js +301 -0
- package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
- package/dist/_internal/server/features/stores/adapters.js +16 -0
- package/dist/_internal/server/features/stores/index.d.ts +1 -0
- package/dist/_internal/server/features/stores/index.js +1 -0
- package/dist/_internal/server/features/stores/tabs.d.ts +25 -0
- package/dist/_internal/server/features/stores/tabs.js +122 -0
- package/dist/_internal/server/functions/scheduled.d.ts +2 -1
- package/dist/_internal/server/functions/scheduled.js +25 -1
- package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
- package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
- package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
- package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
- package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
- package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
- package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
- package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
- package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
- package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
- package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
- package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
- package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
- package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
- package/dist/_internal/server/jobs/core/promotions.js +7 -4
- package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
- package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
- package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
- package/dist/_internal/server/jobs/handlers/index.js +1 -0
- package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
- package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
- package/dist/_internal/shared/actions/action-registry.js +29 -0
- package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
- package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
- package/dist/_internal/shared/checkout/rules/_defaults.js +0 -2
- package/dist/_internal/shared/checkout/rules/_limits.d.ts +14 -1
- package/dist/_internal/shared/checkout/rules/_limits.js +14 -1
- package/dist/_internal/shared/checkout/rules/_registry.js +2 -0
- package/dist/_internal/shared/checkout/rules/auction.rule.js +9 -1
- package/dist/_internal/shared/checkout/rules/bundle.rule.js +13 -0
- package/dist/_internal/shared/checkout/rules/index.d.ts +2 -0
- package/dist/_internal/shared/checkout/rules/index.js +9 -0
- package/dist/_internal/shared/checkout/rules/offer.rule.js +0 -1
- package/dist/_internal/shared/checkout/rules/payment-gate.d.ts +26 -0
- package/dist/_internal/shared/checkout/rules/payment-gate.js +133 -0
- package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +29 -8
- package/dist/_internal/shared/checkout/rules/spares.rule.d.ts +16 -0
- package/dist/_internal/shared/checkout/rules/spares.rule.js +5 -0
- package/dist/_internal/shared/checkout/rules/types.d.ts +26 -2
- package/dist/_internal/shared/config/schema.d.ts +122 -0
- package/dist/_internal/shared/features/cart/schema.js +3 -2
- package/dist/_internal/shared/features/events/config.d.ts +14 -0
- package/dist/_internal/shared/features/events/config.js +14 -0
- package/dist/_internal/shared/features/notifications/action-url.js +8 -0
- package/dist/_internal/shared/features/products/group-rules.d.ts +75 -0
- package/dist/_internal/shared/features/products/group-rules.js +142 -0
- package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
- package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
- package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
- package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
- package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
- package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
- package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
- package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +35 -0
- package/dist/_internal/shared/listing-types/_registry.js +39 -1
- package/dist/_internal/shared/listing-types/art/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/art/config.js +3 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/auction/config.js +3 -0
- package/dist/_internal/shared/listing-types/availability.js +48 -0
- package/dist/_internal/shared/listing-types/capabilities.js +19 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/classified/config.js +3 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +3 -0
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
- package/dist/_internal/shared/listing-types/feature-flags.js +10 -0
- package/dist/_internal/shared/listing-types/live/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/live/config.js +3 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +3 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +3 -0
- package/dist/_internal/shared/listing-types/spares/config.d.ts +74 -0
- package/dist/_internal/shared/listing-types/spares/config.js +60 -0
- package/dist/_internal/shared/listing-types/spares/ctas.d.ts +1 -0
- package/dist/_internal/shared/listing-types/spares/ctas.js +4 -0
- package/dist/_internal/shared/listing-types/spares/og.js +1 -0
- package/dist/_internal/shared/listing-types/spares/schema.d.ts +2 -0
- package/dist/_internal/shared/listing-types/spares/schema.js +3 -0
- package/dist/_internal/shared/listing-types/spares/seed-factory.d.ts +1 -0
- package/dist/_internal/shared/listing-types/spares/seed-factory.js +1 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/standard/config.js +3 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +3 -0
- package/dist/_internal/shared/media/limits.d.ts +12 -2
- package/dist/_internal/shared/media/limits.js +12 -2
- package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
- package/dist/_internal/shared/search/artifact-url.js +119 -0
- package/dist/_internal/shared/search/index-record.d.ts +68 -0
- package/dist/_internal/shared/search/index-record.js +96 -0
- package/dist/_internal/shared/search/match.d.ts +76 -0
- package/dist/_internal/shared/search/match.js +264 -0
- package/dist/_internal/shared/search/to-groups.d.ts +52 -0
- package/dist/_internal/shared/search/to-groups.js +141 -0
- package/dist/client.d.ts +16 -9
- package/dist/client.js +16 -6
- package/dist/configs/eslint.js +22 -2
- package/dist/constants/api-endpoints.d.ts +107 -15
- package/dist/constants/api-endpoints.js +60 -5
- package/dist/constants/cache-invalidation.js +3 -1
- package/dist/constants/field-names.d.ts +13 -1
- package/dist/constants/field-names.js +42 -1
- package/dist/contracts/repository.d.ts +8 -7
- package/dist/contracts/search.d.ts +2 -2
- package/dist/contracts/table.d.ts +3 -3
- package/dist/contracts/table.js +3 -3
- package/dist/core/contact-submissions.repository.js +2 -2
- package/dist/core/integration-keys.js +7 -1
- package/dist/core/newsletter.repository.js +2 -2
- package/dist/core/site-config.js +1 -1
- package/dist/errors/error-codes.d.ts +30 -0
- package/dist/errors/error-codes.js +30 -0
- package/dist/errors/error-display-map.js +40 -1
- package/dist/features/about/components/PolicyPageView.d.ts +22 -2
- package/dist/features/about/components/PolicyPageView.js +14 -2
- package/dist/features/about/components/PublicProfileView.js +2 -1
- package/dist/features/about/components/ShippingPolicyView.js +42 -2
- package/dist/features/account/api/[userId]/addresses/route.js +1 -1
- package/dist/features/account/components/NotificationBell.js +1 -1
- package/dist/features/account/components/UserBidsView.js +1 -1
- package/dist/features/account/components/index.d.ts +0 -8
- package/dist/features/account/components/index.js +0 -4
- package/dist/features/account/hooks/useProfileStats.js +5 -1
- package/dist/features/addresses/repository/addresses.repository.d.ts +33 -6
- package/dist/features/addresses/repository/addresses.repository.js +86 -9
- package/dist/features/addresses/schemas/firestore.d.ts +17 -6
- package/dist/features/admin/actions/admin-actions.js +16 -1
- package/dist/features/admin/actions/notification-actions.js +15 -6
- package/dist/features/admin/api/bids/route.js +1 -1
- package/dist/features/admin/api/coupons/route.js +1 -1
- package/dist/features/admin/api/products/route.js +1 -1
- package/dist/features/admin/api/reviews/route.js +1 -1
- package/dist/features/admin/components/AdminAdEditorView.js +19 -5
- package/dist/features/admin/components/AdminAuditLogView.js +1 -1
- package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
- package/dist/features/admin/components/AdminBlogView.js +1 -1
- package/dist/features/admin/components/AdminBrandsView.js +17 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +19 -3
- package/dist/features/admin/components/AdminContactView.js +1 -1
- package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
- package/dist/features/admin/components/AdminNavigationView.js +1 -1
- package/dist/features/admin/components/AdminNewsletterView.js +1 -1
- package/dist/features/admin/components/AdminOrdersView.js +9 -2
- package/dist/features/admin/components/AdminPageHeader.js +1 -1
- package/dist/features/admin/components/AdminPayoutsView.js +1 -1
- package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
- package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
- package/dist/features/admin/components/AdminProductEditorView.js +41 -39
- package/dist/features/admin/components/AdminProductsView.js +10 -3
- package/dist/features/admin/components/AdminScammersView.js +1 -1
- package/dist/features/admin/components/AdminSectionsView.js +21 -5
- package/dist/features/admin/components/AdminSessionsView.js +1 -1
- package/dist/features/admin/components/AdminSidebar.js +1 -1
- package/dist/features/admin/components/AdminSiteSettingsView.js +39 -8
- package/dist/features/admin/components/AdminSparesView.d.ts +12 -0
- package/dist/features/admin/components/AdminSparesView.js +30 -0
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
- package/dist/features/admin/components/AdminTeamView.js +1 -1
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
- package/dist/features/admin/components/AdminUsersView.js +10 -8
- package/dist/features/admin/components/DataListingView.d.ts +2 -1
- package/dist/features/admin/components/DataListingView.js +9 -4
- package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
- package/dist/features/admin/components/index.d.ts +2 -0
- package/dist/features/admin/components/index.js +1 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.js +7 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +3 -0
- package/dist/features/admin/constants/filter-tabs.js +1 -0
- package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
- package/dist/features/admin/repository/site-settings.repository.js +8 -3
- package/dist/features/admin/schemas/firestore.d.ts +88 -3
- package/dist/features/admin/schemas/firestore.js +32 -0
- package/dist/features/admin/types/index.d.ts +1 -1
- package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
- package/dist/features/auctions/actions/bid-actions.js +16 -4
- package/dist/features/auctions/api/route.js +1 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
- package/dist/features/auctions/components/AuctionDetailPageView.js +4 -11
- package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
- package/dist/features/auctions/repository/bid.repository.js +114 -13
- package/dist/features/auctions/schemas/firestore.d.ts +24 -4
- package/dist/features/auctions/schemas/firestore.js +1 -0
- package/dist/features/auth/actions/profile-actions.js +30 -4
- package/dist/features/auth/components/index.d.ts +0 -1
- package/dist/features/auth/components/index.js +0 -1
- package/dist/features/auth/repository/session.repository.d.ts +17 -3
- package/dist/features/auth/repository/session.repository.js +46 -5
- package/dist/features/auth/repository/token.repository.d.ts +27 -4
- package/dist/features/auth/repository/token.repository.js +65 -11
- package/dist/features/auth/repository/user.repository.d.ts +46 -7
- package/dist/features/auth/repository/user.repository.js +128 -15
- package/dist/features/auth/schemas/firestore.d.ts +65 -12
- package/dist/features/auth/schemas/firestore.js +13 -0
- package/dist/features/before-after/api/route.js +1 -1
- package/dist/features/blog/components/BlogListView.js +16 -3
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/blog/schemas/index.d.ts +2 -2
- package/dist/features/business-documents/repository/business-documents.repository.d.ts +58 -0
- package/dist/features/business-documents/repository/business-documents.repository.js +54 -0
- package/dist/features/business-documents/schemas/firestore.d.ts +105 -0
- package/dist/features/business-documents/schemas/firestore.js +75 -0
- package/dist/features/cart/actions/cart-actions.js +83 -6
- package/dist/features/cart/api/route.js +1 -1
- package/dist/features/cart/repository/cart.repository.js +32 -4
- package/dist/features/cart/schemas/firestore.d.ts +20 -0
- package/dist/features/cart/schemas/index.d.ts +2 -2
- package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +1 -1
- package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
- package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
- package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
- package/dist/features/categories/api/[id]/price-guidance/route.d.ts +42 -0
- package/dist/features/categories/api/[id]/price-guidance/route.js +113 -0
- package/dist/features/categories/api/route.js +10 -10
- package/dist/features/categories/components/BrandDetailPageView.js +19 -3
- package/dist/features/categories/components/BrandDetailTabs.js +10 -0
- package/dist/features/categories/components/CategoriesIndexListing.js +23 -8
- package/dist/features/categories/components/CategoryDetailPageView.js +170 -13
- package/dist/features/categories/components/CategoryDetailTabs.js +12 -0
- package/dist/features/categories/components/CategoryGrid.js +10 -1
- package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
- package/dist/features/categories/components/PriceGuidanceHint.d.ts +29 -0
- package/dist/features/categories/components/PriceGuidanceHint.js +61 -0
- package/dist/features/categories/components/SubcategoryCardRow.d.ts +27 -0
- package/dist/features/categories/components/SubcategoryCardRow.js +98 -0
- package/dist/features/categories/components/index.d.ts +0 -2
- package/dist/features/categories/components/index.js +0 -1
- package/dist/features/categories/constants/category-tabs.d.ts +20 -25
- package/dist/features/categories/constants/category-tabs.js +22 -39
- package/dist/features/categories/repository/categories.repository.d.ts +13 -0
- package/dist/features/categories/repository/categories.repository.js +51 -1
- package/dist/features/categories/schemas/firestore.d.ts +22 -1
- package/dist/features/categories/schemas/firestore.js +10 -0
- package/dist/features/categories/schemas/index.d.ts +8 -2
- package/dist/features/categories/schemas/index.js +2 -0
- package/dist/features/categories/types/index.d.ts +8 -0
- package/dist/features/categories/utils/taxonomy-visual.d.ts +34 -0
- package/dist/features/categories/utils/taxonomy-visual.js +74 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
- package/dist/features/classified/components/ClassifiedDetailPageView.js +4 -9
- package/dist/features/collections/api/[slug]/route.js +3 -3
- package/dist/features/collections/api/route.js +1 -1
- package/dist/features/consultation/api/route.js +1 -1
- package/dist/features/consultation/repository/consultations.repository.js +1 -1
- package/dist/features/consultation/types/index.d.ts +1 -1
- package/dist/features/contact/components/ContactForm.js +1 -3
- package/dist/features/contact/components/ContactPageView.d.ts +33 -1
- package/dist/features/contact/components/ContactPageView.js +58 -28
- package/dist/features/corporate/api/route.js +1 -1
- package/dist/features/corporate/repository/corporate.repository.js +1 -1
- package/dist/features/corporate/types/index.d.ts +1 -1
- package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
- package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
- package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -9
- package/dist/features/events/actions/event-actions.d.ts +14 -0
- package/dist/features/events/actions/event-actions.js +82 -3
- package/dist/features/events/api/[id]/route.js +2 -2
- package/dist/features/events/components/AdminEventEditorView.js +22 -3
- package/dist/features/events/components/AdminEventsView.js +32 -8
- package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
- package/dist/features/events/components/EventRafflesSection.js +52 -3
- package/dist/features/events/components/SpinWheelView.d.ts +2 -2
- package/dist/features/events/components/SpinWheelView.js +41 -4
- package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
- package/dist/features/events/repository/event-entry.repository.js +41 -7
- package/dist/features/events/schemas/firestore.d.ts +17 -4
- package/dist/features/events/types/index.d.ts +37 -0
- package/dist/features/faq/repository/faqs.repository.js +1 -1
- package/dist/features/faq/schemas/index.d.ts +5 -2
- package/dist/features/faq/schemas/index.js +6 -0
- package/dist/features/faq/types/index.d.ts +0 -1
- package/dist/features/grouped/components/GroupedListingDetailView.js +9 -1
- package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
- package/dist/features/grouped/schemas/firestore.d.ts +5 -0
- package/dist/features/homepage/actions/homepage-section-actions.d.ts +3 -3
- package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
- package/dist/features/homepage/api/carousel/route.js +4 -4
- package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
- package/dist/features/homepage/components/AnnouncementBar.js +13 -19
- package/dist/features/homepage/components/CollectionCardsSection.d.ts +28 -6
- package/dist/features/homepage/components/CollectionCardsSection.js +43 -8
- package/dist/features/homepage/components/HowItWorksSection.d.ts +23 -6
- package/dist/features/homepage/components/HowItWorksSection.js +4 -4
- package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
- package/dist/features/homepage/components/PromoGrid.d.ts +31 -2
- package/dist/features/homepage/components/PromoGrid.js +12 -3
- package/dist/features/homepage/components/TestimonialsCarousel.d.ts +34 -2
- package/dist/features/homepage/components/TestimonialsCarousel.js +1 -1
- package/dist/features/homepage/components/index.d.ts +0 -22
- package/dist/features/homepage/components/index.js +0 -12
- package/dist/features/homepage/index.d.ts +0 -2
- package/dist/features/homepage/index.js +0 -2
- package/dist/features/homepage/lib/section-renderer.d.ts +9 -0
- package/dist/features/homepage/lib/section-renderer.js +202 -58
- package/dist/features/homepage/repository/homepage-sections.repository.d.ts +35 -3
- package/dist/features/homepage/repository/homepage-sections.repository.js +58 -8
- package/dist/features/homepage/schemas/firestore.d.ts +112 -3
- package/dist/features/homepage/schemas/firestore.js +32 -2
- package/dist/features/homepage/schemas/index.d.ts +46 -17
- package/dist/features/homepage/schemas/index.js +39 -27
- package/dist/features/homepage/server.d.ts +0 -3
- package/dist/features/homepage/server.js +0 -3
- package/dist/features/homepage/types/index.d.ts +0 -47
- package/dist/features/homepage/types/index.js +49 -0
- package/dist/features/layout/AppLayoutShell.d.ts +11 -0
- package/dist/features/layout/AppLayoutShell.js +65 -13
- package/dist/features/layout/BottomActionsContext.d.ts +16 -0
- package/dist/features/layout/BottomActionsContext.js +5 -0
- package/dist/features/layout/BottomChrome.js +48 -9
- package/dist/features/layout/BottomNavItem.js +1 -1
- package/dist/features/layout/BottomNavbar.d.ts +14 -0
- package/dist/features/layout/BottomNavbar.js +43 -3
- package/dist/features/layout/BottomSheet.js +1 -1
- package/dist/features/layout/MainNavbar.d.ts +11 -0
- package/dist/features/layout/NavbarLayout.d.ts +3 -0
- package/dist/features/layout/NavbarLayout.js +88 -11
- package/dist/features/layout/SideActionDock.d.ts +1 -0
- package/dist/features/layout/SideActionDock.js +219 -0
- package/dist/features/layout/TitleBarLayout.js +1 -1
- package/dist/features/layout/cta-anchor.d.ts +31 -0
- package/dist/features/layout/cta-anchor.js +31 -0
- package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
- package/dist/features/layout/hooks/useBottomActions.js +6 -1
- package/dist/features/layout/index.d.ts +9 -1
- package/dist/features/layout/index.js +9 -1
- package/dist/features/layout/useCtaReveal.d.ts +24 -0
- package/dist/features/layout/useCtaReveal.js +82 -0
- package/dist/features/layout/useHoldToOpen.d.ts +41 -0
- package/dist/features/layout/useHoldToOpen.js +84 -0
- package/dist/features/live/components/LiveItemDetailPageView.js +4 -9
- package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
- package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
- package/dist/features/lottery/schemas/firestore.d.ts +33 -5
- package/dist/features/loyalty/api/balance/route.js +1 -1
- package/dist/features/loyalty/api/history/route.js +1 -1
- package/dist/features/media/MediaImage.js +0 -1
- package/dist/features/media/MediaPickerModal.js +7 -1
- package/dist/features/media/hooks/useMedia.js +17 -0
- package/dist/features/media/modals/ImageEditor.js +5 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
- package/dist/features/media/repository/media-assets.repository.d.ts +65 -0
- package/dist/features/media/repository/media-assets.repository.js +31 -0
- package/dist/features/media/trust-signals.d.ts +85 -0
- package/dist/features/media/trust-signals.js +126 -0
- package/dist/features/media/upload/CameraCapture.js +16 -1
- package/dist/features/media/upload/ImageUpload.js +42 -4
- package/dist/features/media/upload/MediaUploadField.js +69 -13
- package/dist/features/media/upload/downscale-image.d.ts +56 -0
- package/dist/features/media/upload/downscale-image.js +150 -0
- package/dist/features/messages/components/ConversationThreadView.js +45 -2
- package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
- package/dist/features/messages/components/MessageSellerButton.js +10 -2
- package/dist/features/messages/schemas/firestore.d.ts +15 -0
- package/dist/features/orders/hooks/useOrders.js +4 -2
- package/dist/features/orders/repository/orders.repository.d.ts +15 -4
- package/dist/features/orders/repository/orders.repository.js +52 -20
- package/dist/features/orders/schemas/firestore.d.ts +15 -4
- package/dist/features/orders/schemas/index.d.ts +8 -8
- package/dist/features/orders/types/index.d.ts +2 -2
- package/dist/features/parts/components/PartDetailPageView.d.ts +14 -1
- package/dist/features/parts/components/PartDetailPageView.js +2 -2
- package/dist/features/parts/components/PartsIndexPageView.d.ts +11 -2
- package/dist/features/parts/components/PartsIndexPageView.js +2 -2
- package/dist/features/parts/components/PartsSearchBox.d.ts +9 -0
- package/dist/features/parts/components/PartsSearchBox.js +57 -0
- package/dist/features/parts/schemas/firestore.d.ts +149 -3
- package/dist/features/parts/schemas/firestore.js +184 -0
- package/dist/features/payments/repository/payments.repository.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +38 -6
- package/dist/features/payments/repository/payout.repository.js +84 -23
- package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
- package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
- package/dist/features/payments/schemas/firestore.d.ts +14 -3
- package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
- package/dist/features/pre-orders/api/[slug]/route.js +1 -1
- package/dist/features/pre-orders/api/admin/route.js +1 -1
- package/dist/features/pre-orders/api/route.js +1 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -11
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
- package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
- package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
- package/dist/features/price-index/components/PriceIndexToolView.d.ts +3 -1
- package/dist/features/price-index/components/PriceIndexToolView.js +92 -13
- package/dist/features/products/api/[id]/route.js +1 -1
- package/dist/features/products/components/CompareOverlay.d.ts +18 -1
- package/dist/features/products/components/CompareOverlay.js +21 -2
- package/dist/features/products/components/CustomSectionTabContent.d.ts +31 -0
- package/dist/features/products/components/CustomSectionTabContent.js +29 -3
- package/dist/features/products/components/GroupMemberPicker.d.ts +19 -1
- package/dist/features/products/components/GroupMemberPicker.js +46 -8
- package/dist/features/products/components/GroupSettingsPanel.d.ts +11 -1
- package/dist/features/products/components/GroupSettingsPanel.js +91 -3
- package/dist/features/products/components/ListingBottomActions.js +4 -0
- package/dist/features/products/components/PrizeDrawDetailPageView.js +1 -1
- package/dist/features/products/components/PrizeDrawEntryActions.d.ts +15 -1
- package/dist/features/products/components/PrizeDrawEntryActions.js +70 -8
- package/dist/features/products/components/ProductDetailPageView.js +75 -15
- package/dist/features/products/components/ProductForm.d.ts +13 -1
- package/dist/features/products/components/ProductForm.js +16 -2
- package/dist/features/products/components/ProductGalleryClient.js +2 -2
- package/dist/features/products/components/ProductGrid.js +12 -1
- package/dist/features/products/components/ProductsIndexListing.d.ts +16 -1
- package/dist/features/products/components/ProductsIndexListing.js +3 -3
- package/dist/features/products/components/ShowGroupSection.js +15 -2
- package/dist/features/products/components/SparesListView.d.ts +7 -0
- package/dist/features/products/components/SparesListView.js +39 -0
- package/dist/features/products/components/index.d.ts +0 -2
- package/dist/features/products/components/index.js +0 -1
- package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
- package/dist/features/products/config/listing-type-listing-config.js +27 -2
- package/dist/features/products/constants/action-defs.d.ts +1 -0
- package/dist/features/products/constants/action-defs.js +1 -0
- package/dist/features/products/constants/listing-tabs.d.ts +9 -0
- package/dist/features/products/constants/listing-tabs.js +3 -2
- package/dist/features/products/hooks/useProducts.js +2 -2
- package/dist/features/products/repository/products.repository.d.ts +98 -0
- package/dist/features/products/repository/products.repository.js +248 -18
- package/dist/features/products/schemas/firestore.d.ts +97 -4
- package/dist/features/products/schemas/firestore.js +104 -0
- package/dist/features/products/schemas/index.d.ts +12 -21
- package/dist/features/products/schemas/index.js +23 -6
- package/dist/features/products/types/index.d.ts +46 -2
- package/dist/features/products/utils/group-member-image.d.ts +39 -0
- package/dist/features/products/utils/group-member-image.js +3 -0
- package/dist/features/products/utils/listing-badge-variant.js +4 -0
- package/dist/features/promotions/api/route.js +1 -1
- package/dist/features/reviews/actions/review-actions.d.ts +6 -6
- package/dist/features/reviews/actions/review-actions.js +22 -8
- package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
- package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
- package/dist/features/reviews/components/ReviewsList.js +1 -1
- package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
- package/dist/features/reviews/repository/reviews.repository.js +63 -12
- package/dist/features/reviews/schemas/firestore.d.ts +13 -2
- package/dist/features/reviews/schemas/index.d.ts +2 -2
- package/dist/features/scams/actions/scam-actions.js +16 -4
- package/dist/features/scams/components/ScamProfileView.js +1 -1
- package/dist/features/search/components/EntityTypeahead.d.ts +44 -0
- package/dist/features/search/components/EntityTypeahead.js +92 -0
- package/dist/features/search/components/Search.d.ts +12 -1
- package/dist/features/search/components/Search.js +47 -3
- package/dist/features/search/components/SearchFacetRail.d.ts +11 -0
- package/dist/features/search/components/SearchFacetRail.js +92 -0
- package/dist/features/search/components/SearchResultsClient.d.ts +33 -0
- package/dist/features/search/components/SearchResultsClient.js +103 -0
- package/dist/features/search/components/SearchResultsPageView.d.ts +15 -1
- package/dist/features/search/components/SearchResultsPageView.js +3 -2
- package/dist/features/search/components/index.d.ts +0 -6
- package/dist/features/search/components/index.js +0 -3
- package/dist/features/search/hooks/useNavSuggestions.d.ts +13 -0
- package/dist/features/search/hooks/useScopedSearch.d.ts +34 -0
- package/dist/features/search/hooks/useScopedSearch.js +114 -0
- package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
- package/dist/features/search/hooks/useSearchIndex.js +172 -0
- package/dist/features/search/hooks/useSiteSearch.d.ts +26 -0
- package/dist/features/search/hooks/useSiteSearch.js +149 -0
- package/dist/features/search/index.d.ts +0 -4
- package/dist/features/search/index.js +0 -4
- package/dist/features/search/manifest.d.ts +12 -0
- package/dist/features/search/manifest.js +17 -2
- package/dist/features/search/server.d.ts +0 -3
- package/dist/features/search/server.js +0 -3
- package/dist/features/seller/actions/offer-actions.d.ts +5 -5
- package/dist/features/seller/actions/offer-actions.js +38 -8
- package/dist/features/seller/actions/seller-actions.js +34 -7
- package/dist/features/seller/api/coupons/route.js +1 -1
- package/dist/features/seller/api/products/route.js +1 -1
- package/dist/features/seller/api/store/route.js +1 -1
- package/dist/features/seller/components/SellerBidsView.js +1 -1
- package/dist/features/seller/components/SellerCouponsView.js +1 -1
- package/dist/features/seller/components/SellerListingTypeView.d.ts +1 -1
- package/dist/features/seller/components/SellerListingTypeView.js +29 -1
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutSettingsView.js +35 -15
- package/dist/features/seller/components/SellerPayoutsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.d.ts +1 -1
- package/dist/features/seller/components/SellerProductShell.js +2 -2
- package/dist/features/seller/components/SellerProductsView.js +1 -1
- package/dist/features/seller/components/SellerShippingView.js +0 -1
- package/dist/features/seller/components/SellerSidebar.js +1 -1
- package/dist/features/seller/components/SellerSparesView.d.ts +17 -0
- package/dist/features/seller/components/SellerSparesView.js +6 -0
- package/dist/features/seller/components/SellerStorefrontView.js +0 -1
- package/dist/features/seller/components/index.d.ts +2 -4
- package/dist/features/seller/components/index.js +1 -2
- package/dist/features/seller/repository/offer.repository.d.ts +15 -3
- package/dist/features/seller/repository/offer.repository.js +43 -7
- package/dist/features/seller/schemas/firestore.d.ts +14 -3
- package/dist/features/seller/schemas/index.d.ts +4 -4
- package/dist/features/seller/schemas/order-forms.d.ts +39 -0
- package/dist/features/seller/schemas/order-forms.js +37 -0
- package/dist/features/shell/CommandPalette.js +1 -1
- package/dist/features/shell/FormShell.js +6 -2
- package/dist/features/shell/QuickFormDrawer.js +15 -1
- package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
- package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
- package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
- package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
- package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
- package/dist/features/sticker-trace/constants/help-content.js +172 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
- package/dist/features/sticker-trace/schemas/firestore.d.ts +267 -0
- package/dist/features/sticker-trace/schemas/firestore.js +79 -0
- package/dist/features/sticker-trace/server.d.ts +8 -0
- package/dist/features/sticker-trace/server.js +51 -0
- package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
- package/dist/features/stores/actions/store-query-actions.js +7 -2
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/route.js +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.js +7 -82
- package/dist/features/stores/components/StoreHeader.js +1 -2
- package/dist/features/stores/components/StoreNavTabs.js +17 -2
- package/dist/features/stores/components/StoreSparesPageView.d.ts +27 -0
- package/dist/features/stores/components/StoreSparesPageView.js +48 -0
- package/dist/features/stores/manifest.js +8 -4
- package/dist/features/stores/schemas/firestore.d.ts +19 -0
- package/dist/features/support/repository/support.repository.d.ts +14 -3
- package/dist/features/support/repository/support.repository.js +93 -13
- package/dist/features/support/schemas/firestore.d.ts +16 -5
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +96 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +4 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +478 -0
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +54 -32
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +3 -2
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +73 -0
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +340 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
- package/dist/features/tester/seed-data/authored/index.js +24 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +1 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +57 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +77 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +58 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +284 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +558 -34
- package/dist/index.d.ts +27 -80
- package/dist/index.js +62 -115
- package/dist/next/api/routeHandler.js +9 -0
- package/dist/next/routing/require-record.d.ts +13 -0
- package/dist/next/routing/require-record.js +62 -0
- package/dist/next/routing/route-map.d.ts +46 -5
- package/dist/next/routing/route-map.js +70 -3
- package/dist/providers/db-firebase/base.d.ts +4 -2
- package/dist/providers/db-firebase/base.js +21 -5
- package/dist/providers/db-firebase/base.repository.d.ts +33 -9
- package/dist/providers/db-firebase/base.repository.js +55 -0
- package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
- package/dist/providers/db-firebase/rtdb-paths.js +12 -0
- package/dist/react/ErrorBoundary.js +6 -1
- package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
- package/dist/react/hooks/realtime-event-constants.js +8 -0
- package/dist/react/hooks/useEntityDelete.js +5 -1
- package/dist/react/hooks/useMessage.js +5 -1
- package/dist/repositories/index.d.ts +2 -2
- package/dist/repositories/index.js +6 -1
- package/dist/schemas/registry.d.ts +28 -26
- package/dist/schemas/registry.js +31 -14
- package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
- package/dist/security/blind-index-tokens.d.ts +54 -0
- package/dist/security/blind-index-tokens.js +152 -0
- package/dist/security/encrypted.d.ts +117 -0
- package/dist/security/encrypted.js +100 -0
- package/dist/security/index.d.ts +6 -3
- package/dist/security/index.js +17 -3
- package/dist/security/pii-accessors.d.ts +71 -0
- package/dist/security/pii-accessors.js +150 -0
- package/dist/security/pii-encrypt.d.ts +0 -8
- package/dist/security/pii-encrypt.js +22 -15
- package/dist/security/pii-mask.d.ts +18 -0
- package/dist/security/pii-mask.js +27 -0
- package/dist/security/settings-encryption.d.ts +35 -0
- package/dist/security/settings-encryption.js +91 -0
- package/dist/seed/_helpers/brand-rows.js +38 -14
- package/dist/seed/_helpers/category-forest.js +73 -7
- package/dist/seed/_helpers/category-images-generated.d.ts +25 -6
- package/dist/seed/_helpers/category-images-generated.js +81 -6
- package/dist/seed/_helpers/category-models.d.ts +1 -1
- package/dist/seed/_helpers/category-models.js +7 -1
- package/dist/seed/_helpers/category-parts-glossary-map.js +8 -0
- package/dist/seed/_helpers/category-parts.d.ts +1 -1
- package/dist/seed/_helpers/category-parts.js +50 -2
- package/dist/seed/_helpers/character-features.d.ts +1 -1
- package/dist/seed/_helpers/character-features.js +2 -1
- package/dist/seed/_helpers/franchise-rows.js +10 -2
- package/dist/seed/_helpers/media.d.ts +47 -0
- package/dist/seed/_helpers/media.js +34 -0
- package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
- package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
- package/dist/seed/addresses-seed-data.d.ts +2 -2
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +78 -0
- package/dist/seed/authenticity-knowledge-seed-data.js +10729 -0
- package/dist/seed/bids-seed-data.d.ts +2 -2
- package/dist/seed/bids-seed-data.js +23 -2
- package/dist/seed/categories-seed-data.js +124 -20
- package/dist/seed/events-seed-data.d.ts +2 -2
- package/dist/seed/events-seed-data.js +5 -0
- package/dist/seed/faq-seed-data.js +175 -5
- package/dist/seed/grouped-listings-seed-data.js +16 -0
- package/dist/seed/homepage-sections-seed-data.js +131 -26
- package/dist/seed/index.d.ts +3 -3
- package/dist/seed/index.js +3 -2
- package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
- package/dist/seed/manifest.js +3 -0
- package/dist/seed/media-assets-seed-data.d.ts +1 -1
- package/dist/seed/media-assets-seed-data.js +746 -196
- package/dist/seed/model-composition-seed-data.js +122 -6
- package/dist/seed/offers-seed-data.d.ts +2 -2
- package/dist/seed/offers-seed-data.js +1 -1
- package/dist/seed/orders-seed-data.d.ts +2 -2
- package/dist/seed/part-glossary-seed-data.d.ts +1 -1
- package/dist/seed/part-glossary-seed-data.js +37219 -463
- package/dist/seed/payouts-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.js +1 -1
- package/dist/seed/products-art-seed-data.js +7 -18
- package/dist/seed/products-auctions-seed-data.js +56 -47
- package/dist/seed/products-beyblade-x-seed-data.d.ts +2 -0
- package/dist/seed/products-beyblade-x-seed-data.js +441 -0
- package/dist/seed/products-catalogue-seed-data.d.ts +5 -5
- package/dist/seed/products-catalogue-seed-data.js +1500 -1240
- package/dist/seed/products-classifieds-seed-data.js +9 -27
- package/dist/seed/products-digital-codes-seed-data.js +9 -18
- package/dist/seed/products-live-items-seed-data.js +5 -13
- package/dist/seed/products-preorders-seed-data.js +67 -33
- package/dist/seed/products-prize-draws-seed-data.js +8 -17
- package/dist/seed/products-spares-seed-data.d.ts +2 -0
- package/dist/seed/products-spares-seed-data.js +368 -0
- package/dist/seed/products-standard-seed-data.js +39 -126
- package/dist/seed/products-stickers-seed-data.js +59 -15
- package/dist/seed/reviews-seed-data.d.ts +1 -2
- package/dist/seed/seed-purpose.js +7 -0
- package/dist/seed/sessions-seed-data.d.ts +2 -2
- package/dist/seed/sessions-seed-data.js +5 -0
- package/dist/seed/site-settings-seed-data.js +9 -1
- package/dist/seed/support-tickets-seed-data.d.ts +2 -2
- package/dist/seed/support-tickets-seed-data.js +1 -1
- package/dist/seed/users-seed-data.d.ts +2 -2
- package/dist/seed/users-seed-data.js +1 -1
- package/dist/seo/json-ld.d.ts +25 -0
- package/dist/seo/json-ld.js +33 -1
- package/dist/server-entry.d.ts +3 -1
- package/dist/server-entry.js +2 -2
- package/dist/server.d.ts +27 -12
- package/dist/server.js +86 -28
- package/dist/styles.css +438 -1
- package/dist/tailwind-input.css +31 -17
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Accordion.js +1 -1
- package/dist/ui/components/Breadcrumb.js +1 -1
- package/dist/ui/components/Button.js +7 -1
- package/dist/ui/components/DetailPageGallery.js +0 -2
- package/dist/ui/components/DetailPageHero.js +0 -1
- package/dist/ui/components/DetailPageTabs.js +1 -1
- package/dist/ui/components/Divider.js +3 -3
- package/dist/ui/components/FilterChipGroup.d.ts +11 -0
- package/dist/ui/components/FilterChipGroup.js +1 -1
- package/dist/ui/components/GatedPrice.js +5 -1
- package/dist/ui/components/HorizontalScroller.js +1 -1
- package/dist/ui/components/ImageGallery.js +6 -1
- package/dist/ui/components/ListingLayout.js +17 -11
- package/dist/ui/components/MediaTabs.style.css +81 -0
- package/dist/ui/components/OverflowRow.d.ts +92 -0
- package/dist/ui/components/OverflowRow.js +203 -0
- package/dist/ui/components/OverflowRow.style.css +235 -0
- package/dist/ui/components/Pagination.js +1 -1
- package/dist/ui/components/PendingValue.d.ts +45 -0
- package/dist/ui/components/PendingValue.js +7 -0
- package/dist/ui/components/Radio.style.css +119 -0
- package/dist/ui/components/RatingDisplay.js +2 -2
- package/dist/ui/components/RecordDetailModal.js +14 -1
- package/dist/ui/components/RowActionMenu.js +5 -1
- package/dist/ui/components/SettingsSection.js +0 -2
- package/dist/ui/components/SideDrawer.js +5 -1
- package/dist/ui/components/SideModal.js +9 -1
- package/dist/ui/components/SiteLogo.js +3 -0
- package/dist/ui/components/SiteMark.js +3 -0
- package/dist/ui/components/SortDropdown.js +1 -1
- package/dist/ui/components/SpecTable.d.ts +58 -0
- package/dist/ui/components/SpecTable.js +8 -0
- package/dist/ui/components/StarRating.js +1 -3
- package/dist/ui/components/SummaryCard.js +1 -1
- package/dist/ui/components/TabBarShell.d.ts +12 -1
- package/dist/ui/components/TabBarShell.js +3 -2
- package/dist/ui/components/Tabs.js +36 -24
- package/dist/ui/components/Toast.d.ts +3 -24
- package/dist/ui/components/Toast.js +2 -19
- package/dist/ui/components/TopBannerPortal.d.ts +15 -0
- package/dist/ui/components/TopBannerPortal.js +19 -0
- package/dist/ui/components/UnsavedChangesModal.js +5 -1
- package/dist/ui/components/index.style.css +2 -0
- package/dist/ui/components/row-collapse.d.ts +15 -0
- package/dist/ui/components/row-collapse.js +127 -0
- package/dist/ui/components/toast-context.d.ts +63 -0
- package/dist/ui/components/toast-context.js +48 -0
- package/dist/ui/components/top-banner-slot.d.ts +37 -0
- package/dist/ui/components/top-banner-slot.js +45 -0
- package/dist/ui/icons/icon-registry.d.ts +7 -0
- package/dist/ui/icons/icon-registry.js +25 -1
- package/dist/ui/index.d.ts +6 -0
- package/dist/ui/index.js +3 -0
- package/dist/utils/array.helper.d.ts +2 -2
- package/dist/utils/array.helper.js +5 -5
- package/dist/utils/id-generators.d.ts +6 -0
- package/dist/utils/id-generators.js +10 -0
- package/dist/utils/media-url.js +0 -2
- package/dist/utils/search-txt-builders.d.ts +28 -4
- package/dist/utils/search-txt-builders.js +41 -1
- package/dist/utils/search-txt-query.d.ts +12 -0
- package/dist/utils/search-txt-query.js +12 -0
- package/dist/validation/schemas.d.ts +8 -8
- package/package.json +6 -2
- package/scripts/dedupe-peer-deps.mjs +18 -0
- package/scripts/seed-cli.mjs +138 -26
- package/scripts/verify-css-build.mjs +118 -37
- package/dist/_internal/server/features/search/actions.d.ts +0 -7
- package/dist/_internal/server/features/search/actions.js +0 -21
- package/dist/_internal/server/features/search/data.d.ts +0 -15
- package/dist/_internal/server/features/search/data.js +0 -18
- package/dist/_internal/server/features/search/index.d.ts +0 -3
- package/dist/_internal/server/features/search/index.js +0 -2
- package/dist/features/account/components/UserAddressesView.d.ts +0 -13
- package/dist/features/account/components/UserAddressesView.js +0 -5
- package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
- package/dist/features/account/components/UserNotificationsView.js +0 -12
- package/dist/features/account/components/UserSettingsView.d.ts +0 -16
- package/dist/features/account/components/UserSettingsView.js +0 -13
- package/dist/features/account/components/UserSupportView.d.ts +0 -3
- package/dist/features/account/components/UserSupportView.js +0 -166
- package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
- package/dist/features/admin/components/DemoSeedView.js +0 -5
- package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
- package/dist/features/auth/components/AuthStatusPanel.js +0 -22
- package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
- package/dist/features/categories/components/CategoryProductsView.js +0 -21
- package/dist/features/homepage/api/[id]/route.d.ts +0 -23
- package/dist/features/homepage/api/[id]/route.js +0 -103
- package/dist/features/homepage/api/route.d.ts +0 -14
- package/dist/features/homepage/api/route.js +0 -140
- package/dist/features/homepage/api/sections/[id]/route.d.ts +0 -26
- package/dist/features/homepage/api/sections/[id]/route.js +0 -95
- package/dist/features/homepage/api/sections/route.d.ts +0 -13
- package/dist/features/homepage/api/sections/route.js +0 -82
- package/dist/features/homepage/components/AdvertisementBanner.d.ts +0 -14
- package/dist/features/homepage/components/AdvertisementBanner.js +0 -35
- package/dist/features/homepage/components/BeforeAfterCard.d.ts +0 -9
- package/dist/features/homepage/components/BeforeAfterCard.js +0 -73
- package/dist/features/homepage/components/FeaturedResultsSection.d.ts +0 -17
- package/dist/features/homepage/components/FeaturedResultsSection.js +0 -17
- package/dist/features/homepage/components/HeroBanner.d.ts +0 -7
- package/dist/features/homepage/components/HeroBanner.js +0 -43
- package/dist/features/homepage/components/HeroSection.d.ts +0 -7
- package/dist/features/homepage/components/HeroSection.js +0 -6
- package/dist/features/homepage/components/HomepageSkeleton.d.ts +0 -2
- package/dist/features/homepage/components/HomepageSkeleton.js +0 -21
- package/dist/features/homepage/components/HomepageView.d.ts +0 -25
- package/dist/features/homepage/components/HomepageView.js +0 -5
- package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
- package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
- package/dist/features/homepage/components/NewsletterBanner.d.ts +0 -23
- package/dist/features/homepage/components/NewsletterBanner.js +0 -37
- package/dist/features/homepage/components/SiteFeaturesSection.d.ts +0 -14
- package/dist/features/homepage/components/SiteFeaturesSection.js +0 -11
- package/dist/features/homepage/components/TrustBadges.d.ts +0 -6
- package/dist/features/homepage/components/TrustBadges.js +0 -46
- package/dist/features/homepage/components/TrustIndicatorsSection.d.ts +0 -12
- package/dist/features/homepage/components/TrustIndicatorsSection.js +0 -11
- package/dist/features/homepage/hooks/useHomepage.d.ts +0 -11
- package/dist/features/homepage/hooks/useHomepage.js +0 -17
- package/dist/features/homepage/hooks/useHomepageSections.d.ts +0 -2
- package/dist/features/homepage/hooks/useHomepageSections.js +0 -10
- package/dist/features/homepage/repository/homepage.repository.d.ts +0 -11
- package/dist/features/homepage/repository/homepage.repository.js +0 -25
- package/dist/features/layout/BottomActions.d.ts +0 -1
- package/dist/features/layout/BottomActions.js +0 -311
- package/dist/features/products/components/ProductsView.d.ts +0 -6
- package/dist/features/products/components/ProductsView.js +0 -5
- package/dist/features/search/actions/index.d.ts +0 -1
- package/dist/features/search/actions/index.js +0 -1
- package/dist/features/search/actions/search-actions.d.ts +0 -18
- package/dist/features/search/actions/search-actions.js +0 -43
- package/dist/features/search/api/route.d.ts +0 -22
- package/dist/features/search/api/route.js +0 -128
- package/dist/features/search/columns/index.d.ts +0 -17
- package/dist/features/search/columns/index.js +0 -49
- package/dist/features/search/components/SearchFiltersRow.d.ts +0 -22
- package/dist/features/search/components/SearchFiltersRow.js +0 -21
- package/dist/features/search/components/SearchResultsSection.d.ts +0 -53
- package/dist/features/search/components/SearchResultsSection.js +0 -35
- package/dist/features/search/components/SearchView.d.ts +0 -27
- package/dist/features/search/components/SearchView.js +0 -8
- package/dist/features/search/hooks/useSearch.d.ts +0 -21
- package/dist/features/search/hooks/useSearch.js +0 -33
- package/dist/features/search/repository/search.repository.d.ts +0 -14
- package/dist/features/search/repository/search.repository.js +0 -59
- package/dist/features/search/schemas/index.d.ts +0 -70
- package/dist/features/search/schemas/index.js +0 -36
- package/dist/features/search/types/index.d.ts +0 -48
- package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
- package/dist/features/seller/components/SellerStoreView.js +0 -8
- package/dist/features/stores/components/StoreScopedSearch.d.ts +0 -17
- package/dist/features/stores/components/StoreScopedSearch.js +0 -27
- package/dist/seed/defaults/homepage-sections.d.ts +0 -2
- package/dist/seed/defaults/homepage-sections.js +0 -60
- package/dist/seed/factories/homepage-section.factory.d.ts +0 -10
- package/dist/seed/factories/homepage-section.factory.js +0 -13
- /package/dist/{features/search/types/index.js → _internal/shared/listing-types/spares/og.d.ts} +0 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Searching a 3,730-record artifact in the browser, at zero Firestore
|
|
3
|
+
* reads per keystroke. The action-index route already states the
|
|
4
|
+
* doctrine this follows: "One request per session per portal, never per
|
|
5
|
+
* keystroke… a typeahead has to answer in under 16 ms, which a network
|
|
6
|
+
* hop cannot."
|
|
7
|
+
* WHAT: A pure, isomorphic matcher plus `resolveEntity`, the named primitive
|
|
8
|
+
* the /tools surfaces call.
|
|
9
|
+
*
|
|
10
|
+
* ## 🛑 ONE normaliser, and it is imported, not reimplemented
|
|
11
|
+
*
|
|
12
|
+
* `normalizeSearchText` is the same function the write path and the Firestore
|
|
13
|
+
* path use. `audit-search-parity`'s R2 exists because a second tokeniser
|
|
14
|
+
* writes tokens the query side cannot match — "and re-running the backfill
|
|
15
|
+
* does NOT fix it". A library would have brought a third; this file must not
|
|
16
|
+
* grow a local lowercase/NFD pipeline. Enforced by that audit.
|
|
17
|
+
*
|
|
18
|
+
* ## Why hand-rolled rather than MiniSearch
|
|
19
|
+
*
|
|
20
|
+
* Three reasons, in order of weight:
|
|
21
|
+
*
|
|
22
|
+
* 1. the normaliser argument above;
|
|
23
|
+
* 2. typo tolerance is already solved at WRITE time with evidence —
|
|
24
|
+
* `alias-variants` derives its suffix swaps from a crawl of a counterfeit
|
|
25
|
+
* seller's 1,277 titles, which is better grounded than generic edit
|
|
26
|
+
* distance and costs nothing at query time;
|
|
27
|
+
* 3. ~3,700 records is below where an inverted index earns its complexity. A
|
|
28
|
+
* linear scan is a few thousand cheap iterations.
|
|
29
|
+
*
|
|
30
|
+
* 🛑 (3) is a claim with a number attached, and the number is checked —
|
|
31
|
+
* `scripts/verify-search-local.mjs` times it and prints the result. If that
|
|
32
|
+
* ever stops being true, this comment is the thing to come back and delete.
|
|
33
|
+
*
|
|
34
|
+
* ## 🛑 It is NOT BM25 and must not be described as BM25
|
|
35
|
+
*
|
|
36
|
+
* BM25's two moving parts are IDF and length normalisation. Titles here
|
|
37
|
+
* average 20 characters, so length normalisation is degenerate; IDF over one
|
|
38
|
+
* domain mostly re-derives "beyblade is common", which `weight` already
|
|
39
|
+
* encodes. Calling an ordered weight sum "BM25-ish" would be decoration
|
|
40
|
+
* (Root Cause #92). It is a weighted match score, the weights are below, and
|
|
41
|
+
* they are tuned against the verify script.
|
|
42
|
+
*
|
|
43
|
+
* ## What this has that the Firestore path structurally cannot
|
|
44
|
+
*
|
|
45
|
+
* SUBSTRING. `search-txt.ts` states the limit outright: "Word-prefix, not
|
|
46
|
+
* mid-word. 'ariza' will not match 'charizard'." A linear scan gets mid-word
|
|
47
|
+
* for free, which is why Tier 1 is better at its job than Tier 2, not merely
|
|
48
|
+
* cheaper.
|
|
49
|
+
*
|
|
50
|
+
* @tag domain:search
|
|
51
|
+
* @tag layer:shared
|
|
52
|
+
* @tag pattern:none
|
|
53
|
+
* @tag access:isomorphic
|
|
54
|
+
* @tag consumers:useSiteSearch,/parts,/tools/price-index,verify-search-local
|
|
55
|
+
* @tag sideEffects:none
|
|
56
|
+
*/
|
|
57
|
+
import { normalizeSearchText, parseSearchTxtQuery } from "../../../utils/search-txt.js";
|
|
58
|
+
import { aliasVariantsForName } from "./alias-variants.js";
|
|
59
|
+
import { partAliasTokens } from "./part-aliases.js";
|
|
60
|
+
import { facetsOf, hrefFor, REC_DETAIL, REC_FACETS, REC_TITLE, REC_TYPE, } from "./index-record.js";
|
|
61
|
+
/** Field weights. Title dominates; a detail match is corroboration. */
|
|
62
|
+
const W_TITLE = 3;
|
|
63
|
+
const W_DETAIL = 1;
|
|
64
|
+
/** Match-quality weights, highest first. */
|
|
65
|
+
const S_EXACT = 100;
|
|
66
|
+
const S_PREFIX = 60;
|
|
67
|
+
const S_SUBSTRING = 30;
|
|
68
|
+
const S_ALIAS = 15;
|
|
69
|
+
/** Default cap. A dropdown shows ~6 per group; a page shows more. */
|
|
70
|
+
const DEFAULT_LIMIT = 50;
|
|
71
|
+
/**
|
|
72
|
+
* Prepare an artifact for searching.
|
|
73
|
+
*
|
|
74
|
+
* 🛑 Call this ONCE per artifact, not per query. It normalises every title and
|
|
75
|
+
* detail up front — ~3,700 × 2 `normalizeSearchText` calls, a few milliseconds
|
|
76
|
+
* — so that the per-keystroke path does no allocation beyond the query's own
|
|
77
|
+
* terms. Doing it inside `search` would move that cost onto every keystroke,
|
|
78
|
+
* which is the one thing this design exists to avoid.
|
|
79
|
+
*/
|
|
80
|
+
export function prepareIndex(artifact) {
|
|
81
|
+
return artifact.r.map((rec) => {
|
|
82
|
+
const title = rec[REC_TITLE] ?? "";
|
|
83
|
+
const titleFlat = normalizeSearchText(title);
|
|
84
|
+
const detailFlat = normalizeSearchText(rec[REC_DETAIL] ?? "");
|
|
85
|
+
/*
|
|
86
|
+
* 🛑 The alias corpus is expanded against the DOCUMENT, not the query, and
|
|
87
|
+
* getting this backwards is a real bug I shipped into the first draft.
|
|
88
|
+
*
|
|
89
|
+
* `aliasVariantsForName` is DIRECTIONAL: `doubledLetterVariants` collapses
|
|
90
|
+
* `dragoon -> dragon`, it does not expand `dragon -> dragoon`. The
|
|
91
|
+
* Firestore path works because `buildProductSearchTxt` runs it over the
|
|
92
|
+
* TITLE at write time, so the document carries "dragon" as a token.
|
|
93
|
+
* Expanding the query instead produces nothing for that rule, and the
|
|
94
|
+
* verify script caught it: searching "dragon" found no "Dragoon Storm".
|
|
95
|
+
*
|
|
96
|
+
* So the client does at LOAD what the server does at WRITE — same
|
|
97
|
+
* function, same direction, same result. It also keeps the variants out
|
|
98
|
+
* of the artifact, which is why `index-record.ts` does not carry them.
|
|
99
|
+
*
|
|
100
|
+
* `partAliasTokens` is symmetric (a code <-> name table), so it would have
|
|
101
|
+
* worked either way; it runs here too so there is one rule, not two.
|
|
102
|
+
*/
|
|
103
|
+
const aliasSet = new Set();
|
|
104
|
+
for (const v of aliasVariantsForName(title))
|
|
105
|
+
aliasSet.add(normalizeSearchText(v));
|
|
106
|
+
for (const v of partAliasTokens(`${title} ${rec[REC_DETAIL] ?? ""}`)) {
|
|
107
|
+
aliasSet.add(normalizeSearchText(v));
|
|
108
|
+
}
|
|
109
|
+
aliasSet.delete(titleFlat); // a variant identical to the title adds nothing
|
|
110
|
+
const aliasFlat = [...aliasSet].filter(Boolean).join(" ");
|
|
111
|
+
return {
|
|
112
|
+
rec,
|
|
113
|
+
titleFlat,
|
|
114
|
+
detailFlat,
|
|
115
|
+
aliasFlat,
|
|
116
|
+
titleWords: titleFlat ? titleFlat.split(" ") : [],
|
|
117
|
+
detailWords: detailFlat ? detailFlat.split(" ") : [],
|
|
118
|
+
aliasWords: aliasFlat ? aliasFlat.split(" ") : [],
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/** Best match quality for one term against one field. 0 means no match. */
|
|
123
|
+
function fieldScore(term, words, flat) {
|
|
124
|
+
if (!flat)
|
|
125
|
+
return 0;
|
|
126
|
+
for (const w of words)
|
|
127
|
+
if (w === term)
|
|
128
|
+
return S_EXACT;
|
|
129
|
+
for (const w of words)
|
|
130
|
+
if (w.startsWith(term))
|
|
131
|
+
return S_PREFIX;
|
|
132
|
+
// Mid-word. The capability the token index cannot have.
|
|
133
|
+
if (flat.includes(term))
|
|
134
|
+
return S_SUBSTRING;
|
|
135
|
+
return 0;
|
|
136
|
+
}
|
|
137
|
+
function recordScore(p, terms, typeWeight) {
|
|
138
|
+
let total = 0;
|
|
139
|
+
for (const term of terms) {
|
|
140
|
+
/*
|
|
141
|
+
* An alias match is real but WEAKER than a direct one: `S_ALIAS` is the
|
|
142
|
+
* ceiling for that field, so "Dragoon Storm" still outranks a record that
|
|
143
|
+
* only matched through a generated misspelling.
|
|
144
|
+
*/
|
|
145
|
+
const aliasHit = fieldScore(term, p.aliasWords, p.aliasFlat) > 0 ? S_ALIAS : 0;
|
|
146
|
+
const best = Math.max(fieldScore(term, p.titleWords, p.titleFlat) * W_TITLE, fieldScore(term, p.detailWords, p.detailFlat) * W_DETAIL, aliasHit);
|
|
147
|
+
// AND semantics: a record missing any term is out, regardless of how well
|
|
148
|
+
// it matched the others. "red dranzer" returning everything with "dranzer"
|
|
149
|
+
// is the exact complaint that made search feel broken.
|
|
150
|
+
if (best === 0)
|
|
151
|
+
return 0;
|
|
152
|
+
total += best;
|
|
153
|
+
}
|
|
154
|
+
return total * typeWeight;
|
|
155
|
+
}
|
|
156
|
+
function facetsSatisfied(rec, required) {
|
|
157
|
+
if (required.length === 0)
|
|
158
|
+
return true;
|
|
159
|
+
const have = new Set(facetsOf(rec).map(([k, v]) => `${k}:${v}`));
|
|
160
|
+
return required.every((f) => have.has(f));
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Search a prepared artifact.
|
|
164
|
+
*
|
|
165
|
+
* Returns a flat, score-ordered list. Grouping by type is the caller's job —
|
|
166
|
+
* the dropdown and the results page group differently, and a tool wants
|
|
167
|
+
* neither.
|
|
168
|
+
*/
|
|
169
|
+
export function searchIndex(artifact, prepared, query, opts = {}) {
|
|
170
|
+
const terms = parseSearchTxtQuery(query);
|
|
171
|
+
/*
|
|
172
|
+
* 🛑 A query that normalises to nothing returns NOTHING, never everything.
|
|
173
|
+
* "!!!" and "—" have no terms, and treating that as "no filter" is how a
|
|
174
|
+
* punctuation search returns the whole catalogue AS SEARCH RESULTS — the
|
|
175
|
+
* bug A2 fixed on /api/products, and the one `plan.empty` exists for.
|
|
176
|
+
*/
|
|
177
|
+
if (terms.length === 0)
|
|
178
|
+
return [];
|
|
179
|
+
const limit = opts.limit ?? DEFAULT_LIMIT;
|
|
180
|
+
const wantTypes = new Set(opts.types ?? []);
|
|
181
|
+
const facets = opts.facets ?? [];
|
|
182
|
+
const collect = (useTerms, aliasPass) => {
|
|
183
|
+
const hits = [];
|
|
184
|
+
for (const p of prepared) {
|
|
185
|
+
const type = artifact.types[p.rec[REC_TYPE]];
|
|
186
|
+
if (!type)
|
|
187
|
+
continue;
|
|
188
|
+
if (wantTypes.size > 0 && !wantTypes.has(type.key))
|
|
189
|
+
continue;
|
|
190
|
+
if (!facetsSatisfied(p.rec, facets))
|
|
191
|
+
continue;
|
|
192
|
+
const score = recordScore(p, useTerms, type.weight);
|
|
193
|
+
if (score === 0)
|
|
194
|
+
continue;
|
|
195
|
+
hits.push({
|
|
196
|
+
typeIdx: p.rec[REC_TYPE],
|
|
197
|
+
typeKey: type.key,
|
|
198
|
+
title: p.rec[REC_TITLE],
|
|
199
|
+
detail: p.rec[REC_DETAIL],
|
|
200
|
+
href: hrefFor(artifact, p.rec),
|
|
201
|
+
facets: p.rec[REC_FACETS] ?? "",
|
|
202
|
+
// An alias hit is a weaker signal than a direct one and must not
|
|
203
|
+
// outrank it when both are present in a later, wider query.
|
|
204
|
+
score: aliasPass ? score - S_ALIAS : score,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
return hits;
|
|
208
|
+
};
|
|
209
|
+
/*
|
|
210
|
+
* ONE pass. The alias forms live on the prepared record (see
|
|
211
|
+
* `prepareIndex`), so there is nothing to retry with — an earlier draft had
|
|
212
|
+
* a second query-expansion pass here and it was both redundant and
|
|
213
|
+
* directionally wrong.
|
|
214
|
+
*/
|
|
215
|
+
const hits = collect(terms, false);
|
|
216
|
+
hits.sort((a, b) => b.score - a.score || a.title.localeCompare(b.title));
|
|
217
|
+
/*
|
|
218
|
+
* 🛑 Dedupe by DESTINATION, not by key. Two types can legitimately resolve
|
|
219
|
+
* to the same page: `model` (a composition) and `category` (the model leaf)
|
|
220
|
+
* both render `/categories/{s}`, because a composition has no page of its
|
|
221
|
+
* own. Found running the first real build — 222 model records sit on top of
|
|
222
|
+
* 1,144 categories, so a bey name could return two rows that go to the same
|
|
223
|
+
* place, which reads as a duplicate-results bug rather than as two ways of
|
|
224
|
+
* finding one thing.
|
|
225
|
+
*
|
|
226
|
+
* Keeping the HIGHER-scoring one is what preserves the value of both: the
|
|
227
|
+
* composition's name is often the longer, more specific form ("Aero Knight
|
|
228
|
+
* MS (Aero Knight Metal Sky)" against the category's "Aero Knight MS"), so
|
|
229
|
+
* whichever actually matched the query is the one worth showing.
|
|
230
|
+
*
|
|
231
|
+
* After the sort, so "first seen" is "best scoring".
|
|
232
|
+
*/
|
|
233
|
+
const seen = new Set();
|
|
234
|
+
const deduped = [];
|
|
235
|
+
for (const hit of hits) {
|
|
236
|
+
if (seen.has(hit.href))
|
|
237
|
+
continue;
|
|
238
|
+
seen.add(hit.href);
|
|
239
|
+
deduped.push(hit);
|
|
240
|
+
if (deduped.length >= limit)
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
return deduped;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* The named primitive the tools call.
|
|
247
|
+
*
|
|
248
|
+
* 🛑 `types` is a parameter from day one BECAUSE the tools exist. `/parts`
|
|
249
|
+
* wants parts, the price index wants category leaves, the authenticity
|
|
250
|
+
* typeahead wants canonical models — three consumers, three subsets. Adding
|
|
251
|
+
* the filter later would mean changing every call site that had already been
|
|
252
|
+
* written without it.
|
|
253
|
+
*
|
|
254
|
+
* 🛑 It must NOT be wired into `/tools/authenticity`'s VERDICT path. That
|
|
255
|
+
* engine's fuzzy matching is evidence — a near-miss fires a trademark-evasion
|
|
256
|
+
* warning — and this matcher's alias corpus is built from a counterfeit
|
|
257
|
+
* seller's own spellings. Feeding one into the other would silence the warning
|
|
258
|
+
* by construction. The typeahead may propose a canonical entity; the engine
|
|
259
|
+
* must still analyse what the user actually typed. Enforced by
|
|
260
|
+
* audit-entity-resolver-consumers R2.
|
|
261
|
+
*/
|
|
262
|
+
export function resolveEntity(artifact, prepared, query, opts = {}) {
|
|
263
|
+
return searchIndex(artifact, prepared, query, opts);
|
|
264
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { SearchEverythingResult, SearchGroup } from "../../server/features/search/search-everything";
|
|
2
|
+
import type { ResolvedEntity } from "./match";
|
|
3
|
+
import type { SearchIndexArtifact } from "./index-record";
|
|
4
|
+
/** Rows shown per group before "see all". Matches the server tier's PER_GROUP. */
|
|
5
|
+
export declare const LOCAL_PER_GROUP = 6;
|
|
6
|
+
export interface ToGroupsOptions {
|
|
7
|
+
readonly perGroup?: number;
|
|
8
|
+
/**
|
|
9
|
+
* `typeKey` -> human heading. REQUIRED, and the artifact deliberately does
|
|
10
|
+
* not carry it: a label baked into a shared immutable artifact cannot be
|
|
11
|
+
* translated, and this app is `[locale]`-routed. The caller resolves it
|
|
12
|
+
* through the label system at render time.
|
|
13
|
+
*/
|
|
14
|
+
readonly label: (typeKey: string) => string;
|
|
15
|
+
/** `typeKey` -> the type's browse page, from the artifact's type table. */
|
|
16
|
+
readonly moreHref: (typeKey: string) => string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Group score-ordered hits by type, preserving the order the types first
|
|
20
|
+
* appear in.
|
|
21
|
+
*
|
|
22
|
+
* 🛑 Group ORDER follows the best hit in each group, not the type table's
|
|
23
|
+
* `weight`. Weight already biased the scores; applying it again as an
|
|
24
|
+
* ordering key would double-count it, and a query that matched one FAQ
|
|
25
|
+
* exactly would still rank a weak product match above it.
|
|
26
|
+
*/
|
|
27
|
+
export declare function toSearchGroups(hits: readonly ResolvedEntity[], opts: ToGroupsOptions): SearchGroup[];
|
|
28
|
+
/** Assemble the full result envelope the page component expects. */
|
|
29
|
+
export declare function toSearchResult(q: string, terms: readonly string[], hits: readonly ResolvedEntity[], opts: ToGroupsOptions): SearchEverythingResult;
|
|
30
|
+
export interface FacetCount {
|
|
31
|
+
readonly key: string;
|
|
32
|
+
readonly value: string;
|
|
33
|
+
readonly count: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Count facet values across a result set.
|
|
37
|
+
*
|
|
38
|
+
* ## 🛑 This is the thing the server tier structurally cannot afford
|
|
39
|
+
*
|
|
40
|
+
* `BaseRepository.facetCounts` runs ONE aggregation query per facet value,
|
|
41
|
+
* each needing its own composite index, and on a missing index it logs and
|
|
42
|
+
* returns `undefined` so the facet "stays visible" with no count. Here it is
|
|
43
|
+
* a `reduce` over an array already in memory: zero queries, zero indexes, and
|
|
44
|
+
* a count that cannot silently fail.
|
|
45
|
+
*
|
|
46
|
+
* Counts are over the hits the CURRENT query produced, so ticking one facet
|
|
47
|
+
* and watching the others shrink is truthful rather than an approximation of
|
|
48
|
+
* the whole catalogue.
|
|
49
|
+
*/
|
|
50
|
+
export declare function countFacets(hits: readonly ResolvedEntity[]): FacetCount[];
|
|
51
|
+
/** Look up a type's `moreHref` from the artifact's own table. */
|
|
52
|
+
export declare function moreHrefResolver(artifact: Pick<SearchIndexArtifact, "types">): (typeKey: string) => string;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Tier 1 and Tier 2 must render through the SAME component, or the page
|
|
3
|
+
* grows two layouts that drift.
|
|
4
|
+
* WHAT: `ResolvedEntity[]` (browser matcher) -> `SearchGroup[]` (the shape
|
|
5
|
+
* `SearchResultsPageView` already renders), plus facet counting.
|
|
6
|
+
*
|
|
7
|
+
* ## 🛑 Written against the server's types, not beside them
|
|
8
|
+
*
|
|
9
|
+
* `SearchGroup` / `SearchHit` / `SearchEverythingResult` are declared in
|
|
10
|
+
* `_internal/server/features/search/search-everything.ts` and imported here
|
|
11
|
+
* as TYPES ONLY — erased at runtime, so nothing of the server reaches a
|
|
12
|
+
* browser bundle. `SearchResultsPageView` already does exactly this, so the
|
|
13
|
+
* boundary is established rather than invented here.
|
|
14
|
+
*
|
|
15
|
+
* Defining a parallel `LocalSearchGroup` would have been the easy call and
|
|
16
|
+
* the wrong one: two near-identical result shapes is how a page ends up with
|
|
17
|
+
* two renderers, and then a fix to one of them (Root Cause #59's shape).
|
|
18
|
+
*
|
|
19
|
+
* ## 🛑 `truncated` is FALSE here, and that is a real difference
|
|
20
|
+
*
|
|
21
|
+
* The server tier reads a bounded window per collection, so a saturated fetch
|
|
22
|
+
* makes its count a FLOOR and it must render "6+". Tier 1 holds the entire
|
|
23
|
+
* corpus in memory, so the count is EXACT — there is no window to saturate.
|
|
24
|
+
* Reporting `truncated: true` because a group was capped for DISPLAY would be
|
|
25
|
+
* a different claim ("there may be more we could not see") and a false one.
|
|
26
|
+
* `total` carries the real figure; `hits` is the slice shown.
|
|
27
|
+
*
|
|
28
|
+
* @tag domain:search
|
|
29
|
+
* @tag layer:shared
|
|
30
|
+
* @tag pattern:none
|
|
31
|
+
* @tag access:isomorphic
|
|
32
|
+
* @tag consumers:useSiteSearch,SearchResultsClient
|
|
33
|
+
* @tag sideEffects:none
|
|
34
|
+
*/
|
|
35
|
+
/** Rows shown per group before "see all". Matches the server tier's PER_GROUP. */
|
|
36
|
+
export const LOCAL_PER_GROUP = 6;
|
|
37
|
+
/**
|
|
38
|
+
* Group score-ordered hits by type, preserving the order the types first
|
|
39
|
+
* appear in.
|
|
40
|
+
*
|
|
41
|
+
* 🛑 Group ORDER follows the best hit in each group, not the type table's
|
|
42
|
+
* `weight`. Weight already biased the scores; applying it again as an
|
|
43
|
+
* ordering key would double-count it, and a query that matched one FAQ
|
|
44
|
+
* exactly would still rank a weak product match above it.
|
|
45
|
+
*/
|
|
46
|
+
export function toSearchGroups(hits, opts) {
|
|
47
|
+
const perGroup = opts.perGroup ?? LOCAL_PER_GROUP;
|
|
48
|
+
const order = [];
|
|
49
|
+
const byType = new Map();
|
|
50
|
+
for (const hit of hits) {
|
|
51
|
+
let bucket = byType.get(hit.typeKey);
|
|
52
|
+
if (!bucket) {
|
|
53
|
+
bucket = [];
|
|
54
|
+
byType.set(hit.typeKey, bucket);
|
|
55
|
+
order.push(hit.typeKey);
|
|
56
|
+
}
|
|
57
|
+
bucket.push(hit);
|
|
58
|
+
}
|
|
59
|
+
return order.map((typeKey) => {
|
|
60
|
+
const bucket = byType.get(typeKey) ?? [];
|
|
61
|
+
const groupHits = bucket.slice(0, perGroup).map((h) => ({
|
|
62
|
+
/*
|
|
63
|
+
* The href IS the identity here. The artifact has no document id — it
|
|
64
|
+
* carries a slug, and two types can share a destination (a model
|
|
65
|
+
* composition and its category leaf both render `/categories/{s}`),
|
|
66
|
+
* which the matcher already dedupes on. Using the same key keeps the
|
|
67
|
+
* two consistent; inventing `${typeKey}:${slug}` would give the same
|
|
68
|
+
* row two identities depending on which layer you asked.
|
|
69
|
+
*/
|
|
70
|
+
id: h.href,
|
|
71
|
+
title: h.title,
|
|
72
|
+
href: h.href,
|
|
73
|
+
detail: h.detail || undefined,
|
|
74
|
+
}));
|
|
75
|
+
return {
|
|
76
|
+
key: typeKey,
|
|
77
|
+
label: opts.label(typeKey),
|
|
78
|
+
hits: groupHits,
|
|
79
|
+
truncated: false, // see the header — the count is exact, not a floor
|
|
80
|
+
moreHref: opts.moreHref(typeKey),
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/** Assemble the full result envelope the page component expects. */
|
|
85
|
+
export function toSearchResult(q, terms, hits, opts) {
|
|
86
|
+
const groups = toSearchGroups(hits, opts);
|
|
87
|
+
return {
|
|
88
|
+
q,
|
|
89
|
+
terms: [...terms],
|
|
90
|
+
groups,
|
|
91
|
+
/*
|
|
92
|
+
* The TOTAL matched, not the total shown. A page that says "24 results"
|
|
93
|
+
* and renders 12 because each group capped at 6 is lying in the direction
|
|
94
|
+
* that matters least; one that says "12" when 24 matched hides half the
|
|
95
|
+
* corpus from someone deciding whether to refine.
|
|
96
|
+
*/
|
|
97
|
+
totalHits: hits.length,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Count facet values across a result set.
|
|
102
|
+
*
|
|
103
|
+
* ## 🛑 This is the thing the server tier structurally cannot afford
|
|
104
|
+
*
|
|
105
|
+
* `BaseRepository.facetCounts` runs ONE aggregation query per facet value,
|
|
106
|
+
* each needing its own composite index, and on a missing index it logs and
|
|
107
|
+
* returns `undefined` so the facet "stays visible" with no count. Here it is
|
|
108
|
+
* a `reduce` over an array already in memory: zero queries, zero indexes, and
|
|
109
|
+
* a count that cannot silently fail.
|
|
110
|
+
*
|
|
111
|
+
* Counts are over the hits the CURRENT query produced, so ticking one facet
|
|
112
|
+
* and watching the others shrink is truthful rather than an approximation of
|
|
113
|
+
* the whole catalogue.
|
|
114
|
+
*/
|
|
115
|
+
export function countFacets(hits) {
|
|
116
|
+
const tally = new Map();
|
|
117
|
+
for (const hit of hits) {
|
|
118
|
+
if (!hit.facets)
|
|
119
|
+
continue;
|
|
120
|
+
for (const pair of hit.facets.split("|")) {
|
|
121
|
+
// Guard the shape rather than trusting it: a malformed pair is one
|
|
122
|
+
// record's problem, not a reason to drop the whole rail.
|
|
123
|
+
if (pair.indexOf(":") > 0)
|
|
124
|
+
tally.set(pair, (tally.get(pair) ?? 0) + 1);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const out = [];
|
|
128
|
+
for (const [pair, count] of tally) {
|
|
129
|
+
const i = pair.indexOf(":");
|
|
130
|
+
out.push({ key: pair.slice(0, i), value: pair.slice(i + 1), count });
|
|
131
|
+
}
|
|
132
|
+
// Commonest first within a key, then alphabetical — a rail ordered by raw
|
|
133
|
+
// string would bury the useful refinement below the rare ones.
|
|
134
|
+
out.sort((a, b) => a.key.localeCompare(b.key) || b.count - a.count || a.value.localeCompare(b.value));
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
/** Look up a type's `moreHref` from the artifact's own table. */
|
|
138
|
+
export function moreHrefResolver(artifact) {
|
|
139
|
+
const map = new Map(artifact.types.map((t) => [t.key, t.moreHref]));
|
|
140
|
+
return (typeKey) => map.get(typeKey) ?? "/";
|
|
141
|
+
}
|
package/dist/client.d.ts
CHANGED
|
@@ -41,6 +41,8 @@ export { Tabs, TabsList, TabsTrigger, TabsContent } from "./ui/components/Tabs";
|
|
|
41
41
|
export type { TabsProps, TabsListProps, TabsTriggerProps, TabsContentProps } from "./ui/components/Tabs";
|
|
42
42
|
export { TabBarShell, TabBarButton, TabsNavSelect } from "./ui/components/TabBarShell";
|
|
43
43
|
export type { TabBarShellProps, TabBarButtonProps, TabsNavSelectProps } from "./ui/components/TabBarShell";
|
|
44
|
+
export { OverflowRow } from "./ui/components/OverflowRow";
|
|
45
|
+
export type { OverflowRowProps, OverflowRowItem, OverflowRowDotTone, OverflowRowLinkProps } from "./ui/components/OverflowRow";
|
|
44
46
|
export { SellerProductsView } from "./features/seller/components/SellerProductsView";
|
|
45
47
|
export { SellerOrderDetailPanel } from "./features/seller/components/SellerOrdersView";
|
|
46
48
|
export { SellerPayoutDetailContent } from "./features/seller/components/SellerPayoutsView";
|
|
@@ -264,7 +266,7 @@ export { buildEventEntryDetailFields } from "./features/events/components/event-
|
|
|
264
266
|
export type { EntryFieldRow } from "./features/events/components/event-entry-detail-fields";
|
|
265
267
|
export type { BidDetailViewer } from "./features/auctions/components/bid-detail-fields";
|
|
266
268
|
export type { AuctionBidsTableProps, AuctionWithBids } from "./features/auctions/components/AuctionBidsTable";
|
|
267
|
-
export { ProtectedRoute,
|
|
269
|
+
export { ProtectedRoute, ForgotPasswordView, LoginForm, RegisterForm, ResetPasswordView, VerifyEmailView } from "./features/auth/index";
|
|
268
270
|
export type { AuthGuardUser, ForgotPasswordViewProps, LoginFormProps, LoginFormValues, RegisterFormProps, RegisterFormValues, ResetPasswordViewProps, VerifyEmailViewProps, } from "./features/auth/index";
|
|
269
271
|
export { useLogout, useLogin, useGoogleLogin, useLinkGoogleAccount, useRegister, useForgotPassword, useResetPassword, useVerifyEmail, useChangeEmail } from "./features/auth/index";
|
|
270
272
|
export type { LoginCredentials, RegisterData, ForgotPasswordData, ResetPasswordData, VerifyEmailData, ChangeEmailData } from "./features/auth/index";
|
|
@@ -284,17 +286,18 @@ export { AddressBook, AddressCard, AddressForm } from "./features/account/index"
|
|
|
284
286
|
export type { AddressCardAddress, AddressCardProps } from "./features/account/index";
|
|
285
287
|
export { useProfile, useUpdateProfile } from "./features/account/index";
|
|
286
288
|
export { updateProfileSchema } from "./features/account/index";
|
|
287
|
-
export { CategoryProductsView } from "./features/categories/index";
|
|
288
289
|
export type { CategoryItem } from "./features/categories/index";
|
|
289
290
|
export { MediaImage } from "./features/media/index";
|
|
290
291
|
export { StoreSidebar } from "./features/seller/components/SellerSidebar";
|
|
291
292
|
export type { StoreNavItem, StoreNavGroup } from "./features/seller/components/SellerSidebar";
|
|
292
293
|
export { StoreProductsView, StoreAboutView } from "./features/stores/index";
|
|
293
294
|
export type { StoreProductItem, StoreAboutViewProps, StoreDetail } from "./features/stores/index";
|
|
294
|
-
export {
|
|
295
|
-
export
|
|
296
|
-
export {
|
|
297
|
-
export type {
|
|
295
|
+
export { useSearchIndex, ensureSearchIndex } from "./features/search/hooks/useSearchIndex";
|
|
296
|
+
export { useSiteSearch } from "./features/search/hooks/useSiteSearch";
|
|
297
|
+
export { useScopedSearch, mergeSearchTiers } from "./features/search/hooks/useScopedSearch";
|
|
298
|
+
export type { UseScopedSearchResult } from "./features/search/hooks/useScopedSearch";
|
|
299
|
+
export type { UseSiteSearchOptions, UseSiteSearchResult } from "./features/search/hooks/useSiteSearch";
|
|
300
|
+
export type { SearchIndexState, SearchIndexStatus, LoadedSearchIndex, UseSearchIndexOptions, } from "./features/search/hooks/useSearchIndex";
|
|
298
301
|
export { AdSlot } from "./features/homepage/components/AdSlot";
|
|
299
302
|
export { useActiveAd } from "./features/homepage/hooks/useActiveAd";
|
|
300
303
|
export type { ActiveAdRecord, ActiveAdCreative } from "./features/homepage/hooks/useActiveAd";
|
|
@@ -370,8 +373,8 @@ export type { SellerPayoutSettingsViewProps, SellerShippingViewProps, SellerRevi
|
|
|
370
373
|
export { couponDraftToPayload } from "./features/seller/schemas/coupon-form";
|
|
371
374
|
export type { SellerCouponPayload } from "./features/seller/schemas/coupon-form";
|
|
372
375
|
export type { SellerAnalyticsSummary, SellerAnalyticsTopProduct } from "./features/seller/types/index";
|
|
373
|
-
export { UserAccountHubView, UserOrdersView, UserBidsView, OrderDetailView,
|
|
374
|
-
export type { UserAccountHubViewProps, UserAccountHubViewLabels, UserOrdersViewProps, OrderDetailViewProps, OrderDetailViewLabels,
|
|
376
|
+
export { UserAccountHubView, UserOrdersView, UserBidsView, OrderDetailView, UserReturnsView, useNotifications } from "./features/account/index";
|
|
377
|
+
export type { UserAccountHubViewProps, UserAccountHubViewLabels, UserOrdersViewProps, OrderDetailViewProps, OrderDetailViewLabels, UserReturnsViewProps } from "./features/account/index";
|
|
375
378
|
export { useOrders, useOrder, OrdersList } from "./features/orders/index";
|
|
376
379
|
export { OrderStatusTimeline } from "./features/orders/components/OrderStatusTimeline";
|
|
377
380
|
export type { OrderStatusTimelineProps } from "./features/orders/components/OrderStatusTimeline";
|
|
@@ -407,7 +410,7 @@ export type { TrackArgs as TrackHistoryArgs } from "./features/history/hooks/use
|
|
|
407
410
|
export { WISHLIST_MAX, HISTORY_MAX, CART_MAX_ITEMS, } from "./constants/limits";
|
|
408
411
|
export { normalizeListingType, isAuctionListing, isPreOrderListing, isStandardListing, isPrizeDrawListing, isClassifiedListing, isDigitalCodeListing, isLiveListing, isArtListing, isStickersListing, } from "./features/products/utils/listing-type";
|
|
409
412
|
export { isFinalSale, acceptsChangeOfMindReturns, } from "./features/products/constants/final-sale";
|
|
410
|
-
export { isListingTypeEnabled, isCategoryTypeEnabled, enabledListingTypes, enabledCategoryTypes, ALL_LISTING_TYPES, } from "./_internal/shared/listing-types/feature-flags";
|
|
413
|
+
export { isListingTypeEnabled, isCategoryTypeEnabled, enabledListingTypes, enabledCategoryTypes, ALL_LISTING_TYPES, isListingType, } from "./_internal/shared/listing-types/feature-flags";
|
|
411
414
|
export { actionTracker, setActionTrackerSink, resetActionTrackerSink, type ActionEvent, type ActionTrackerSink, } from "./_internal/shared/listing-types/action-tracker";
|
|
412
415
|
export { cartRequiresShipping, cartIsDigitalOnly, cartIsChatOnly, } from "./_internal/shared/listing-types/cart-shipping";
|
|
413
416
|
export { ACTIONS, action, act, canPerformAction, actionsForListingType, actionLabel, type ActionDef, type ActionKind, type ActionResource, type ActionTree, type ActionConfirmation, } from "./_internal/shared/actions/action-registry";
|
|
@@ -455,6 +458,8 @@ export { SellerArtView } from "./features/seller/components/SellerArtView";
|
|
|
455
458
|
export type { SellerArtViewProps } from "./features/seller/components/SellerArtView";
|
|
456
459
|
export { SellerStickersView } from "./features/seller/components/SellerStickersView";
|
|
457
460
|
export type { SellerStickersViewProps } from "./features/seller/components/SellerStickersView";
|
|
461
|
+
export { SellerSparesView } from "./features/seller/components/SellerSparesView";
|
|
462
|
+
export type { SellerSparesViewProps } from "./features/seller/components/SellerSparesView";
|
|
458
463
|
export { SellerDigitalCodesView } from "./features/seller/components/SellerDigitalCodesView";
|
|
459
464
|
export type { SellerDigitalCodesViewProps } from "./features/seller/components/SellerDigitalCodesView";
|
|
460
465
|
export { SellerLiveView } from "./features/seller/components/SellerLiveView";
|
|
@@ -500,6 +505,8 @@ export type { FAQCategory, FAQCategoryItem, FAQSortOption } from "./features/faq
|
|
|
500
505
|
export { CategoryInlineSelect } from "./features/seller/components/CategoryInlineSelect";
|
|
501
506
|
export { CategoryTemplatePicker, variantForCondition } from "./features/categories/components/CategoryTemplatePicker";
|
|
502
507
|
export type { CategoryTemplatePickerProps, CategoryTemplateApply } from "./features/categories/components/CategoryTemplatePicker";
|
|
508
|
+
export { PriceGuidanceHint } from "./features/categories/components/PriceGuidanceHint";
|
|
509
|
+
export type { PriceGuidanceHintProps } from "./features/categories/components/PriceGuidanceHint";
|
|
503
510
|
export { BrandInlineSelect } from "./features/seller/components/BrandInlineSelect";
|
|
504
511
|
export { API_ENDPOINTS } from "./constants/index";
|
|
505
512
|
export { SELLER_LISTING_TABS, type SellerListingTabId, } from "./features/products/constants/listing-tabs";
|
package/dist/client.js
CHANGED
|
@@ -60,6 +60,7 @@ export { Alert } from "./ui/components/Alert.js";
|
|
|
60
60
|
export { Divider } from "./ui/components/Divider.js";
|
|
61
61
|
export { Tabs, TabsList, TabsTrigger, TabsContent } from "./ui/components/Tabs.js";
|
|
62
62
|
export { TabBarShell, TabBarButton, TabsNavSelect } from "./ui/components/TabBarShell.js";
|
|
63
|
+
export { OverflowRow } from "./ui/components/OverflowRow.js";
|
|
63
64
|
export { SellerProductsView } from "./features/seller/components/SellerProductsView.js";
|
|
64
65
|
export { SellerOrderDetailPanel } from "./features/seller/components/SellerOrdersView.js";
|
|
65
66
|
export { SellerPayoutDetailContent } from "./features/seller/components/SellerPayoutsView.js";
|
|
@@ -310,7 +311,7 @@ export { buildBidDetailFields, bidStatusBadge } from "./features/auctions/compon
|
|
|
310
311
|
// Same reason, one feature over: the entry detail modal and its full page
|
|
311
312
|
// render from one builder rather than two lists that can drift.
|
|
312
313
|
export { buildEventEntryDetailFields } from "./features/events/components/event-entry-detail-fields.js";
|
|
313
|
-
export { ProtectedRoute,
|
|
314
|
+
export { ProtectedRoute, ForgotPasswordView, LoginForm, RegisterForm, ResetPasswordView, VerifyEmailView } from "./features/auth/index.js";
|
|
314
315
|
export { useLogout, useLogin, useGoogleLogin, useLinkGoogleAccount, useRegister, useForgotPassword, useResetPassword, useVerifyEmail, useChangeEmail } from "./features/auth/index.js";
|
|
315
316
|
export { CartView, CartItemRow, CartGroupLineRow, CartSummary, CartPriceBreakdown, CartDrawer, CheckoutView, CheckoutSuccessView, CheckoutAddressStep, useGuestCart, useCartCount, useAddToCart, useCart, useGuestCartMerge, useCartQuery } from "./features/cart/index.js";
|
|
316
317
|
export { StoreAddonsPicker, hasAnyStoreAddon } from "./features/cart/index.js";
|
|
@@ -323,12 +324,19 @@ export { useAddresses, useCreateAddress, useUpdateAddress, useDeleteAddress, use
|
|
|
323
324
|
export { AddressBook, AddressCard, AddressForm } from "./features/account/index.js";
|
|
324
325
|
export { useProfile, useUpdateProfile } from "./features/account/index.js";
|
|
325
326
|
export { updateProfileSchema } from "./features/account/index.js";
|
|
326
|
-
export { CategoryProductsView } from "./features/categories/index.js";
|
|
327
327
|
export { MediaImage } from "./features/media/index.js";
|
|
328
328
|
export { StoreSidebar } from "./features/seller/components/SellerSidebar.js";
|
|
329
329
|
export { StoreProductsView, StoreAboutView } from "./features/stores/index.js";
|
|
330
|
-
|
|
331
|
-
|
|
330
|
+
/*
|
|
331
|
+
* The browser-side search index. Exported from its DEFINING module rather
|
|
332
|
+
* than through `features/search/index` (Root Cause #18) — `ensureSearchIndex`
|
|
333
|
+
* is a module-scope singleton, and routing it through a barrel is how a
|
|
334
|
+
* second copy of that module ends up in the graph, at which point the "one
|
|
335
|
+
* fetch per page session" guarantee quietly becomes two.
|
|
336
|
+
*/
|
|
337
|
+
export { useSearchIndex, ensureSearchIndex } from "./features/search/hooks/useSearchIndex.js";
|
|
338
|
+
export { useSiteSearch } from "./features/search/hooks/useSiteSearch.js";
|
|
339
|
+
export { useScopedSearch, mergeSearchTiers } from "./features/search/hooks/useScopedSearch.js";
|
|
332
340
|
export { AdSlot } from "./features/homepage/components/AdSlot.js";
|
|
333
341
|
export { useActiveAd } from "./features/homepage/hooks/useActiveAd.js";
|
|
334
342
|
export { registerAdSlot, registerAdSlots, unregisterAdSlot, clearAdRegistry, setAdConsentGranted, isAdConsentGranted, isAdSlotRenderable, } from "./features/homepage/ad-registry.js";
|
|
@@ -385,7 +393,7 @@ export { SellerDashboardView as StoreDashboardView, SellerDashboardView, useSell
|
|
|
385
393
|
export { SellerPayoutSettingsView, SellerShippingView, SellerReviewsView, SellerPayoutRequestView, SellerAnalyticsStats, SellerTopProducts, SellerAnalyticsView, SellerPayoutsView, SellerCouponEditorView, SellerBidsView, SellerAddressesView, PrintCenterView, SellerOffersView, SellerGroupedListingsView, StoreGroupedListingsView, SellerAnalyticsAlertsView, StoreAnalyticsAlertsView, BarcodeField, FulfillmentView, SellerListingTypeView, SELLER_LISTING_TYPE_SPECS } from "./features/seller/components/index.js";
|
|
386
394
|
/* The draft → route conversion, so both coupon callsites share one rule. */
|
|
387
395
|
export { couponDraftToPayload } from "./features/seller/schemas/coupon-form.js";
|
|
388
|
-
export { UserAccountHubView, UserOrdersView, UserBidsView, OrderDetailView,
|
|
396
|
+
export { UserAccountHubView, UserOrdersView, UserBidsView, OrderDetailView, UserReturnsView, useNotifications } from "./features/account/index.js";
|
|
389
397
|
export { useOrders, useOrder, OrdersList } from "./features/orders/index.js";
|
|
390
398
|
export { OrderStatusTimeline } from "./features/orders/components/OrderStatusTimeline.js";
|
|
391
399
|
export { CountdownDisplay } from "./ui/components/CountdownDisplay.js";
|
|
@@ -415,7 +423,7 @@ export { normalizeListingType, isAuctionListing, isPreOrderListing, isStandardLi
|
|
|
415
423
|
// `finalSale` field. See the module docstring for why `!p.finalSale` is wrong.
|
|
416
424
|
export { isFinalSale, acceptsChangeOfMindReturns, } from "./features/products/constants/final-sale.js";
|
|
417
425
|
// SB-UNI-X4 2026-05-13 — per-type feature-flag helpers (client-safe).
|
|
418
|
-
export { isListingTypeEnabled, isCategoryTypeEnabled, enabledListingTypes, enabledCategoryTypes, ALL_LISTING_TYPES, } from "./_internal/shared/listing-types/feature-flags.js";
|
|
426
|
+
export { isListingTypeEnabled, isCategoryTypeEnabled, enabledListingTypes, enabledCategoryTypes, ALL_LISTING_TYPES, isListingType, } from "./_internal/shared/listing-types/feature-flags.js";
|
|
419
427
|
// SB-UNI-X5 2026-05-13 — action telemetry sink (client-safe; defaults to
|
|
420
428
|
// a no-op + console.debug in dev).
|
|
421
429
|
export { actionTracker, setActionTrackerSink, resetActionTrackerSink, } from "./_internal/shared/listing-types/action-tracker.js";
|
|
@@ -459,6 +467,7 @@ export { SellerBundlesView } from "./features/seller/components/SellerBundlesVie
|
|
|
459
467
|
export { SellerClassifiedView } from "./features/seller/components/SellerClassifiedView.js";
|
|
460
468
|
export { SellerArtView } from "./features/seller/components/SellerArtView.js";
|
|
461
469
|
export { SellerStickersView } from "./features/seller/components/SellerStickersView.js";
|
|
470
|
+
export { SellerSparesView } from "./features/seller/components/SellerSparesView.js";
|
|
462
471
|
export { SellerDigitalCodesView } from "./features/seller/components/SellerDigitalCodesView.js";
|
|
463
472
|
export { SellerLiveView } from "./features/seller/components/SellerLiveView.js";
|
|
464
473
|
// ── Central schema registry (W1) ──────────────────────────────────────────────
|
|
@@ -495,6 +504,7 @@ export { computeCodHandlingFee } from "./_internal/shared/fees/calculator.js"; /
|
|
|
495
504
|
export { FAQPageContent } from "./features/faq/index.js";
|
|
496
505
|
export { CategoryInlineSelect } from "./features/seller/components/CategoryInlineSelect.js";
|
|
497
506
|
export { CategoryTemplatePicker, variantForCondition } from "./features/categories/components/CategoryTemplatePicker.js";
|
|
507
|
+
export { PriceGuidanceHint } from "./features/categories/components/PriceGuidanceHint.js";
|
|
498
508
|
export { BrandInlineSelect } from "./features/seller/components/BrandInlineSelect.js";
|
|
499
509
|
export { API_ENDPOINTS } from "./constants/index.js";
|
|
500
510
|
// [CLIENT-SAFE] Pure, zero-import constant files — dashboard filter-tab
|
package/dist/configs/eslint.js
CHANGED
|
@@ -25,8 +25,28 @@
|
|
|
25
25
|
*/
|
|
26
26
|
const VARIANT_CATALOGUE_RULES = [
|
|
27
27
|
{
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
/*
|
|
29
|
+
* Hardcoded route strings — use ROUTES.* constants.
|
|
30
|
+
*
|
|
31
|
+
* 🛑 The `:not(Property[key.name="route"] > Literal)` is load-bearing, not
|
|
32
|
+
* tidying. `safeRead({ route: "/products", key, fallback })` takes a route
|
|
33
|
+
* as an OBSERVABILITY LABEL — it is the string that appears on a
|
|
34
|
+
* DEGRADED_READ row, never something anything navigates to. Flagging it
|
|
35
|
+
* asked for `ROUTES.PUBLIC.PRODUCTS` in a log field.
|
|
36
|
+
*
|
|
37
|
+
* Measured 2026-10-17 across appkit/src: this rule produced 741 warnings
|
|
38
|
+
* of which 23 were real — a 97% false-positive rate. 653 were tester-case
|
|
39
|
+
* hrefs that MUST be literals (see the file-scoped exemption in the
|
|
40
|
+
* consumer's eslint.config.mjs), 43 were inside route-map.ts itself, and
|
|
41
|
+
* 22 were these labels. A rule at that ratio is not a soft gate, it is
|
|
42
|
+
* noise that teaches people to scroll past the other 23.
|
|
43
|
+
*
|
|
44
|
+
* 🛑 The combinator is DESCENDANT, not child. `>` missed
|
|
45
|
+
* `route: verifiedOnly ? "/sellers" : "/stores"`, where the literal's
|
|
46
|
+
* parent is the ConditionalExpression and not the Property — so a label
|
|
47
|
+
* behind a ternary was still flagged while the plain one beside it was not.
|
|
48
|
+
*/
|
|
49
|
+
selector: 'Literal[value=/^\\/[a-z]+(\\?|#|$)/]:not(Property[key.name="route"] Literal)',
|
|
30
50
|
message: "Use ROUTES.* constants from @mohasinac/appkit instead of hardcoded route strings.",
|
|
31
51
|
},
|
|
32
52
|
{
|