@mohasinac/appkit 4.52.5 → 4.53.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp.json +4 -4
- package/dist/_internal/client/features/sticker-trace/canvas-codec.d.ts +2 -0
- package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
- package/dist/_internal/client/scaffolds/AppShell.js +1 -1
- package/dist/_internal/server/features/auctions/actions.js +1 -1
- package/dist/_internal/server/features/auctions/og.d.ts +3 -1
- package/dist/_internal/server/features/auctions/og.js +3 -1
- package/dist/_internal/server/features/bundles/actions.js +1 -1
- package/dist/_internal/server/features/business-documents/download.d.ts +41 -0
- package/dist/_internal/server/features/business-documents/download.js +91 -0
- package/dist/_internal/server/features/categories/adapters.d.ts +1 -1
- package/dist/_internal/server/features/categories/adapters.js +10 -0
- package/dist/_internal/server/features/categories/data.js +23 -7
- package/dist/_internal/server/features/checkout/actions.d.ts +14 -0
- package/dist/_internal/server/features/checkout/actions.js +116 -15
- package/dist/_internal/server/features/checkout/bundle-expansion.js +17 -0
- package/dist/_internal/server/features/checkout/data.d.ts +37 -0
- package/dist/_internal/server/features/checkout/data.js +20 -3
- package/dist/_internal/server/features/checkout/group-rule-revalidation.d.ts +34 -0
- package/dist/_internal/server/features/checkout/group-rule-revalidation.js +124 -0
- package/dist/_internal/server/features/checkout/supplier-identity.d.ts +55 -0
- package/dist/_internal/server/features/checkout/supplier-identity.js +81 -0
- package/dist/_internal/server/features/classified/metadata.js +1 -1
- package/dist/_internal/server/features/classified/og.d.ts +3 -1
- package/dist/_internal/server/features/classified/og.js +3 -1
- package/dist/_internal/server/features/digital-code/metadata.js +1 -1
- package/dist/_internal/server/features/digital-code/og.d.ts +3 -1
- package/dist/_internal/server/features/digital-code/og.js +3 -1
- package/dist/_internal/server/features/digital-code/pool.d.ts +19 -4
- package/dist/_internal/server/features/digital-code/pool.js +19 -4
- package/dist/_internal/server/features/live/metadata.js +1 -1
- package/dist/_internal/server/features/live/og.d.ts +3 -1
- package/dist/_internal/server/features/live/og.js +3 -1
- package/dist/_internal/server/features/lottery/actions.js +9 -1
- package/dist/_internal/server/features/lottery/og.d.ts +40 -0
- package/dist/_internal/server/features/lottery/og.js +79 -0
- package/dist/_internal/server/features/messages/actions.js +5 -1
- package/dist/_internal/server/features/offers/adapters.js +17 -3
- package/dist/_internal/server/features/orders/actions.js +7 -2
- package/dist/_internal/server/features/parts/og.js +1 -1
- package/dist/_internal/server/features/pre-orders/og.d.ts +3 -1
- package/dist/_internal/server/features/pre-orders/og.js +3 -1
- package/dist/_internal/server/features/price-index/search.d.ts +18 -0
- package/dist/_internal/server/features/price-index/search.js +47 -7
- package/dist/_internal/server/features/prize-draws/og.d.ts +3 -1
- package/dist/_internal/server/features/prize-draws/og.js +3 -1
- package/dist/_internal/server/features/products/group-members.d.ts +26 -0
- package/dist/_internal/server/features/products/group-members.js +7 -1
- package/dist/_internal/server/features/products/og.d.ts +3 -1
- package/dist/_internal/server/features/products/og.js +3 -1
- package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
- package/dist/_internal/server/features/raffle/actions.js +25 -0
- package/dist/_internal/server/features/reviews/actions.js +1 -1
- package/dist/_internal/server/features/reviews/data.d.ts +1 -1
- package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
- package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
- package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
- package/dist/_internal/server/features/search/index-build/build.js +285 -0
- package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
- package/dist/_internal/server/features/search/index-build/sources.js +385 -0
- package/dist/_internal/server/features/search/scoped-sources.d.ts +26 -0
- package/dist/_internal/server/features/search/scoped-sources.js +252 -0
- package/dist/_internal/server/features/search/search-everything.d.ts +57 -0
- package/dist/_internal/server/features/search/search-everything.js +70 -20
- package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
- package/dist/_internal/server/features/search/search-sources.js +142 -7
- package/dist/_internal/server/features/seo/robots.js +21 -1
- package/dist/_internal/server/features/seo/sitemap.js +7 -1
- package/dist/_internal/server/features/shared/listing-adapters.js +4 -2
- package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
- package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
- package/dist/_internal/server/features/site-settings/adapters.js +26 -0
- package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
- package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
- package/dist/_internal/server/features/sticker-trace/adapters.d.ts +91 -0
- package/dist/_internal/server/features/sticker-trace/adapters.js +175 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
- package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
- package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
- package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
- package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
- package/dist/_internal/server/features/sticker-trace/promote-to-listings.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/promote-to-listings.js +264 -0
- package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
- package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
- package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
- package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +143 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.js +311 -0
- package/dist/_internal/server/features/sticker-trace/storage.d.ts +154 -0
- package/dist/_internal/server/features/sticker-trace/storage.js +301 -0
- package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
- package/dist/_internal/server/features/stores/adapters.js +16 -0
- package/dist/_internal/server/features/stores/index.d.ts +1 -0
- package/dist/_internal/server/features/stores/index.js +1 -0
- package/dist/_internal/server/features/stores/tabs.d.ts +25 -0
- package/dist/_internal/server/features/stores/tabs.js +122 -0
- package/dist/_internal/server/functions/scheduled.d.ts +2 -1
- package/dist/_internal/server/functions/scheduled.js +25 -1
- package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
- package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
- package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
- package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
- package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
- package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
- package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
- package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
- package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
- package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
- package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
- package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
- package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
- package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
- package/dist/_internal/server/jobs/core/promotions.js +7 -4
- package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
- package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
- package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
- package/dist/_internal/server/jobs/handlers/index.js +1 -0
- package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
- package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
- package/dist/_internal/shared/actions/action-registry.js +29 -0
- package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
- package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
- package/dist/_internal/shared/checkout/rules/_defaults.js +0 -2
- package/dist/_internal/shared/checkout/rules/_limits.d.ts +14 -1
- package/dist/_internal/shared/checkout/rules/_limits.js +14 -1
- package/dist/_internal/shared/checkout/rules/_registry.js +2 -0
- package/dist/_internal/shared/checkout/rules/auction.rule.js +9 -1
- package/dist/_internal/shared/checkout/rules/bundle.rule.js +13 -0
- package/dist/_internal/shared/checkout/rules/index.d.ts +2 -0
- package/dist/_internal/shared/checkout/rules/index.js +9 -0
- package/dist/_internal/shared/checkout/rules/offer.rule.js +0 -1
- package/dist/_internal/shared/checkout/rules/payment-gate.d.ts +26 -0
- package/dist/_internal/shared/checkout/rules/payment-gate.js +133 -0
- package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +29 -8
- package/dist/_internal/shared/checkout/rules/spares.rule.d.ts +16 -0
- package/dist/_internal/shared/checkout/rules/spares.rule.js +5 -0
- package/dist/_internal/shared/checkout/rules/types.d.ts +26 -2
- package/dist/_internal/shared/config/schema.d.ts +122 -0
- package/dist/_internal/shared/features/cart/schema.js +3 -2
- package/dist/_internal/shared/features/events/config.d.ts +14 -0
- package/dist/_internal/shared/features/events/config.js +14 -0
- package/dist/_internal/shared/features/notifications/action-url.js +8 -0
- package/dist/_internal/shared/features/products/group-rules.d.ts +75 -0
- package/dist/_internal/shared/features/products/group-rules.js +142 -0
- package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
- package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
- package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
- package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
- package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
- package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
- package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
- package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +35 -0
- package/dist/_internal/shared/listing-types/_registry.js +39 -1
- package/dist/_internal/shared/listing-types/art/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/art/config.js +3 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/auction/config.js +3 -0
- package/dist/_internal/shared/listing-types/availability.js +48 -0
- package/dist/_internal/shared/listing-types/capabilities.js +19 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/classified/config.js +3 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +3 -0
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
- package/dist/_internal/shared/listing-types/feature-flags.js +10 -0
- package/dist/_internal/shared/listing-types/live/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/live/config.js +3 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +3 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +3 -0
- package/dist/_internal/shared/listing-types/spares/config.d.ts +74 -0
- package/dist/_internal/shared/listing-types/spares/config.js +60 -0
- package/dist/_internal/shared/listing-types/spares/ctas.d.ts +1 -0
- package/dist/_internal/shared/listing-types/spares/ctas.js +4 -0
- package/dist/_internal/shared/listing-types/spares/og.js +1 -0
- package/dist/_internal/shared/listing-types/spares/schema.d.ts +2 -0
- package/dist/_internal/shared/listing-types/spares/schema.js +3 -0
- package/dist/_internal/shared/listing-types/spares/seed-factory.d.ts +1 -0
- package/dist/_internal/shared/listing-types/spares/seed-factory.js +1 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/standard/config.js +3 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +3 -0
- package/dist/_internal/shared/media/limits.d.ts +12 -2
- package/dist/_internal/shared/media/limits.js +12 -2
- package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
- package/dist/_internal/shared/search/artifact-url.js +119 -0
- package/dist/_internal/shared/search/index-record.d.ts +68 -0
- package/dist/_internal/shared/search/index-record.js +96 -0
- package/dist/_internal/shared/search/match.d.ts +76 -0
- package/dist/_internal/shared/search/match.js +264 -0
- package/dist/_internal/shared/search/to-groups.d.ts +52 -0
- package/dist/_internal/shared/search/to-groups.js +141 -0
- package/dist/client.d.ts +16 -9
- package/dist/client.js +16 -6
- package/dist/configs/eslint.js +22 -2
- package/dist/constants/api-endpoints.d.ts +107 -15
- package/dist/constants/api-endpoints.js +60 -5
- package/dist/constants/cache-invalidation.js +3 -1
- package/dist/constants/field-names.d.ts +13 -1
- package/dist/constants/field-names.js +42 -1
- package/dist/contracts/repository.d.ts +8 -7
- package/dist/contracts/search.d.ts +2 -2
- package/dist/contracts/table.d.ts +3 -3
- package/dist/contracts/table.js +3 -3
- package/dist/core/contact-submissions.repository.js +2 -2
- package/dist/core/integration-keys.js +7 -1
- package/dist/core/newsletter.repository.js +2 -2
- package/dist/core/site-config.js +1 -1
- package/dist/errors/error-codes.d.ts +30 -0
- package/dist/errors/error-codes.js +30 -0
- package/dist/errors/error-display-map.js +40 -1
- package/dist/features/about/components/PolicyPageView.d.ts +22 -2
- package/dist/features/about/components/PolicyPageView.js +14 -2
- package/dist/features/about/components/PublicProfileView.js +2 -1
- package/dist/features/about/components/ShippingPolicyView.js +42 -2
- package/dist/features/account/api/[userId]/addresses/route.js +1 -1
- package/dist/features/account/components/NotificationBell.js +1 -1
- package/dist/features/account/components/UserBidsView.js +1 -1
- package/dist/features/account/components/index.d.ts +0 -8
- package/dist/features/account/components/index.js +0 -4
- package/dist/features/account/hooks/useProfileStats.js +5 -1
- package/dist/features/addresses/repository/addresses.repository.d.ts +33 -6
- package/dist/features/addresses/repository/addresses.repository.js +86 -9
- package/dist/features/addresses/schemas/firestore.d.ts +17 -6
- package/dist/features/admin/actions/admin-actions.js +16 -1
- package/dist/features/admin/actions/notification-actions.js +15 -6
- package/dist/features/admin/api/bids/route.js +1 -1
- package/dist/features/admin/api/coupons/route.js +1 -1
- package/dist/features/admin/api/products/route.js +1 -1
- package/dist/features/admin/api/reviews/route.js +1 -1
- package/dist/features/admin/components/AdminAdEditorView.js +19 -5
- package/dist/features/admin/components/AdminAuditLogView.js +1 -1
- package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
- package/dist/features/admin/components/AdminBlogView.js +1 -1
- package/dist/features/admin/components/AdminBrandsView.js +17 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +19 -3
- package/dist/features/admin/components/AdminContactView.js +1 -1
- package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
- package/dist/features/admin/components/AdminNavigationView.js +1 -1
- package/dist/features/admin/components/AdminNewsletterView.js +1 -1
- package/dist/features/admin/components/AdminOrdersView.js +9 -2
- package/dist/features/admin/components/AdminPageHeader.js +1 -1
- package/dist/features/admin/components/AdminPayoutsView.js +1 -1
- package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
- package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
- package/dist/features/admin/components/AdminProductEditorView.js +41 -39
- package/dist/features/admin/components/AdminProductsView.js +10 -3
- package/dist/features/admin/components/AdminScammersView.js +1 -1
- package/dist/features/admin/components/AdminSectionsView.js +21 -5
- package/dist/features/admin/components/AdminSessionsView.js +1 -1
- package/dist/features/admin/components/AdminSidebar.js +1 -1
- package/dist/features/admin/components/AdminSiteSettingsView.js +39 -8
- package/dist/features/admin/components/AdminSparesView.d.ts +12 -0
- package/dist/features/admin/components/AdminSparesView.js +30 -0
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
- package/dist/features/admin/components/AdminTeamView.js +1 -1
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
- package/dist/features/admin/components/AdminUsersView.js +10 -8
- package/dist/features/admin/components/DataListingView.d.ts +2 -1
- package/dist/features/admin/components/DataListingView.js +9 -4
- package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
- package/dist/features/admin/components/index.d.ts +2 -0
- package/dist/features/admin/components/index.js +1 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.js +7 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +3 -0
- package/dist/features/admin/constants/filter-tabs.js +1 -0
- package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
- package/dist/features/admin/repository/site-settings.repository.js +8 -3
- package/dist/features/admin/schemas/firestore.d.ts +88 -3
- package/dist/features/admin/schemas/firestore.js +32 -0
- package/dist/features/admin/types/index.d.ts +1 -1
- package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
- package/dist/features/auctions/actions/bid-actions.js +16 -4
- package/dist/features/auctions/api/route.js +1 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
- package/dist/features/auctions/components/AuctionDetailPageView.js +4 -11
- package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
- package/dist/features/auctions/repository/bid.repository.js +114 -13
- package/dist/features/auctions/schemas/firestore.d.ts +24 -4
- package/dist/features/auctions/schemas/firestore.js +1 -0
- package/dist/features/auth/actions/profile-actions.js +30 -4
- package/dist/features/auth/components/index.d.ts +0 -1
- package/dist/features/auth/components/index.js +0 -1
- package/dist/features/auth/repository/session.repository.d.ts +17 -3
- package/dist/features/auth/repository/session.repository.js +46 -5
- package/dist/features/auth/repository/token.repository.d.ts +27 -4
- package/dist/features/auth/repository/token.repository.js +65 -11
- package/dist/features/auth/repository/user.repository.d.ts +46 -7
- package/dist/features/auth/repository/user.repository.js +128 -15
- package/dist/features/auth/schemas/firestore.d.ts +65 -12
- package/dist/features/auth/schemas/firestore.js +13 -0
- package/dist/features/before-after/api/route.js +1 -1
- package/dist/features/blog/components/BlogListView.js +16 -3
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/blog/schemas/index.d.ts +2 -2
- package/dist/features/business-documents/repository/business-documents.repository.d.ts +58 -0
- package/dist/features/business-documents/repository/business-documents.repository.js +54 -0
- package/dist/features/business-documents/schemas/firestore.d.ts +105 -0
- package/dist/features/business-documents/schemas/firestore.js +75 -0
- package/dist/features/cart/actions/cart-actions.js +83 -6
- package/dist/features/cart/api/route.js +1 -1
- package/dist/features/cart/repository/cart.repository.js +32 -4
- package/dist/features/cart/schemas/firestore.d.ts +20 -0
- package/dist/features/cart/schemas/index.d.ts +2 -2
- package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +1 -1
- package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
- package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
- package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
- package/dist/features/categories/api/[id]/price-guidance/route.d.ts +42 -0
- package/dist/features/categories/api/[id]/price-guidance/route.js +113 -0
- package/dist/features/categories/api/route.js +10 -10
- package/dist/features/categories/components/BrandDetailPageView.js +19 -3
- package/dist/features/categories/components/BrandDetailTabs.js +10 -0
- package/dist/features/categories/components/CategoriesIndexListing.js +23 -8
- package/dist/features/categories/components/CategoryDetailPageView.js +170 -13
- package/dist/features/categories/components/CategoryDetailTabs.js +12 -0
- package/dist/features/categories/components/CategoryGrid.js +10 -1
- package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
- package/dist/features/categories/components/PriceGuidanceHint.d.ts +29 -0
- package/dist/features/categories/components/PriceGuidanceHint.js +61 -0
- package/dist/features/categories/components/SubcategoryCardRow.d.ts +27 -0
- package/dist/features/categories/components/SubcategoryCardRow.js +98 -0
- package/dist/features/categories/components/index.d.ts +0 -2
- package/dist/features/categories/components/index.js +0 -1
- package/dist/features/categories/constants/category-tabs.d.ts +20 -25
- package/dist/features/categories/constants/category-tabs.js +22 -39
- package/dist/features/categories/repository/categories.repository.d.ts +13 -0
- package/dist/features/categories/repository/categories.repository.js +51 -1
- package/dist/features/categories/schemas/firestore.d.ts +22 -1
- package/dist/features/categories/schemas/firestore.js +10 -0
- package/dist/features/categories/schemas/index.d.ts +8 -2
- package/dist/features/categories/schemas/index.js +2 -0
- package/dist/features/categories/types/index.d.ts +8 -0
- package/dist/features/categories/utils/taxonomy-visual.d.ts +34 -0
- package/dist/features/categories/utils/taxonomy-visual.js +74 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
- package/dist/features/classified/components/ClassifiedDetailPageView.js +4 -9
- package/dist/features/collections/api/[slug]/route.js +3 -3
- package/dist/features/collections/api/route.js +1 -1
- package/dist/features/consultation/api/route.js +1 -1
- package/dist/features/consultation/repository/consultations.repository.js +1 -1
- package/dist/features/consultation/types/index.d.ts +1 -1
- package/dist/features/contact/components/ContactForm.js +1 -3
- package/dist/features/contact/components/ContactPageView.d.ts +33 -1
- package/dist/features/contact/components/ContactPageView.js +58 -28
- package/dist/features/corporate/api/route.js +1 -1
- package/dist/features/corporate/repository/corporate.repository.js +1 -1
- package/dist/features/corporate/types/index.d.ts +1 -1
- package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
- package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
- package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -9
- package/dist/features/events/actions/event-actions.d.ts +14 -0
- package/dist/features/events/actions/event-actions.js +82 -3
- package/dist/features/events/api/[id]/route.js +2 -2
- package/dist/features/events/components/AdminEventEditorView.js +22 -3
- package/dist/features/events/components/AdminEventsView.js +32 -8
- package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
- package/dist/features/events/components/EventRafflesSection.js +52 -3
- package/dist/features/events/components/SpinWheelView.d.ts +2 -2
- package/dist/features/events/components/SpinWheelView.js +41 -4
- package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
- package/dist/features/events/repository/event-entry.repository.js +41 -7
- package/dist/features/events/schemas/firestore.d.ts +17 -4
- package/dist/features/events/types/index.d.ts +37 -0
- package/dist/features/faq/repository/faqs.repository.js +1 -1
- package/dist/features/faq/schemas/index.d.ts +5 -2
- package/dist/features/faq/schemas/index.js +6 -0
- package/dist/features/faq/types/index.d.ts +0 -1
- package/dist/features/grouped/components/GroupedListingDetailView.js +9 -1
- package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
- package/dist/features/grouped/schemas/firestore.d.ts +5 -0
- package/dist/features/homepage/actions/homepage-section-actions.d.ts +3 -3
- package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
- package/dist/features/homepage/api/carousel/route.js +4 -4
- package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
- package/dist/features/homepage/components/AnnouncementBar.js +13 -19
- package/dist/features/homepage/components/CollectionCardsSection.d.ts +28 -6
- package/dist/features/homepage/components/CollectionCardsSection.js +43 -8
- package/dist/features/homepage/components/HowItWorksSection.d.ts +23 -6
- package/dist/features/homepage/components/HowItWorksSection.js +4 -4
- package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
- package/dist/features/homepage/components/PromoGrid.d.ts +31 -2
- package/dist/features/homepage/components/PromoGrid.js +12 -3
- package/dist/features/homepage/components/TestimonialsCarousel.d.ts +34 -2
- package/dist/features/homepage/components/TestimonialsCarousel.js +1 -1
- package/dist/features/homepage/components/index.d.ts +0 -22
- package/dist/features/homepage/components/index.js +0 -12
- package/dist/features/homepage/index.d.ts +0 -2
- package/dist/features/homepage/index.js +0 -2
- package/dist/features/homepage/lib/section-renderer.d.ts +9 -0
- package/dist/features/homepage/lib/section-renderer.js +202 -58
- package/dist/features/homepage/repository/homepage-sections.repository.d.ts +35 -3
- package/dist/features/homepage/repository/homepage-sections.repository.js +58 -8
- package/dist/features/homepage/schemas/firestore.d.ts +112 -3
- package/dist/features/homepage/schemas/firestore.js +32 -2
- package/dist/features/homepage/schemas/index.d.ts +46 -17
- package/dist/features/homepage/schemas/index.js +39 -27
- package/dist/features/homepage/server.d.ts +0 -3
- package/dist/features/homepage/server.js +0 -3
- package/dist/features/homepage/types/index.d.ts +0 -47
- package/dist/features/homepage/types/index.js +49 -0
- package/dist/features/layout/AppLayoutShell.d.ts +11 -0
- package/dist/features/layout/AppLayoutShell.js +65 -13
- package/dist/features/layout/BottomActionsContext.d.ts +16 -0
- package/dist/features/layout/BottomActionsContext.js +5 -0
- package/dist/features/layout/BottomChrome.js +48 -9
- package/dist/features/layout/BottomNavItem.js +1 -1
- package/dist/features/layout/BottomNavbar.d.ts +14 -0
- package/dist/features/layout/BottomNavbar.js +43 -3
- package/dist/features/layout/BottomSheet.js +1 -1
- package/dist/features/layout/MainNavbar.d.ts +11 -0
- package/dist/features/layout/NavbarLayout.d.ts +3 -0
- package/dist/features/layout/NavbarLayout.js +88 -11
- package/dist/features/layout/SideActionDock.d.ts +1 -0
- package/dist/features/layout/SideActionDock.js +219 -0
- package/dist/features/layout/TitleBarLayout.js +1 -1
- package/dist/features/layout/cta-anchor.d.ts +31 -0
- package/dist/features/layout/cta-anchor.js +31 -0
- package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
- package/dist/features/layout/hooks/useBottomActions.js +6 -1
- package/dist/features/layout/index.d.ts +9 -1
- package/dist/features/layout/index.js +9 -1
- package/dist/features/layout/useCtaReveal.d.ts +24 -0
- package/dist/features/layout/useCtaReveal.js +82 -0
- package/dist/features/layout/useHoldToOpen.d.ts +41 -0
- package/dist/features/layout/useHoldToOpen.js +84 -0
- package/dist/features/live/components/LiveItemDetailPageView.js +4 -9
- package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
- package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
- package/dist/features/lottery/schemas/firestore.d.ts +33 -5
- package/dist/features/loyalty/api/balance/route.js +1 -1
- package/dist/features/loyalty/api/history/route.js +1 -1
- package/dist/features/media/MediaImage.js +0 -1
- package/dist/features/media/MediaPickerModal.js +7 -1
- package/dist/features/media/hooks/useMedia.js +17 -0
- package/dist/features/media/modals/ImageEditor.js +5 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
- package/dist/features/media/repository/media-assets.repository.d.ts +65 -0
- package/dist/features/media/repository/media-assets.repository.js +31 -0
- package/dist/features/media/trust-signals.d.ts +85 -0
- package/dist/features/media/trust-signals.js +126 -0
- package/dist/features/media/upload/CameraCapture.js +16 -1
- package/dist/features/media/upload/ImageUpload.js +42 -4
- package/dist/features/media/upload/MediaUploadField.js +69 -13
- package/dist/features/media/upload/downscale-image.d.ts +56 -0
- package/dist/features/media/upload/downscale-image.js +150 -0
- package/dist/features/messages/components/ConversationThreadView.js +45 -2
- package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
- package/dist/features/messages/components/MessageSellerButton.js +10 -2
- package/dist/features/messages/schemas/firestore.d.ts +15 -0
- package/dist/features/orders/hooks/useOrders.js +4 -2
- package/dist/features/orders/repository/orders.repository.d.ts +15 -4
- package/dist/features/orders/repository/orders.repository.js +52 -20
- package/dist/features/orders/schemas/firestore.d.ts +15 -4
- package/dist/features/orders/schemas/index.d.ts +8 -8
- package/dist/features/orders/types/index.d.ts +2 -2
- package/dist/features/parts/components/PartDetailPageView.d.ts +14 -1
- package/dist/features/parts/components/PartDetailPageView.js +2 -2
- package/dist/features/parts/components/PartsIndexPageView.d.ts +11 -2
- package/dist/features/parts/components/PartsIndexPageView.js +2 -2
- package/dist/features/parts/components/PartsSearchBox.d.ts +9 -0
- package/dist/features/parts/components/PartsSearchBox.js +57 -0
- package/dist/features/parts/schemas/firestore.d.ts +149 -3
- package/dist/features/parts/schemas/firestore.js +184 -0
- package/dist/features/payments/repository/payments.repository.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +38 -6
- package/dist/features/payments/repository/payout.repository.js +84 -23
- package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
- package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
- package/dist/features/payments/schemas/firestore.d.ts +14 -3
- package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
- package/dist/features/pre-orders/api/[slug]/route.js +1 -1
- package/dist/features/pre-orders/api/admin/route.js +1 -1
- package/dist/features/pre-orders/api/route.js +1 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -11
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
- package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
- package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
- package/dist/features/price-index/components/PriceIndexToolView.d.ts +3 -1
- package/dist/features/price-index/components/PriceIndexToolView.js +92 -13
- package/dist/features/products/api/[id]/route.js +1 -1
- package/dist/features/products/components/CompareOverlay.d.ts +18 -1
- package/dist/features/products/components/CompareOverlay.js +21 -2
- package/dist/features/products/components/CustomSectionTabContent.d.ts +31 -0
- package/dist/features/products/components/CustomSectionTabContent.js +29 -3
- package/dist/features/products/components/GroupMemberPicker.d.ts +19 -1
- package/dist/features/products/components/GroupMemberPicker.js +46 -8
- package/dist/features/products/components/GroupSettingsPanel.d.ts +11 -1
- package/dist/features/products/components/GroupSettingsPanel.js +91 -3
- package/dist/features/products/components/ListingBottomActions.js +4 -0
- package/dist/features/products/components/PrizeDrawDetailPageView.js +1 -1
- package/dist/features/products/components/PrizeDrawEntryActions.d.ts +15 -1
- package/dist/features/products/components/PrizeDrawEntryActions.js +70 -8
- package/dist/features/products/components/ProductDetailPageView.js +75 -15
- package/dist/features/products/components/ProductForm.d.ts +13 -1
- package/dist/features/products/components/ProductForm.js +16 -2
- package/dist/features/products/components/ProductGalleryClient.js +2 -2
- package/dist/features/products/components/ProductGrid.js +12 -1
- package/dist/features/products/components/ProductsIndexListing.d.ts +16 -1
- package/dist/features/products/components/ProductsIndexListing.js +3 -3
- package/dist/features/products/components/ShowGroupSection.js +15 -2
- package/dist/features/products/components/SparesListView.d.ts +7 -0
- package/dist/features/products/components/SparesListView.js +39 -0
- package/dist/features/products/components/index.d.ts +0 -2
- package/dist/features/products/components/index.js +0 -1
- package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
- package/dist/features/products/config/listing-type-listing-config.js +27 -2
- package/dist/features/products/constants/action-defs.d.ts +1 -0
- package/dist/features/products/constants/action-defs.js +1 -0
- package/dist/features/products/constants/listing-tabs.d.ts +9 -0
- package/dist/features/products/constants/listing-tabs.js +3 -2
- package/dist/features/products/hooks/useProducts.js +2 -2
- package/dist/features/products/repository/products.repository.d.ts +98 -0
- package/dist/features/products/repository/products.repository.js +248 -18
- package/dist/features/products/schemas/firestore.d.ts +97 -4
- package/dist/features/products/schemas/firestore.js +104 -0
- package/dist/features/products/schemas/index.d.ts +12 -21
- package/dist/features/products/schemas/index.js +23 -6
- package/dist/features/products/types/index.d.ts +46 -2
- package/dist/features/products/utils/group-member-image.d.ts +39 -0
- package/dist/features/products/utils/group-member-image.js +3 -0
- package/dist/features/products/utils/listing-badge-variant.js +4 -0
- package/dist/features/promotions/api/route.js +1 -1
- package/dist/features/reviews/actions/review-actions.d.ts +6 -6
- package/dist/features/reviews/actions/review-actions.js +22 -8
- package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
- package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
- package/dist/features/reviews/components/ReviewsList.js +1 -1
- package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
- package/dist/features/reviews/repository/reviews.repository.js +63 -12
- package/dist/features/reviews/schemas/firestore.d.ts +13 -2
- package/dist/features/reviews/schemas/index.d.ts +2 -2
- package/dist/features/scams/actions/scam-actions.js +16 -4
- package/dist/features/scams/components/ScamProfileView.js +1 -1
- package/dist/features/search/components/EntityTypeahead.d.ts +44 -0
- package/dist/features/search/components/EntityTypeahead.js +92 -0
- package/dist/features/search/components/Search.d.ts +12 -1
- package/dist/features/search/components/Search.js +47 -3
- package/dist/features/search/components/SearchFacetRail.d.ts +11 -0
- package/dist/features/search/components/SearchFacetRail.js +92 -0
- package/dist/features/search/components/SearchResultsClient.d.ts +33 -0
- package/dist/features/search/components/SearchResultsClient.js +103 -0
- package/dist/features/search/components/SearchResultsPageView.d.ts +15 -1
- package/dist/features/search/components/SearchResultsPageView.js +3 -2
- package/dist/features/search/components/index.d.ts +0 -6
- package/dist/features/search/components/index.js +0 -3
- package/dist/features/search/hooks/useNavSuggestions.d.ts +13 -0
- package/dist/features/search/hooks/useScopedSearch.d.ts +34 -0
- package/dist/features/search/hooks/useScopedSearch.js +114 -0
- package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
- package/dist/features/search/hooks/useSearchIndex.js +172 -0
- package/dist/features/search/hooks/useSiteSearch.d.ts +26 -0
- package/dist/features/search/hooks/useSiteSearch.js +149 -0
- package/dist/features/search/index.d.ts +0 -4
- package/dist/features/search/index.js +0 -4
- package/dist/features/search/manifest.d.ts +12 -0
- package/dist/features/search/manifest.js +17 -2
- package/dist/features/search/server.d.ts +0 -3
- package/dist/features/search/server.js +0 -3
- package/dist/features/seller/actions/offer-actions.d.ts +5 -5
- package/dist/features/seller/actions/offer-actions.js +38 -8
- package/dist/features/seller/actions/seller-actions.js +34 -7
- package/dist/features/seller/api/coupons/route.js +1 -1
- package/dist/features/seller/api/products/route.js +1 -1
- package/dist/features/seller/api/store/route.js +1 -1
- package/dist/features/seller/components/SellerBidsView.js +1 -1
- package/dist/features/seller/components/SellerCouponsView.js +1 -1
- package/dist/features/seller/components/SellerListingTypeView.d.ts +1 -1
- package/dist/features/seller/components/SellerListingTypeView.js +29 -1
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutSettingsView.js +35 -15
- package/dist/features/seller/components/SellerPayoutsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.d.ts +1 -1
- package/dist/features/seller/components/SellerProductShell.js +2 -2
- package/dist/features/seller/components/SellerProductsView.js +1 -1
- package/dist/features/seller/components/SellerShippingView.js +0 -1
- package/dist/features/seller/components/SellerSidebar.js +1 -1
- package/dist/features/seller/components/SellerSparesView.d.ts +17 -0
- package/dist/features/seller/components/SellerSparesView.js +6 -0
- package/dist/features/seller/components/SellerStorefrontView.js +0 -1
- package/dist/features/seller/components/index.d.ts +2 -4
- package/dist/features/seller/components/index.js +1 -2
- package/dist/features/seller/repository/offer.repository.d.ts +15 -3
- package/dist/features/seller/repository/offer.repository.js +43 -7
- package/dist/features/seller/schemas/firestore.d.ts +14 -3
- package/dist/features/seller/schemas/index.d.ts +4 -4
- package/dist/features/seller/schemas/order-forms.d.ts +39 -0
- package/dist/features/seller/schemas/order-forms.js +37 -0
- package/dist/features/shell/CommandPalette.js +1 -1
- package/dist/features/shell/FormShell.js +6 -2
- package/dist/features/shell/QuickFormDrawer.js +15 -1
- package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
- package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
- package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
- package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
- package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
- package/dist/features/sticker-trace/constants/help-content.js +172 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
- package/dist/features/sticker-trace/schemas/firestore.d.ts +267 -0
- package/dist/features/sticker-trace/schemas/firestore.js +79 -0
- package/dist/features/sticker-trace/server.d.ts +8 -0
- package/dist/features/sticker-trace/server.js +51 -0
- package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
- package/dist/features/stores/actions/store-query-actions.js +7 -2
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/route.js +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.js +7 -82
- package/dist/features/stores/components/StoreHeader.js +1 -2
- package/dist/features/stores/components/StoreNavTabs.js +17 -2
- package/dist/features/stores/components/StoreSparesPageView.d.ts +27 -0
- package/dist/features/stores/components/StoreSparesPageView.js +48 -0
- package/dist/features/stores/manifest.js +8 -4
- package/dist/features/stores/schemas/firestore.d.ts +19 -0
- package/dist/features/support/repository/support.repository.d.ts +14 -3
- package/dist/features/support/repository/support.repository.js +93 -13
- package/dist/features/support/schemas/firestore.d.ts +16 -5
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +96 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +4 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +478 -0
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +54 -32
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +3 -2
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +73 -0
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +340 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
- package/dist/features/tester/seed-data/authored/index.js +24 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +1 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +57 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +77 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +58 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +284 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +558 -34
- package/dist/index.d.ts +27 -80
- package/dist/index.js +62 -115
- package/dist/next/api/routeHandler.js +9 -0
- package/dist/next/routing/require-record.d.ts +13 -0
- package/dist/next/routing/require-record.js +62 -0
- package/dist/next/routing/route-map.d.ts +46 -5
- package/dist/next/routing/route-map.js +70 -3
- package/dist/providers/db-firebase/base.d.ts +4 -2
- package/dist/providers/db-firebase/base.js +21 -5
- package/dist/providers/db-firebase/base.repository.d.ts +33 -9
- package/dist/providers/db-firebase/base.repository.js +55 -0
- package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
- package/dist/providers/db-firebase/rtdb-paths.js +12 -0
- package/dist/react/ErrorBoundary.js +6 -1
- package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
- package/dist/react/hooks/realtime-event-constants.js +8 -0
- package/dist/react/hooks/useEntityDelete.js +5 -1
- package/dist/react/hooks/useMessage.js +5 -1
- package/dist/repositories/index.d.ts +2 -2
- package/dist/repositories/index.js +6 -1
- package/dist/schemas/registry.d.ts +28 -26
- package/dist/schemas/registry.js +31 -14
- package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
- package/dist/security/blind-index-tokens.d.ts +54 -0
- package/dist/security/blind-index-tokens.js +152 -0
- package/dist/security/encrypted.d.ts +117 -0
- package/dist/security/encrypted.js +100 -0
- package/dist/security/index.d.ts +6 -3
- package/dist/security/index.js +17 -3
- package/dist/security/pii-accessors.d.ts +71 -0
- package/dist/security/pii-accessors.js +150 -0
- package/dist/security/pii-encrypt.d.ts +0 -8
- package/dist/security/pii-encrypt.js +22 -15
- package/dist/security/pii-mask.d.ts +18 -0
- package/dist/security/pii-mask.js +27 -0
- package/dist/security/settings-encryption.d.ts +35 -0
- package/dist/security/settings-encryption.js +91 -0
- package/dist/seed/_helpers/brand-rows.js +38 -14
- package/dist/seed/_helpers/category-forest.js +73 -7
- package/dist/seed/_helpers/category-images-generated.d.ts +25 -6
- package/dist/seed/_helpers/category-images-generated.js +81 -6
- package/dist/seed/_helpers/category-models.d.ts +1 -1
- package/dist/seed/_helpers/category-models.js +7 -1
- package/dist/seed/_helpers/category-parts-glossary-map.js +8 -0
- package/dist/seed/_helpers/category-parts.d.ts +1 -1
- package/dist/seed/_helpers/category-parts.js +50 -2
- package/dist/seed/_helpers/character-features.d.ts +1 -1
- package/dist/seed/_helpers/character-features.js +2 -1
- package/dist/seed/_helpers/franchise-rows.js +10 -2
- package/dist/seed/_helpers/media.d.ts +47 -0
- package/dist/seed/_helpers/media.js +34 -0
- package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
- package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
- package/dist/seed/addresses-seed-data.d.ts +2 -2
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +78 -0
- package/dist/seed/authenticity-knowledge-seed-data.js +10729 -0
- package/dist/seed/bids-seed-data.d.ts +2 -2
- package/dist/seed/bids-seed-data.js +23 -2
- package/dist/seed/categories-seed-data.js +124 -20
- package/dist/seed/events-seed-data.d.ts +2 -2
- package/dist/seed/events-seed-data.js +5 -0
- package/dist/seed/faq-seed-data.js +175 -5
- package/dist/seed/grouped-listings-seed-data.js +16 -0
- package/dist/seed/homepage-sections-seed-data.js +131 -26
- package/dist/seed/index.d.ts +3 -3
- package/dist/seed/index.js +3 -2
- package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
- package/dist/seed/manifest.js +3 -0
- package/dist/seed/media-assets-seed-data.d.ts +1 -1
- package/dist/seed/media-assets-seed-data.js +746 -196
- package/dist/seed/model-composition-seed-data.js +122 -6
- package/dist/seed/offers-seed-data.d.ts +2 -2
- package/dist/seed/offers-seed-data.js +1 -1
- package/dist/seed/orders-seed-data.d.ts +2 -2
- package/dist/seed/part-glossary-seed-data.d.ts +1 -1
- package/dist/seed/part-glossary-seed-data.js +37219 -463
- package/dist/seed/payouts-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.js +1 -1
- package/dist/seed/products-art-seed-data.js +7 -18
- package/dist/seed/products-auctions-seed-data.js +56 -47
- package/dist/seed/products-beyblade-x-seed-data.d.ts +2 -0
- package/dist/seed/products-beyblade-x-seed-data.js +441 -0
- package/dist/seed/products-catalogue-seed-data.d.ts +5 -5
- package/dist/seed/products-catalogue-seed-data.js +1500 -1240
- package/dist/seed/products-classifieds-seed-data.js +9 -27
- package/dist/seed/products-digital-codes-seed-data.js +9 -18
- package/dist/seed/products-live-items-seed-data.js +5 -13
- package/dist/seed/products-preorders-seed-data.js +67 -33
- package/dist/seed/products-prize-draws-seed-data.js +8 -17
- package/dist/seed/products-spares-seed-data.d.ts +2 -0
- package/dist/seed/products-spares-seed-data.js +368 -0
- package/dist/seed/products-standard-seed-data.js +39 -126
- package/dist/seed/products-stickers-seed-data.js +59 -15
- package/dist/seed/reviews-seed-data.d.ts +1 -2
- package/dist/seed/seed-purpose.js +7 -0
- package/dist/seed/sessions-seed-data.d.ts +2 -2
- package/dist/seed/sessions-seed-data.js +5 -0
- package/dist/seed/site-settings-seed-data.js +9 -1
- package/dist/seed/support-tickets-seed-data.d.ts +2 -2
- package/dist/seed/support-tickets-seed-data.js +1 -1
- package/dist/seed/users-seed-data.d.ts +2 -2
- package/dist/seed/users-seed-data.js +1 -1
- package/dist/seo/json-ld.d.ts +25 -0
- package/dist/seo/json-ld.js +33 -1
- package/dist/server-entry.d.ts +3 -1
- package/dist/server-entry.js +2 -2
- package/dist/server.d.ts +27 -12
- package/dist/server.js +86 -28
- package/dist/styles.css +438 -1
- package/dist/tailwind-input.css +31 -17
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Accordion.js +1 -1
- package/dist/ui/components/Breadcrumb.js +1 -1
- package/dist/ui/components/Button.js +7 -1
- package/dist/ui/components/DetailPageGallery.js +0 -2
- package/dist/ui/components/DetailPageHero.js +0 -1
- package/dist/ui/components/DetailPageTabs.js +1 -1
- package/dist/ui/components/Divider.js +3 -3
- package/dist/ui/components/FilterChipGroup.d.ts +11 -0
- package/dist/ui/components/FilterChipGroup.js +1 -1
- package/dist/ui/components/GatedPrice.js +5 -1
- package/dist/ui/components/HorizontalScroller.js +1 -1
- package/dist/ui/components/ImageGallery.js +6 -1
- package/dist/ui/components/ListingLayout.js +17 -11
- package/dist/ui/components/MediaTabs.style.css +81 -0
- package/dist/ui/components/OverflowRow.d.ts +92 -0
- package/dist/ui/components/OverflowRow.js +203 -0
- package/dist/ui/components/OverflowRow.style.css +235 -0
- package/dist/ui/components/Pagination.js +1 -1
- package/dist/ui/components/PendingValue.d.ts +45 -0
- package/dist/ui/components/PendingValue.js +7 -0
- package/dist/ui/components/Radio.style.css +119 -0
- package/dist/ui/components/RatingDisplay.js +2 -2
- package/dist/ui/components/RecordDetailModal.js +14 -1
- package/dist/ui/components/RowActionMenu.js +5 -1
- package/dist/ui/components/SettingsSection.js +0 -2
- package/dist/ui/components/SideDrawer.js +5 -1
- package/dist/ui/components/SideModal.js +9 -1
- package/dist/ui/components/SiteLogo.js +3 -0
- package/dist/ui/components/SiteMark.js +3 -0
- package/dist/ui/components/SortDropdown.js +1 -1
- package/dist/ui/components/SpecTable.d.ts +58 -0
- package/dist/ui/components/SpecTable.js +8 -0
- package/dist/ui/components/StarRating.js +1 -3
- package/dist/ui/components/SummaryCard.js +1 -1
- package/dist/ui/components/TabBarShell.d.ts +12 -1
- package/dist/ui/components/TabBarShell.js +3 -2
- package/dist/ui/components/Tabs.js +36 -24
- package/dist/ui/components/Toast.d.ts +3 -24
- package/dist/ui/components/Toast.js +2 -19
- package/dist/ui/components/TopBannerPortal.d.ts +15 -0
- package/dist/ui/components/TopBannerPortal.js +19 -0
- package/dist/ui/components/UnsavedChangesModal.js +5 -1
- package/dist/ui/components/index.style.css +2 -0
- package/dist/ui/components/row-collapse.d.ts +15 -0
- package/dist/ui/components/row-collapse.js +127 -0
- package/dist/ui/components/toast-context.d.ts +63 -0
- package/dist/ui/components/toast-context.js +48 -0
- package/dist/ui/components/top-banner-slot.d.ts +37 -0
- package/dist/ui/components/top-banner-slot.js +45 -0
- package/dist/ui/icons/icon-registry.d.ts +7 -0
- package/dist/ui/icons/icon-registry.js +25 -1
- package/dist/ui/index.d.ts +6 -0
- package/dist/ui/index.js +3 -0
- package/dist/utils/array.helper.d.ts +2 -2
- package/dist/utils/array.helper.js +5 -5
- package/dist/utils/id-generators.d.ts +6 -0
- package/dist/utils/id-generators.js +10 -0
- package/dist/utils/media-url.js +0 -2
- package/dist/utils/search-txt-builders.d.ts +28 -4
- package/dist/utils/search-txt-builders.js +41 -1
- package/dist/utils/search-txt-query.d.ts +12 -0
- package/dist/utils/search-txt-query.js +12 -0
- package/dist/validation/schemas.d.ts +8 -8
- package/package.json +6 -2
- package/scripts/dedupe-peer-deps.mjs +18 -0
- package/scripts/seed-cli.mjs +138 -26
- package/scripts/verify-css-build.mjs +118 -37
- package/dist/_internal/server/features/search/actions.d.ts +0 -7
- package/dist/_internal/server/features/search/actions.js +0 -21
- package/dist/_internal/server/features/search/data.d.ts +0 -15
- package/dist/_internal/server/features/search/data.js +0 -18
- package/dist/_internal/server/features/search/index.d.ts +0 -3
- package/dist/_internal/server/features/search/index.js +0 -2
- package/dist/features/account/components/UserAddressesView.d.ts +0 -13
- package/dist/features/account/components/UserAddressesView.js +0 -5
- package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
- package/dist/features/account/components/UserNotificationsView.js +0 -12
- package/dist/features/account/components/UserSettingsView.d.ts +0 -16
- package/dist/features/account/components/UserSettingsView.js +0 -13
- package/dist/features/account/components/UserSupportView.d.ts +0 -3
- package/dist/features/account/components/UserSupportView.js +0 -166
- package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
- package/dist/features/admin/components/DemoSeedView.js +0 -5
- package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
- package/dist/features/auth/components/AuthStatusPanel.js +0 -22
- package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
- package/dist/features/categories/components/CategoryProductsView.js +0 -21
- package/dist/features/homepage/api/[id]/route.d.ts +0 -23
- package/dist/features/homepage/api/[id]/route.js +0 -103
- package/dist/features/homepage/api/route.d.ts +0 -14
- package/dist/features/homepage/api/route.js +0 -140
- package/dist/features/homepage/api/sections/[id]/route.d.ts +0 -26
- package/dist/features/homepage/api/sections/[id]/route.js +0 -95
- package/dist/features/homepage/api/sections/route.d.ts +0 -13
- package/dist/features/homepage/api/sections/route.js +0 -82
- package/dist/features/homepage/components/AdvertisementBanner.d.ts +0 -14
- package/dist/features/homepage/components/AdvertisementBanner.js +0 -35
- package/dist/features/homepage/components/BeforeAfterCard.d.ts +0 -9
- package/dist/features/homepage/components/BeforeAfterCard.js +0 -73
- package/dist/features/homepage/components/FeaturedResultsSection.d.ts +0 -17
- package/dist/features/homepage/components/FeaturedResultsSection.js +0 -17
- package/dist/features/homepage/components/HeroBanner.d.ts +0 -7
- package/dist/features/homepage/components/HeroBanner.js +0 -43
- package/dist/features/homepage/components/HeroSection.d.ts +0 -7
- package/dist/features/homepage/components/HeroSection.js +0 -6
- package/dist/features/homepage/components/HomepageSkeleton.d.ts +0 -2
- package/dist/features/homepage/components/HomepageSkeleton.js +0 -21
- package/dist/features/homepage/components/HomepageView.d.ts +0 -25
- package/dist/features/homepage/components/HomepageView.js +0 -5
- package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
- package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
- package/dist/features/homepage/components/NewsletterBanner.d.ts +0 -23
- package/dist/features/homepage/components/NewsletterBanner.js +0 -37
- package/dist/features/homepage/components/SiteFeaturesSection.d.ts +0 -14
- package/dist/features/homepage/components/SiteFeaturesSection.js +0 -11
- package/dist/features/homepage/components/TrustBadges.d.ts +0 -6
- package/dist/features/homepage/components/TrustBadges.js +0 -46
- package/dist/features/homepage/components/TrustIndicatorsSection.d.ts +0 -12
- package/dist/features/homepage/components/TrustIndicatorsSection.js +0 -11
- package/dist/features/homepage/hooks/useHomepage.d.ts +0 -11
- package/dist/features/homepage/hooks/useHomepage.js +0 -17
- package/dist/features/homepage/hooks/useHomepageSections.d.ts +0 -2
- package/dist/features/homepage/hooks/useHomepageSections.js +0 -10
- package/dist/features/homepage/repository/homepage.repository.d.ts +0 -11
- package/dist/features/homepage/repository/homepage.repository.js +0 -25
- package/dist/features/layout/BottomActions.d.ts +0 -1
- package/dist/features/layout/BottomActions.js +0 -311
- package/dist/features/products/components/ProductsView.d.ts +0 -6
- package/dist/features/products/components/ProductsView.js +0 -5
- package/dist/features/search/actions/index.d.ts +0 -1
- package/dist/features/search/actions/index.js +0 -1
- package/dist/features/search/actions/search-actions.d.ts +0 -18
- package/dist/features/search/actions/search-actions.js +0 -43
- package/dist/features/search/api/route.d.ts +0 -22
- package/dist/features/search/api/route.js +0 -128
- package/dist/features/search/columns/index.d.ts +0 -17
- package/dist/features/search/columns/index.js +0 -49
- package/dist/features/search/components/SearchFiltersRow.d.ts +0 -22
- package/dist/features/search/components/SearchFiltersRow.js +0 -21
- package/dist/features/search/components/SearchResultsSection.d.ts +0 -53
- package/dist/features/search/components/SearchResultsSection.js +0 -35
- package/dist/features/search/components/SearchView.d.ts +0 -27
- package/dist/features/search/components/SearchView.js +0 -8
- package/dist/features/search/hooks/useSearch.d.ts +0 -21
- package/dist/features/search/hooks/useSearch.js +0 -33
- package/dist/features/search/repository/search.repository.d.ts +0 -14
- package/dist/features/search/repository/search.repository.js +0 -59
- package/dist/features/search/schemas/index.d.ts +0 -70
- package/dist/features/search/schemas/index.js +0 -36
- package/dist/features/search/types/index.d.ts +0 -48
- package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
- package/dist/features/seller/components/SellerStoreView.js +0 -8
- package/dist/features/stores/components/StoreScopedSearch.d.ts +0 -17
- package/dist/features/stores/components/StoreScopedSearch.js +0 -27
- package/dist/seed/defaults/homepage-sections.d.ts +0 -2
- package/dist/seed/defaults/homepage-sections.js +0 -60
- package/dist/seed/factories/homepage-section.factory.d.ts +0 -10
- package/dist/seed/factories/homepage-section.factory.js +0 -13
- /package/dist/{features/search/types/index.js → _internal/shared/listing-types/spares/og.d.ts} +0 -0
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
import { normalizeError } from "../../../errors/normalize.js";
|
|
2
|
-
import { increment, serverTimestamp } from "../../../contracts/field-ops.js";
|
|
2
|
+
import { arrayUnion, increment, serverTimestamp } from "../../../contracts/field-ops.js";
|
|
3
3
|
// 🛑 `../../../errors` re-exports the REAL ValidationError (errors/validation-error),
|
|
4
4
|
// which is the one `mapToHttpError` instanceof-checks to produce a 400. The
|
|
5
5
|
// unrelated same-named class under `_internal/shared/errors` falls through every
|
|
6
6
|
// classified branch to a generic 500 — Root Cause #53.
|
|
7
7
|
import { DatabaseError } from "../../../errors/index.js";
|
|
8
8
|
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase/index.js";
|
|
9
|
-
|
|
9
|
+
/*
|
|
10
|
+
* The DEFINING module, not the `core` barrel — Root Cause #18. `core/index.ts`
|
|
11
|
+
* re-exports `unitOfWork`, which imports this very repository, so reaching
|
|
12
|
+
* `cacheManager` through the barrel closed a six-module import cycle
|
|
13
|
+
* (`audit-import-cycles` component 2). `CacheManager.ts` imports nothing from
|
|
14
|
+
* here, so the deep path has one direction only.
|
|
15
|
+
*/
|
|
16
|
+
import { cacheManager } from "../../../core/CacheManager.js";
|
|
10
17
|
import { serverLogger } from "../../../monitoring/index.js";
|
|
11
18
|
import { generateUniqueId, slugify, generateBarcodeId } from "../../../utils/index.js";
|
|
12
19
|
import { parseSearchTxtQuery } from "../../../utils/search-txt.js";
|
|
@@ -17,7 +24,7 @@ import { planSearchTxt, beginSearchWindow, emptySearchResult, } from "../../../u
|
|
|
17
24
|
// One definition of "which fields feed searchTxt", shared with the seed
|
|
18
25
|
// wrapper. Three copies existed and two were missing the same three fields.
|
|
19
26
|
import { buildProductSearchTxt } from "../../../utils/search-txt-builders.js";
|
|
20
|
-
import { PRODUCT_COLLECTION, ProductStatusValues } from "../schemas/index.js";
|
|
27
|
+
import { PRODUCT_COLLECTION, ProductStatusValues, toProductImages } from "../schemas/index.js";
|
|
21
28
|
// Collection NAMES only — deliberately not `categoriesRepository` or
|
|
22
29
|
// `taxCodesRepository`. See deriveTaxonomy()'s header for why these are raw
|
|
23
30
|
// reads: no repository in this codebase imports another feature's, because of
|
|
@@ -38,6 +45,12 @@ import { MAX_FEATURES_PER_PRODUCT } from "../schemas/product-features.js";
|
|
|
38
45
|
// The ONE `{{placeholder}}` implementation, promoted out of the FAQ schema in
|
|
39
46
|
// B3. A second regex here would be Root Cause #75's shape.
|
|
40
47
|
import { interpolate } from "../../../_internal/shared/templating/placeholders.js";
|
|
48
|
+
/*
|
|
49
|
+
* From their DEFINING modules, not a barrel — a repository reaching the wide
|
|
50
|
+
* entry is how the Turbopack client-bundle trap gets re-opened (Root Cause #18).
|
|
51
|
+
*/
|
|
52
|
+
import { ALL_LISTING_TYPES } from "../../../_internal/shared/listing-types/feature-flags.js";
|
|
53
|
+
import { pluginFor } from "../../../_internal/shared/listing-types/_registry.js";
|
|
41
54
|
import { PRODUCT_FIELDS } from "../../../constants/field-names.js";
|
|
42
55
|
/**
|
|
43
56
|
* Canonical listing-kind tokens used in `listingType`. Note: the public Sieve
|
|
@@ -66,6 +79,21 @@ const LISTING_KIND_ALIAS_MAP = {
|
|
|
66
79
|
live: LISTING_TYPE_VALUES.LIVE,
|
|
67
80
|
art: LISTING_TYPE_VALUES.ART,
|
|
68
81
|
stickers: LISTING_TYPE_VALUES.STICKERS,
|
|
82
|
+
/*
|
|
83
|
+
* 🛑 Root Cause #58 lives here, and it is the single most expensive line to
|
|
84
|
+
* omit in this whole change. The alias returns `""` for an unrecognised
|
|
85
|
+
* token and `expandFilterAliases` then DROPS the empty clause — so a missing
|
|
86
|
+
* entry does not error, it deletes the `listingType` filter from the query.
|
|
87
|
+
* `art` and `stickers` were added to the union, the registry and the
|
|
88
|
+
* capability map and not to this map, and every art/sticker browse page
|
|
89
|
+
* silently returned the entire catalogue until someone reported it.
|
|
90
|
+
*
|
|
91
|
+
* `Record<ProductListingKind, string>` makes it compile-checked against THAT
|
|
92
|
+
* union — but `ProductListingKind` is itself hand-written above and is not
|
|
93
|
+
* checked against `ListingType`, which is why this is still on the unchecked
|
|
94
|
+
* list.
|
|
95
|
+
*/
|
|
96
|
+
spares: LISTING_TYPE_VALUES.SPARES,
|
|
69
97
|
// Legacy → canonical.
|
|
70
98
|
product: LISTING_TYPE_VALUES.STANDARD,
|
|
71
99
|
preorder: LISTING_TYPE_VALUES.PRE_ORDER,
|
|
@@ -225,6 +253,17 @@ export class ProductRepository extends BaseRepository {
|
|
|
225
253
|
if (!doc.categorySlugs || doc.categorySlugs.length === 0) {
|
|
226
254
|
doc.categorySlugs = doc.category ? [doc.category] : [];
|
|
227
255
|
}
|
|
256
|
+
/*
|
|
257
|
+
* A6 — widen a legacy `images: string[]` document to `ProductImage[]`.
|
|
258
|
+
*
|
|
259
|
+
* 🛑 This is HALF the normalisation and must stay paired with the write
|
|
260
|
+
* half in `create`/`update` below. Read-only widening is Root Cause #101
|
|
261
|
+
* exactly: the field would be the object form on every object anyone
|
|
262
|
+
* inspects and still a bare string array in Firestore, so the next write
|
|
263
|
+
* of an untouched document would persist whichever shape the caller
|
|
264
|
+
* happened to hold.
|
|
265
|
+
*/
|
|
266
|
+
doc.images = toProductImages(doc.images);
|
|
228
267
|
return doc;
|
|
229
268
|
}
|
|
230
269
|
/**
|
|
@@ -826,6 +865,13 @@ export class ProductRepository extends BaseRepository {
|
|
|
826
865
|
...data,
|
|
827
866
|
...derived,
|
|
828
867
|
...stock,
|
|
868
|
+
/*
|
|
869
|
+
* A6 — only when the write NAMES `images`. An unconditional
|
|
870
|
+
* `toProductImages(data.images)` would write `[]` over a real gallery on
|
|
871
|
+
* every stock decrement and status flip, because `data` does not carry
|
|
872
|
+
* the field at all on those paths.
|
|
873
|
+
*/
|
|
874
|
+
...(data.images !== undefined ? { images: toProductImages(data.images) } : {}),
|
|
829
875
|
searchTxt: buildProductSearchTxt(merged),
|
|
830
876
|
});
|
|
831
877
|
this.cacheSet(updated);
|
|
@@ -900,7 +946,17 @@ export class ProductRepository extends BaseRepository {
|
|
|
900
946
|
// all. A seed row already carrying the correct chain derives to the same
|
|
901
947
|
// value, so this is a no-op for every existing fixture.
|
|
902
948
|
const derived = await this.deriveTaxonomy(input, true);
|
|
903
|
-
|
|
949
|
+
/*
|
|
950
|
+
* A6 — the WRITE half of the `images` normalisation (the read half is in
|
|
951
|
+
* `mapDoc`). Every create path funnels through here, so a caller handing
|
|
952
|
+
* us `string[]` — a seed row, an older client, the shipment-link route —
|
|
953
|
+
* stores the object form rather than leaving the collection mixed.
|
|
954
|
+
*/
|
|
955
|
+
const withTaxonomy = {
|
|
956
|
+
...input,
|
|
957
|
+
...derived,
|
|
958
|
+
...(input.images !== undefined ? { images: toProductImages(input.images) } : {}),
|
|
959
|
+
};
|
|
904
960
|
const productData = {
|
|
905
961
|
...withTaxonomy,
|
|
906
962
|
barcodeId,
|
|
@@ -1046,17 +1102,89 @@ export class ProductRepository extends BaseRepository {
|
|
|
1046
1102
|
.get();
|
|
1047
1103
|
return snapshot.docs.map((doc) => this.mapDoc(doc));
|
|
1048
1104
|
}
|
|
1049
|
-
|
|
1050
|
-
|
|
1105
|
+
/**
|
|
1106
|
+
* Every member of a group, UNFILTERED — drafts, and every listing type.
|
|
1107
|
+
*
|
|
1108
|
+
* 🛑 This is the scope `dissolveGroup` needs and the ONLY one that may be
|
|
1109
|
+
* unfiltered. A filtered dissolve leaves the excluded members carrying a
|
|
1110
|
+
* `groupId` pointing at a group that no longer exists, which nothing ever
|
|
1111
|
+
* clears — and that orphan is invisible until someone wonders why a product
|
|
1112
|
+
* claims to be in a group with no other members.
|
|
1113
|
+
*/
|
|
1114
|
+
async findAllByGroupId(groupId) {
|
|
1051
1115
|
const snapshot = await this.db
|
|
1052
1116
|
.collection(this.collection)
|
|
1053
1117
|
.where("groupId", "==", groupId)
|
|
1054
|
-
.where(PRODUCT_FIELDS.LISTING_TYPE, "in", [
|
|
1055
|
-
LISTING_TYPE_VALUES.STANDARD,
|
|
1056
|
-
LISTING_TYPE_VALUES.PRE_ORDER,
|
|
1057
|
-
])
|
|
1058
1118
|
.get();
|
|
1059
|
-
|
|
1119
|
+
const byQuery = snapshot.docs.map((doc) => this.mapDoc(doc));
|
|
1120
|
+
return this.withParentSideFallback(groupId, byQuery);
|
|
1121
|
+
}
|
|
1122
|
+
/**
|
|
1123
|
+
* Group members a BUYER may see: eligible types, published only.
|
|
1124
|
+
*
|
|
1125
|
+
* 🛑 The type filter is DERIVED from `canJoinProductGroup`, not hard-coded.
|
|
1126
|
+
* It used to be a literal `["standard", "pre-order"]`, which silently dropped
|
|
1127
|
+
* every `stickers` / `art` member from the query — so `ShowGroupSection` saw
|
|
1128
|
+
* one member and returned null, and the picker was unreachable with nothing
|
|
1129
|
+
* erroring anywhere (Root Cause #58).
|
|
1130
|
+
*
|
|
1131
|
+
* 🛑 The `status` filter is NEW and is a leak fix, not a tightening. There
|
|
1132
|
+
* was no status filter at all, so DRAFT members were reaching the public
|
|
1133
|
+
* `/api/products/group/[groupId]` payload; widening the type list without
|
|
1134
|
+
* this would have widened that leak at the same time.
|
|
1135
|
+
*/
|
|
1136
|
+
async findGroupMembersForPublic(groupId) {
|
|
1137
|
+
const eligible = ALL_LISTING_TYPES.filter((t) => pluginFor(t).canJoinProductGroup);
|
|
1138
|
+
const snapshot = await this.db
|
|
1139
|
+
.collection(this.collection)
|
|
1140
|
+
.where("groupId", "==", groupId)
|
|
1141
|
+
// `in` caps at 30 values; this is 4 of 9 today and cannot approach it.
|
|
1142
|
+
.where(PRODUCT_FIELDS.LISTING_TYPE, "in", eligible)
|
|
1143
|
+
.where(PRODUCT_FIELDS.STATUS, "==", ProductStatusValues.PUBLISHED)
|
|
1144
|
+
.get();
|
|
1145
|
+
const byQuery = snapshot.docs.map((doc) => this.mapDoc(doc));
|
|
1146
|
+
const withFallback = await this.withParentSideFallback(groupId, byQuery);
|
|
1147
|
+
/*
|
|
1148
|
+
* 🛑 The fallback results are filtered TOO. Without this the fallback
|
|
1149
|
+
* becomes the hole the query just closed — a draft or an ineligible member
|
|
1150
|
+
* would reach the public payload through the parent's own list.
|
|
1151
|
+
*/
|
|
1152
|
+
const eligibleSet = new Set(eligible);
|
|
1153
|
+
return withFallback.filter((p) => eligibleSet.has(String(p.listingType ?? LISTING_TYPE_VALUES.STANDARD)) &&
|
|
1154
|
+
p.status === ProductStatusValues.PUBLISHED);
|
|
1155
|
+
}
|
|
1156
|
+
/**
|
|
1157
|
+
* Union the child-side query with the PARENT's own `groupChildSlugs`.
|
|
1158
|
+
*
|
|
1159
|
+
* Mirrors `resolveBundleMemberIds`, and exists for the same reason: Root
|
|
1160
|
+
* Cause #42 documented a parent carrying `groupChildSlugs` while its children
|
|
1161
|
+
* had no `groupId`, so a child-side query resolved only the parent and the
|
|
1162
|
+
* group rendered as one member. The repository's six mutating methods all
|
|
1163
|
+
* write both sides in one batch, so code cannot produce that state — but a
|
|
1164
|
+
* seeded fixture or a direct Firestore edit still can, and the READER was
|
|
1165
|
+
* never made resilient. `listBundleMembers` got this fix; this did not.
|
|
1166
|
+
*/
|
|
1167
|
+
async withParentSideFallback(groupId, byQuery) {
|
|
1168
|
+
const seen = new Set(byQuery.map((p) => p.id));
|
|
1169
|
+
/*
|
|
1170
|
+
* `startGroup` sets `groupId = parent.slug`, so the group id IS the
|
|
1171
|
+
* parent's slug and one lookup finds it. If that ever stops being true the
|
|
1172
|
+
* fallback simply finds nothing, which is the same behaviour as today.
|
|
1173
|
+
*/
|
|
1174
|
+
const parent = byQuery.find((p) => p.isGroupParent) ?? (await this.findById(groupId));
|
|
1175
|
+
const missing = (parent?.groupChildSlugs ?? []).filter((id) => !seen.has(id));
|
|
1176
|
+
if (missing.length === 0)
|
|
1177
|
+
return byQuery;
|
|
1178
|
+
const extra = await Promise.all(missing.map((id) => this.findById(id)));
|
|
1179
|
+
return [...byQuery, ...extra.filter((p) => p !== null)];
|
|
1180
|
+
}
|
|
1181
|
+
/**
|
|
1182
|
+
* @deprecated Ambiguous about scope — say which one you mean.
|
|
1183
|
+
* Kept so no caller silently changes behaviour; it resolves to the PUBLIC
|
|
1184
|
+
* scope, which is what every existing caller wanted.
|
|
1185
|
+
*/
|
|
1186
|
+
async findByGroupId(groupId) {
|
|
1187
|
+
return this.findGroupMembersForPublic(groupId);
|
|
1060
1188
|
}
|
|
1061
1189
|
async startGroup(productId, slug) {
|
|
1062
1190
|
await this.getCollection().doc(productId).update({
|
|
@@ -1069,7 +1197,10 @@ export class ProductRepository extends BaseRepository {
|
|
|
1069
1197
|
await this.getCollection().doc(productId).update({ groupTitle });
|
|
1070
1198
|
}
|
|
1071
1199
|
async dissolveGroup(groupId) {
|
|
1072
|
-
|
|
1200
|
+
// UNFILTERED on purpose — see findAllByGroupId. Dissolving must clear every
|
|
1201
|
+
// member's fields, including drafts and ineligible types, or they keep a
|
|
1202
|
+
// groupId pointing at nothing.
|
|
1203
|
+
const members = await this.findAllByGroupId(groupId);
|
|
1073
1204
|
const batch = this.db.batch();
|
|
1074
1205
|
const clearFields = {
|
|
1075
1206
|
groupId: null,
|
|
@@ -1083,15 +1214,62 @@ export class ProductRepository extends BaseRepository {
|
|
|
1083
1214
|
}
|
|
1084
1215
|
await batch.commit();
|
|
1085
1216
|
}
|
|
1217
|
+
/**
|
|
1218
|
+
* Link ONE child into a parent's group.
|
|
1219
|
+
*
|
|
1220
|
+
* 🛑 `arrayUnion`, not a spread of the in-memory `parent.groupChildSlugs`.
|
|
1221
|
+
*
|
|
1222
|
+
* The spread read a snapshot the CALLER was holding, so linking N children in
|
|
1223
|
+
* a loop produced exactly ONE entry: every iteration computed
|
|
1224
|
+
* `[...(stale ?? []), child]` from the same pre-loop document and the last
|
|
1225
|
+
* write won. Nothing errored — each child got its own `groupId` correctly, so
|
|
1226
|
+
* `findAllByGroupId` found them all while the parent's own
|
|
1227
|
+
* `groupChildSlugs` claimed one member, which is what the group picker's
|
|
1228
|
+
* fallback path and `GroupSettingsPanel` read.
|
|
1229
|
+
*
|
|
1230
|
+
* `arrayUnion` is also idempotent, so re-linking an existing child is a
|
|
1231
|
+
* no-op instead of a duplicate id.
|
|
1232
|
+
*
|
|
1233
|
+
* For a known set, prefer `linkChildrenToGroup` below — one batch instead of
|
|
1234
|
+
* N, which matters against Rule #6's round-trip budget when promoting a
|
|
1235
|
+
* 60-part sticker sheet.
|
|
1236
|
+
*/
|
|
1086
1237
|
async linkChildToGroup(parent, child) {
|
|
1238
|
+
await this.linkChildrenToGroup(parent, [child]);
|
|
1239
|
+
}
|
|
1240
|
+
/**
|
|
1241
|
+
* Link SEVERAL children into a parent's group in one batch.
|
|
1242
|
+
*
|
|
1243
|
+
* Built for `promoteStickerSheetToListings`, which links every unique part of
|
|
1244
|
+
* a sheet at once — N calls to `linkChildToGroup` would be N batch commits
|
|
1245
|
+
* for work that is one logical change.
|
|
1246
|
+
*/
|
|
1247
|
+
async linkChildrenToGroup(parent, children) {
|
|
1248
|
+
if (children.length === 0)
|
|
1249
|
+
return;
|
|
1087
1250
|
const batch = this.db.batch();
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1251
|
+
for (const child of children) {
|
|
1252
|
+
batch.update(this.getCollection().doc(child.id), {
|
|
1253
|
+
groupId: parent.groupId,
|
|
1254
|
+
groupParentSlug: parent.slug ?? parent.id,
|
|
1255
|
+
groupTitle: parent.groupTitle ?? null,
|
|
1256
|
+
});
|
|
1257
|
+
}
|
|
1093
1258
|
batch.update(this.getCollection().doc(parent.id), {
|
|
1094
|
-
|
|
1259
|
+
/*
|
|
1260
|
+
* Ids, matching `unlinkChildFromGroup`'s filter, which removes by id OR
|
|
1261
|
+
* slug. These are pure slugs for products (`id === slug`), so the two
|
|
1262
|
+
* agree — but the field name says "slugs" and the stored values are ids,
|
|
1263
|
+
* which is worth knowing before writing a reader that assumes either.
|
|
1264
|
+
*/
|
|
1265
|
+
/*
|
|
1266
|
+
* 🛑 `arrayUnion` from the CONTRACTS layer, not `firebase-admin`
|
|
1267
|
+
* directly. Two sibling repositories import `FieldValue` from
|
|
1268
|
+
* firebase-admin and this one deliberately does not — its own imports go
|
|
1269
|
+
* through `contracts/field-ops`, which is what keeps the admin SDK out of
|
|
1270
|
+
* this module's static import graph (Root Cause #24/#6).
|
|
1271
|
+
*/
|
|
1272
|
+
groupChildSlugs: arrayUnion(...children.map((c) => c.id)),
|
|
1095
1273
|
});
|
|
1096
1274
|
await batch.commit();
|
|
1097
1275
|
}
|
|
@@ -1178,6 +1356,39 @@ export class ProductRepository extends BaseRepository {
|
|
|
1178
1356
|
await super.delete(id);
|
|
1179
1357
|
await this.syncCategoryCounts(prior, null);
|
|
1180
1358
|
}
|
|
1359
|
+
/**
|
|
1360
|
+
* Every live listing OF one glossary part, across all stores.
|
|
1361
|
+
*
|
|
1362
|
+
* 🛑 NOT filtered by `listingType`, deliberately. Both `spares` and the
|
|
1363
|
+
* 972 generated per-leaf catalogue rows (which are `standard`) carry
|
|
1364
|
+
* `partGlossaryId`, and a buyer on `/parts/{slot}/{code}` wants any listing
|
|
1365
|
+
* of that part — not only the ones that happen to be filed under the newer
|
|
1366
|
+
* type. Narrowing to `spares` would hide most of the real inventory.
|
|
1367
|
+
*
|
|
1368
|
+
* 🛑 `orderBy` is `createdAt`, which EVERY document carries
|
|
1369
|
+
* (`BaseRepository.create` writes it). Ordering by an optional field silently
|
|
1370
|
+
* excludes every row lacking it — Root Cause #100, where `itemsSold` on zero
|
|
1371
|
+
* of 95 products made a store`s whole review endpoint return nothing.
|
|
1372
|
+
*
|
|
1373
|
+
* Availability is filtered IN MEMORY rather than in the query: "available" is
|
|
1374
|
+
* negation-shaped and no query expresses it, which is the asymmetry
|
|
1375
|
+
* `baseAvailable` exists for. The window is bounded, so the cost is a few
|
|
1376
|
+
* rows read and discarded.
|
|
1377
|
+
*/
|
|
1378
|
+
async findByPartGlossaryId(partGlossaryId, limit = 12) {
|
|
1379
|
+
if (!partGlossaryId)
|
|
1380
|
+
return [];
|
|
1381
|
+
const snap = await this.getCollection()
|
|
1382
|
+
.where(PRODUCT_FIELDS.PART_GLOSSARY_ID, "==", partGlossaryId)
|
|
1383
|
+
.where(PRODUCT_FIELDS.STATUS, "==", PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED)
|
|
1384
|
+
.orderBy(PRODUCT_FIELDS.CREATED_AT, "desc")
|
|
1385
|
+
// Over-fetch, because the availability filter below removes rows. Taking
|
|
1386
|
+
// exactly `limit` here would return fewer than `limit` buyable listings
|
|
1387
|
+
// whenever any of them were sold.
|
|
1388
|
+
.limit(Math.min(60, limit * 3))
|
|
1389
|
+
.get();
|
|
1390
|
+
return snap.docs.map((d) => this.mapDoc(d)).slice(0, limit);
|
|
1391
|
+
}
|
|
1181
1392
|
/**
|
|
1182
1393
|
* Shared scope construction for `list()` and `countBy*()` — both must narrow
|
|
1183
1394
|
* by exactly the same store/status/category/search predicates or a tab's
|
|
@@ -1198,6 +1409,11 @@ export class ProductRepository extends BaseRepository {
|
|
|
1198
1409
|
baseQuery = baseQuery.where(PRODUCT_FIELDS.STORE_ID, "==", opts.storeId);
|
|
1199
1410
|
}
|
|
1200
1411
|
// Longest term first — only ONE may become the array-contains clause.
|
|
1412
|
+
// audit-listing-search-ok: builder, not an entry point. The empty guard is
|
|
1413
|
+
// `if (plan.empty) return emptySearchResult()` in `list()` (~line 1783),
|
|
1414
|
+
// which is one of only two callers of this private method; the other,
|
|
1415
|
+
// `countByListingTypes`, declares no `search` in its opts type and so
|
|
1416
|
+
// structurally cannot pass one.
|
|
1201
1417
|
const searchTxt = parseSearchTxtQuery(opts?.search ?? "");
|
|
1202
1418
|
if (searchTxt.length > 0) {
|
|
1203
1419
|
// Firestore permits a single array operator per query, so when a search
|
|
@@ -1469,6 +1685,20 @@ ProductRepository.SIEVE_FIELDS = {
|
|
|
1469
1685
|
// admin and seller product lists.
|
|
1470
1686
|
featured: { canFilter: true, canSort: true },
|
|
1471
1687
|
listingType: { canFilter: true, canSort: false },
|
|
1688
|
+
/*
|
|
1689
|
+
* 🛑 Filterable so a `partGlossaryId` filter is not SILENTLY DROPPED.
|
|
1690
|
+
* `sieve.ts` sets `throwExceptions: false`, so a field absent from this map
|
|
1691
|
+
* does not raise — `findField` returns undefined and the clause vanishes,
|
|
1692
|
+
* which on a page scoped to one part means the ENTIRE catalogue comes back
|
|
1693
|
+
* (Root Cause #62). Both of these are real `ProductDocument` fields, so
|
|
1694
|
+
* neither is the orphan half of that pattern.
|
|
1695
|
+
*
|
|
1696
|
+
* `canSort: false` on both: they are identity, not an ordering anyone wants
|
|
1697
|
+
* — and a sort option whose field is `canSort: false` is dropped just as
|
|
1698
|
+
* silently (Root Cause #63).
|
|
1699
|
+
*/
|
|
1700
|
+
partGlossaryId: { canFilter: true, canSort: false },
|
|
1701
|
+
colourway: { canFilter: true, canSort: false },
|
|
1472
1702
|
isPromoted: { canFilter: true, canSort: true },
|
|
1473
1703
|
isOnSale: { canFilter: true, canSort: false },
|
|
1474
1704
|
price: { canFilter: true, canSort: true },
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Products Firestore Document Types & Constants
|
|
3
3
|
*/
|
|
4
4
|
import { type GenerateProductIdInput, type GenerateAuctionIdInput, type GeneratePreOrderIdInput } from "../../../utils/id-generators";
|
|
5
|
-
import type { ProductStatus, ListingType } from "../types";
|
|
5
|
+
import type { ProductStatus, ListingType, ProductImage } from "../types";
|
|
6
|
+
export type { ProductImage };
|
|
6
7
|
import type { BaseDocument } from "../../../_internal/shared/types/base-document";
|
|
7
8
|
import type { LotteryConfig } from "../../lottery/types";
|
|
8
9
|
export interface ProductVideoField {
|
|
@@ -12,6 +13,31 @@ export interface ProductVideoField {
|
|
|
12
13
|
trimStart?: number;
|
|
13
14
|
trimEnd?: number;
|
|
14
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Whatever a document, a request body or a seed row happens to hold, as
|
|
18
|
+
* `ProductImage[]`.
|
|
19
|
+
*
|
|
20
|
+
* 🛑 This is called on the WRITE path (`ProductRepository.create`/`update`)
|
|
21
|
+
* **and** on the read path (`mapDoc`), and both are required. Root Cause #101
|
|
22
|
+
* is exactly this shape: `mapDoc` backfilled `categorySlugs` on read while the
|
|
23
|
+
* write schema stripped it, so the field was present on every object anyone
|
|
24
|
+
* inspected and absent from the stored document — invisible to every query,
|
|
25
|
+
* and latent until a human created a listing.
|
|
26
|
+
*
|
|
27
|
+
* Accepts `string`, `ProductImage`, and a mixed array of both, because a
|
|
28
|
+
* partially-migrated collection genuinely contains all three.
|
|
29
|
+
*/
|
|
30
|
+
export declare function toProductImages(input: unknown): ProductImage[];
|
|
31
|
+
/**
|
|
32
|
+
* Just the URLs, in order — for the many call sites that only ever needed a
|
|
33
|
+
* `string[]` (a lightbox's source list, an OG image pick, a media-abort
|
|
34
|
+
* cleanup list).
|
|
35
|
+
*
|
|
36
|
+
* This is a PROJECTION, computed on demand, not a stored mirror — so it cannot
|
|
37
|
+
* drift from `images` the way a denormalised second field would (Root Cause
|
|
38
|
+
* #42). Takes `unknown` so it also works on a legacy `string[]`.
|
|
39
|
+
*/
|
|
40
|
+
export declare function productImageUrls(input: unknown): string[];
|
|
15
41
|
export interface ProductSpecification {
|
|
16
42
|
name: string;
|
|
17
43
|
value: string;
|
|
@@ -256,7 +282,14 @@ export interface ProductDocument extends BaseDocument {
|
|
|
256
282
|
stockQuantity: number;
|
|
257
283
|
availableQuantity: number;
|
|
258
284
|
mainImage: string;
|
|
259
|
-
|
|
285
|
+
/**
|
|
286
|
+
* 🛑 `ProductImage[]`, not `string[]` (changed 2026-10-20, plan A6).
|
|
287
|
+
*
|
|
288
|
+
* Normalised by `toProductImages()` on BOTH the write path and `mapDoc`, so
|
|
289
|
+
* a legacy `string[]` document widens losslessly and a new write stores the
|
|
290
|
+
* object form. Call sites that only want URLs use `productImageUrls()`.
|
|
291
|
+
*/
|
|
292
|
+
images: ProductImage[];
|
|
260
293
|
video?: ProductVideoField;
|
|
261
294
|
status: ProductStatus;
|
|
262
295
|
storeId: string;
|
|
@@ -449,6 +482,52 @@ export interface ProductDocument extends BaseDocument {
|
|
|
449
482
|
isPromoted?: boolean;
|
|
450
483
|
isOnSale?: boolean;
|
|
451
484
|
isSold?: boolean;
|
|
485
|
+
/**
|
|
486
|
+
* This listing is PRINTED OR BUILT WHEN ORDERED, so stock does not gate it.
|
|
487
|
+
*
|
|
488
|
+
* A per-LISTING flag, deliberately not implied by `listingType`. A seller can
|
|
489
|
+
* hold a finite run of pre-cut sticker sheets and also offer a
|
|
490
|
+
* print-on-demand sheet, and the two must coexist on the same type — which a
|
|
491
|
+
* type-level rule cannot express. (`showsStockQuantity` on the plugin is the
|
|
492
|
+
* type-level field and must NOT be repurposed for this.)
|
|
493
|
+
*
|
|
494
|
+
* 🛑 It bypasses the stock CHECK and never the DECREMENT. `availableQuantity`
|
|
495
|
+
* going negative on a made-to-order row IS the production queue — how many
|
|
496
|
+
* are owed — and `stock-restore.ts` requires the restore to mirror the
|
|
497
|
+
* decrement exactly, so skipping the decrement would make a cancelled order
|
|
498
|
+
* restore stock that was never taken.
|
|
499
|
+
*
|
|
500
|
+
* 🛑 Not snapshotted onto `CartLineMember`. A snapshot goes stale the moment
|
|
501
|
+
* the flag is flipped, and every check site already holds the product
|
|
502
|
+
* document — so it is derived, never copied (Root Cause #42).
|
|
503
|
+
*
|
|
504
|
+
* 🛑 CHECKED, not assumed: nothing auto-sets `isSold` when quantity reaches
|
|
505
|
+
* zero, so a made-to-order listing does NOT destroy itself on its first
|
|
506
|
+
* sale. `buildStockUpdatePayload` writes `availableQuantity` and the rule's
|
|
507
|
+
* `stockDecrementExtras` and nothing else; the only two writers of
|
|
508
|
+
* `isSold: true` in the whole tree are auction settlement and the auction
|
|
509
|
+
* buyout, both of which are selling a unique lot and are correct to do it.
|
|
510
|
+
* If a future "mark sold out automatically" feature is added, it must skip
|
|
511
|
+
* made-to-order rows or every one of them dies on its first order.
|
|
512
|
+
*/
|
|
513
|
+
madeToOrder?: boolean;
|
|
514
|
+
/**
|
|
515
|
+
* The `stickerSheets` document this listing was promoted from.
|
|
516
|
+
*
|
|
517
|
+
* Set on BOTH the parent (the whole sheet) and every child (one cut), so the
|
|
518
|
+
* relationship is answerable from either end without a query — "which sheet
|
|
519
|
+
* is this sticker off" and "has this sheet already been promoted" are both
|
|
520
|
+
* questions the admin UI asks.
|
|
521
|
+
*/
|
|
522
|
+
sourceStickerSheetId?: string;
|
|
523
|
+
/**
|
|
524
|
+
* Which cut of that sheet, by `SheetPart.ordinal`.
|
|
525
|
+
*
|
|
526
|
+
* 🛑 The ordinal, never an array index — `parts[]` is not guaranteed dense or
|
|
527
|
+
* ordered and a re-promote rewrites it, so an index would silently point at a
|
|
528
|
+
* different sticker. Absent on the parent, which is the whole sheet.
|
|
529
|
+
*/
|
|
530
|
+
sourceStickerPartOrdinal?: number;
|
|
452
531
|
/** When true, an EMI order for this product ships as soon as it's confirmed instead of waiting for every installment to be paid. Default false. */
|
|
453
532
|
allowShipBeforeEmiComplete?: boolean;
|
|
454
533
|
/**
|
|
@@ -514,6 +593,20 @@ export interface ProductDocument extends BaseDocument {
|
|
|
514
593
|
groupParentSlug?: string;
|
|
515
594
|
groupChildSlugs?: string[];
|
|
516
595
|
groupTitle?: string;
|
|
596
|
+
groupMinMembers?: number;
|
|
597
|
+
groupMaxMembers?: number;
|
|
598
|
+
groupMaxUnitsPerMember?: number;
|
|
599
|
+
groupRequiredMemberIds?: string[];
|
|
600
|
+
/**
|
|
601
|
+
* Percentage off a self-assembled selection's subtotal, 0–100.
|
|
602
|
+
*
|
|
603
|
+
* 🛑 Applied in exactly ONE place: the repository's private
|
|
604
|
+
* `deriveLinePrice`, which runs on every `groupMembers` write and feeds
|
|
605
|
+
* `expandCartLineToOrderRows`' per-member GST proration through
|
|
606
|
+
* `allocateAcrossMembers`. A second application anywhere makes the cart total
|
|
607
|
+
* disagree with the invoice (Root Cause #75).
|
|
608
|
+
*/
|
|
609
|
+
groupDiscountPercent?: number;
|
|
517
610
|
/**
|
|
518
611
|
* W1-45 — optional icon shown as an overlay badge on every card whose
|
|
519
612
|
* product belongs to this group. Set once on the group parent; cards
|
|
@@ -683,8 +776,8 @@ export declare const ProductStatusValues: {
|
|
|
683
776
|
export declare const PRODUCT_COLLECTION: "products";
|
|
684
777
|
export declare const PRODUCT_INDEXED_FIELDS: readonly ["storeId", "status", "category", "categoryIds", "featured", "listingType", "isPromoted", "isOnSale", "isSold", "searchTxt", "createdAt", "barcodeId", "physicalLocation.zone"];
|
|
685
778
|
export declare const DEFAULT_PRODUCT_DATA: Partial<ProductDocument>;
|
|
686
|
-
export declare const PRODUCT_PUBLIC_FIELDS: readonly ["allowOffers", "minOfferPercent", "id", "title", "description", "category", "categoryIds", "categoryIdNames", "subcategory", "brand", "price", "originalPrice", "currency", "stockQuantity", "availableQuantity", "images", "status", "storeName", "featured", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "finalSale", "isLot", "lotSize", "unitLabel", "partGlossaryId", "colourway", "mouldVariant", "assembledFrom", "views7d", "views30d", "unitLabel", "partGlossaryId", "colourway", "mouldVariant", "assembledFrom", "listingType", "auctionEndDate", "startingBid", "currentBid", "bidCount", "reservePrice", "buyNowPrice", "minBidIncrement", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "bidsHaveStarted", "grading", "card", "classified", "digitalCode", "liveItem", "catalogProductId", "preOrderDeliveryDate", "preOrderDepositPercent", "preOrderDepositAmount", "preOrderMaxQuantity", "preOrderCurrentCount", "preOrderProductionStatus", "preOrderCancellable", "condition", "insurance", "insuranceCost", "shippingPaidBy", "isPromoted", "isOnSale", "isSold", "slug", "seoTitle", "seoDescription", "seoKeywords", "viewCount", "customFields", "customSections", "sublistingCategoryId", "groupId", "isGroupParent", "groupParentSlug", "groupChildSlugs", "groupTitle", "createdAt"];
|
|
687
|
-
export declare const PRODUCT_UPDATABLE_FIELDS: readonly ["title", "description", "category", "categoryIds", "subcategory", "brand", "price", "originalPrice", "stockQuantity", "images", "status", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "finalSale", "isLot", "lotSize", "pickupAddressId", "condition", "insurance", "shippingPaidBy", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "reservePrice", "buyNowPrice", "minBidIncrement", "bidsHaveStarted", "grading", "card", "classified", "digitalCode", "liveItem", "catalogProductId", "listingType", "preOrderDeliveryDate", "preOrderDepositPercent", "preOrderDepositAmount", "preOrderMaxQuantity", "preOrderProductionStatus", "preOrderCancellable", "isOnSale", "isSold", "allowShipBeforeEmiComplete", "gstRate", "hsnCode", "authenticity", "printMeta", "seoTitle", "seoDescription", "seoKeywords", "customFields", "customSections", "sublistingCategoryId", "groupId", "isGroupParent", "groupParentSlug", "groupChildSlugs", "groupTitle", "barcodeId"];
|
|
779
|
+
export declare const PRODUCT_PUBLIC_FIELDS: readonly ["allowOffers", "minOfferPercent", "id", "title", "description", "category", "categoryIds", "categoryIdNames", "subcategory", "brand", "price", "originalPrice", "currency", "stockQuantity", "availableQuantity", "images", "status", "storeName", "featured", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "finalSale", "isLot", "lotSize", "unitLabel", "partGlossaryId", "colourway", "mouldVariant", "assembledFrom", "views7d", "views30d", "unitLabel", "partGlossaryId", "colourway", "mouldVariant", "assembledFrom", "listingType", "auctionEndDate", "startingBid", "currentBid", "bidCount", "reservePrice", "buyNowPrice", "minBidIncrement", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "bidsHaveStarted", "grading", "card", "classified", "digitalCode", "liveItem", "catalogProductId", "preOrderDeliveryDate", "preOrderDepositPercent", "preOrderDepositAmount", "preOrderMaxQuantity", "preOrderCurrentCount", "preOrderProductionStatus", "preOrderCancellable", "condition", "insurance", "insuranceCost", "shippingPaidBy", "isPromoted", "isOnSale", "isSold", "madeToOrder", "sourceStickerSheetId", "sourceStickerPartOrdinal", "slug", "seoTitle", "seoDescription", "seoKeywords", "viewCount", "customFields", "customSections", "sublistingCategoryId", "groupId", "isGroupParent", "groupParentSlug", "groupChildSlugs", "groupTitle", "groupMinMembers", "groupMaxMembers", "groupMaxUnitsPerMember", "groupRequiredMemberIds", "groupDiscountPercent", "createdAt"];
|
|
780
|
+
export declare const PRODUCT_UPDATABLE_FIELDS: readonly ["title", "description", "category", "categoryIds", "subcategory", "brand", "price", "originalPrice", "stockQuantity", "images", "status", "tags", "specifications", "features", "shippingInfo", "returnPolicy", "finalSale", "isLot", "lotSize", "pickupAddressId", "condition", "insurance", "shippingPaidBy", "autoExtendable", "auctionExtensionMinutes", "auctionShippingPaidBy", "reservePrice", "buyNowPrice", "minBidIncrement", "bidsHaveStarted", "grading", "card", "classified", "digitalCode", "liveItem", "catalogProductId", "listingType", "preOrderDeliveryDate", "preOrderDepositPercent", "preOrderDepositAmount", "preOrderMaxQuantity", "preOrderProductionStatus", "preOrderCancellable", "isOnSale", "isSold", "madeToOrder", "sourceStickerSheetId", "sourceStickerPartOrdinal", "allowShipBeforeEmiComplete", "gstRate", "hsnCode", "authenticity", "printMeta", "seoTitle", "seoDescription", "seoKeywords", "customFields", "customSections", "sublistingCategoryId", "groupId", "isGroupParent", "groupParentSlug", "groupChildSlugs", "groupTitle", "groupMinMembers", "groupMaxMembers", "groupMaxUnitsPerMember", "groupRequiredMemberIds", "groupDiscountPercent", "barcodeId"];
|
|
688
781
|
export type ProductCreateInput = Omit<ProductDocument, "id" | "createdAt" | "updatedAt" | "availableQuantity" | "bidCount" | "currentBid" | "auctionOriginalEndDate">;
|
|
689
782
|
export type ProductUpdateInput = Partial<Pick<ProductDocument, (typeof PRODUCT_UPDATABLE_FIELDS)[number]>>;
|
|
690
783
|
export type ProductAdminUpdateInput = Partial<Omit<ProductDocument, "id" | "createdAt">>;
|
|
@@ -2,6 +2,74 @@
|
|
|
2
2
|
* Products Firestore Document Types & Constants
|
|
3
3
|
*/
|
|
4
4
|
import { generateProductId, generateAuctionId, generatePreOrderId, } from "../../../utils/id-generators.js";
|
|
5
|
+
/**
|
|
6
|
+
* Whatever a document, a request body or a seed row happens to hold, as
|
|
7
|
+
* `ProductImage[]`.
|
|
8
|
+
*
|
|
9
|
+
* 🛑 This is called on the WRITE path (`ProductRepository.create`/`update`)
|
|
10
|
+
* **and** on the read path (`mapDoc`), and both are required. Root Cause #101
|
|
11
|
+
* is exactly this shape: `mapDoc` backfilled `categorySlugs` on read while the
|
|
12
|
+
* write schema stripped it, so the field was present on every object anyone
|
|
13
|
+
* inspected and absent from the stored document — invisible to every query,
|
|
14
|
+
* and latent until a human created a listing.
|
|
15
|
+
*
|
|
16
|
+
* Accepts `string`, `ProductImage`, and a mixed array of both, because a
|
|
17
|
+
* partially-migrated collection genuinely contains all three.
|
|
18
|
+
*/
|
|
19
|
+
export function toProductImages(input) {
|
|
20
|
+
if (!Array.isArray(input))
|
|
21
|
+
return [];
|
|
22
|
+
const out = [];
|
|
23
|
+
for (const entry of input) {
|
|
24
|
+
if (typeof entry === "string") {
|
|
25
|
+
if (entry)
|
|
26
|
+
out.push({ url: entry });
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (entry && typeof entry === "object") {
|
|
30
|
+
/*
|
|
31
|
+
* `Partial<ProductImage>`, NOT `{ url?: unknown }` — one narrowing
|
|
32
|
+
* instead of two casts, and no `unknown` in a local binding
|
|
33
|
+
* (`audit-unknown-leakage` flagged the earlier spelling, correctly: an
|
|
34
|
+
* `unknown` here defeats the checking on every member read below it).
|
|
35
|
+
* Every member is still validated before use, so the assertion is
|
|
36
|
+
* narrowing a shape we are about to prove rather than asserting a fact.
|
|
37
|
+
*/
|
|
38
|
+
const e = entry;
|
|
39
|
+
if (typeof e.url !== "string" || !e.url)
|
|
40
|
+
continue;
|
|
41
|
+
/*
|
|
42
|
+
* 🛑 EVERY optional member is carried through, not just the two A6
|
|
43
|
+
* added. This runs on the WRITE path, so a member it forgets is a
|
|
44
|
+
* member it DESTROYS on the next save — and `thumbnailUrl`/`order`
|
|
45
|
+
* predate this function. Adding a field to `ProductImage` means adding
|
|
46
|
+
* it here; the alternative is a normaliser that quietly truncates the
|
|
47
|
+
* type it claims to normalise.
|
|
48
|
+
*/
|
|
49
|
+
out.push({
|
|
50
|
+
url: e.url,
|
|
51
|
+
...(e.alt ? { alt: e.alt } : {}),
|
|
52
|
+
...(e.thumbnailUrl ? { thumbnailUrl: e.thumbnailUrl } : {}),
|
|
53
|
+
...(typeof e.order === "number" ? { order: e.order } : {}),
|
|
54
|
+
...(typeof e.width === "number" ? { width: e.width } : {}),
|
|
55
|
+
...(typeof e.height === "number" ? { height: e.height } : {}),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Just the URLs, in order — for the many call sites that only ever needed a
|
|
63
|
+
* `string[]` (a lightbox's source list, an OG image pick, a media-abort
|
|
64
|
+
* cleanup list).
|
|
65
|
+
*
|
|
66
|
+
* This is a PROJECTION, computed on demand, not a stored mirror — so it cannot
|
|
67
|
+
* drift from `images` the way a denormalised second field would (Root Cause
|
|
68
|
+
* #42). Takes `unknown` so it also works on a legacy `string[]`.
|
|
69
|
+
*/
|
|
70
|
+
export function productImageUrls(input) {
|
|
71
|
+
return toProductImages(input).map((i) => i.url);
|
|
72
|
+
}
|
|
5
73
|
export const MAX_CUSTOM_FIELDS = 50;
|
|
6
74
|
export const MAX_CUSTOM_SECTIONS = 3;
|
|
7
75
|
/** Runtime-accessible product status values — use instead of bare string literals. */
|
|
@@ -171,6 +239,15 @@ export const PRODUCT_PUBLIC_FIELDS = [
|
|
|
171
239
|
"isPromoted",
|
|
172
240
|
"isOnSale",
|
|
173
241
|
"isSold",
|
|
242
|
+
/* Public because the PDP has to SAY "made to order, printed when you order"
|
|
243
|
+
* instead of a stock line, and the group picker has to uncap that member's
|
|
244
|
+
* stepper. Both are client-side reads. */
|
|
245
|
+
"madeToOrder",
|
|
246
|
+
/* Public: provenance a buyer should see — "this is one cut off that sheet" —
|
|
247
|
+
* and neither value is a path or a private id. The sheet document itself is
|
|
248
|
+
* admin-only; this is just its id, same shape as `sourceCatalogueItemId`. */
|
|
249
|
+
"sourceStickerSheetId",
|
|
250
|
+
"sourceStickerPartOrdinal",
|
|
174
251
|
"slug",
|
|
175
252
|
"seoTitle",
|
|
176
253
|
"seoDescription",
|
|
@@ -184,6 +261,14 @@ export const PRODUCT_PUBLIC_FIELDS = [
|
|
|
184
261
|
"groupParentSlug",
|
|
185
262
|
"groupChildSlugs",
|
|
186
263
|
"groupTitle",
|
|
264
|
+
/* The group's own rules. Public because the PICKER enforces them too — a
|
|
265
|
+
* server-only rule reads as a broken button — and none of them is sensitive:
|
|
266
|
+
* they are merchandising limits a buyer is about to be told anyway. */
|
|
267
|
+
"groupMinMembers",
|
|
268
|
+
"groupMaxMembers",
|
|
269
|
+
"groupMaxUnitsPerMember",
|
|
270
|
+
"groupRequiredMemberIds",
|
|
271
|
+
"groupDiscountPercent",
|
|
187
272
|
"createdAt",
|
|
188
273
|
];
|
|
189
274
|
export const PRODUCT_UPDATABLE_FIELDS = [
|
|
@@ -250,6 +335,17 @@ export const PRODUCT_UPDATABLE_FIELDS = [
|
|
|
250
335
|
"preOrderCancellable",
|
|
251
336
|
"isOnSale",
|
|
252
337
|
"isSold",
|
|
338
|
+
/* 🛑 Listed here or an update STRIPS it — the write schema has no
|
|
339
|
+
* `.passthrough()`, so a field absent from this list is dropped before it
|
|
340
|
+
* reaches Firestore while the write still returns 200 (Root Cause #101). The
|
|
341
|
+
* seller checkbox would appear to save and change nothing. */
|
|
342
|
+
"madeToOrder",
|
|
343
|
+
/* Updatable so `promoteStickerSheetToListings` can set them through the same
|
|
344
|
+
* `create`/`update` path every other write uses — and so a re-promote can
|
|
345
|
+
* correct them — rather than needing a raw collection write that would also
|
|
346
|
+
* skip `deriveTaxonomy`. */
|
|
347
|
+
"sourceStickerSheetId",
|
|
348
|
+
"sourceStickerPartOrdinal",
|
|
253
349
|
"allowShipBeforeEmiComplete",
|
|
254
350
|
/*
|
|
255
351
|
* B3 — these three were MISSING, so the fields existed on the document
|
|
@@ -272,6 +368,14 @@ export const PRODUCT_UPDATABLE_FIELDS = [
|
|
|
272
368
|
"groupParentSlug",
|
|
273
369
|
"groupChildSlugs",
|
|
274
370
|
"groupTitle",
|
|
371
|
+
/* The group's own rules. Public because the PICKER enforces them too — a
|
|
372
|
+
* server-only rule reads as a broken button — and none of them is sensitive:
|
|
373
|
+
* they are merchandising limits a buyer is about to be told anyway. */
|
|
374
|
+
"groupMinMembers",
|
|
375
|
+
"groupMaxMembers",
|
|
376
|
+
"groupMaxUnitsPerMember",
|
|
377
|
+
"groupRequiredMemberIds",
|
|
378
|
+
"groupDiscountPercent",
|
|
275
379
|
"barcodeId",
|
|
276
380
|
];
|
|
277
381
|
// ── SB-UNI-N 2026-05-15 — Digital-code pool subcollection ───────────────────
|