@mohasinac/appkit 4.52.5 → 4.53.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp.json +4 -4
- package/dist/_internal/client/features/sticker-trace/canvas-codec.d.ts +2 -0
- package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
- package/dist/_internal/client/scaffolds/AppShell.js +1 -1
- package/dist/_internal/server/features/auctions/actions.js +1 -1
- package/dist/_internal/server/features/auctions/og.d.ts +3 -1
- package/dist/_internal/server/features/auctions/og.js +3 -1
- package/dist/_internal/server/features/bundles/actions.js +1 -1
- package/dist/_internal/server/features/business-documents/download.d.ts +41 -0
- package/dist/_internal/server/features/business-documents/download.js +91 -0
- package/dist/_internal/server/features/categories/adapters.d.ts +1 -1
- package/dist/_internal/server/features/categories/adapters.js +10 -0
- package/dist/_internal/server/features/categories/data.js +23 -7
- package/dist/_internal/server/features/checkout/actions.d.ts +14 -0
- package/dist/_internal/server/features/checkout/actions.js +116 -15
- package/dist/_internal/server/features/checkout/bundle-expansion.js +17 -0
- package/dist/_internal/server/features/checkout/data.d.ts +37 -0
- package/dist/_internal/server/features/checkout/data.js +20 -3
- package/dist/_internal/server/features/checkout/group-rule-revalidation.d.ts +34 -0
- package/dist/_internal/server/features/checkout/group-rule-revalidation.js +124 -0
- package/dist/_internal/server/features/checkout/supplier-identity.d.ts +55 -0
- package/dist/_internal/server/features/checkout/supplier-identity.js +81 -0
- package/dist/_internal/server/features/classified/metadata.js +1 -1
- package/dist/_internal/server/features/classified/og.d.ts +3 -1
- package/dist/_internal/server/features/classified/og.js +3 -1
- package/dist/_internal/server/features/digital-code/metadata.js +1 -1
- package/dist/_internal/server/features/digital-code/og.d.ts +3 -1
- package/dist/_internal/server/features/digital-code/og.js +3 -1
- package/dist/_internal/server/features/digital-code/pool.d.ts +19 -4
- package/dist/_internal/server/features/digital-code/pool.js +19 -4
- package/dist/_internal/server/features/live/metadata.js +1 -1
- package/dist/_internal/server/features/live/og.d.ts +3 -1
- package/dist/_internal/server/features/live/og.js +3 -1
- package/dist/_internal/server/features/lottery/actions.js +9 -1
- package/dist/_internal/server/features/lottery/og.d.ts +40 -0
- package/dist/_internal/server/features/lottery/og.js +79 -0
- package/dist/_internal/server/features/messages/actions.js +5 -1
- package/dist/_internal/server/features/offers/adapters.js +17 -3
- package/dist/_internal/server/features/orders/actions.js +7 -2
- package/dist/_internal/server/features/parts/og.js +1 -1
- package/dist/_internal/server/features/pre-orders/og.d.ts +3 -1
- package/dist/_internal/server/features/pre-orders/og.js +3 -1
- package/dist/_internal/server/features/price-index/search.d.ts +18 -0
- package/dist/_internal/server/features/price-index/search.js +47 -7
- package/dist/_internal/server/features/prize-draws/og.d.ts +3 -1
- package/dist/_internal/server/features/prize-draws/og.js +3 -1
- package/dist/_internal/server/features/products/group-members.d.ts +26 -0
- package/dist/_internal/server/features/products/group-members.js +7 -1
- package/dist/_internal/server/features/products/og.d.ts +3 -1
- package/dist/_internal/server/features/products/og.js +3 -1
- package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
- package/dist/_internal/server/features/raffle/actions.js +25 -0
- package/dist/_internal/server/features/reviews/actions.js +1 -1
- package/dist/_internal/server/features/reviews/data.d.ts +1 -1
- package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
- package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
- package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
- package/dist/_internal/server/features/search/index-build/build.js +285 -0
- package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
- package/dist/_internal/server/features/search/index-build/sources.js +385 -0
- package/dist/_internal/server/features/search/scoped-sources.d.ts +26 -0
- package/dist/_internal/server/features/search/scoped-sources.js +252 -0
- package/dist/_internal/server/features/search/search-everything.d.ts +57 -0
- package/dist/_internal/server/features/search/search-everything.js +70 -20
- package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
- package/dist/_internal/server/features/search/search-sources.js +142 -7
- package/dist/_internal/server/features/seo/robots.js +21 -1
- package/dist/_internal/server/features/seo/sitemap.js +7 -1
- package/dist/_internal/server/features/shared/listing-adapters.js +4 -2
- package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
- package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
- package/dist/_internal/server/features/site-settings/adapters.js +26 -0
- package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
- package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
- package/dist/_internal/server/features/sticker-trace/adapters.d.ts +91 -0
- package/dist/_internal/server/features/sticker-trace/adapters.js +175 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
- package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
- package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
- package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
- package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
- package/dist/_internal/server/features/sticker-trace/promote-to-listings.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/promote-to-listings.js +264 -0
- package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
- package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
- package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
- package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +143 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.js +311 -0
- package/dist/_internal/server/features/sticker-trace/storage.d.ts +154 -0
- package/dist/_internal/server/features/sticker-trace/storage.js +301 -0
- package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
- package/dist/_internal/server/features/stores/adapters.js +16 -0
- package/dist/_internal/server/features/stores/index.d.ts +1 -0
- package/dist/_internal/server/features/stores/index.js +1 -0
- package/dist/_internal/server/features/stores/tabs.d.ts +25 -0
- package/dist/_internal/server/features/stores/tabs.js +122 -0
- package/dist/_internal/server/functions/scheduled.d.ts +2 -1
- package/dist/_internal/server/functions/scheduled.js +25 -1
- package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
- package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
- package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
- package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
- package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
- package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
- package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
- package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
- package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
- package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
- package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
- package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
- package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
- package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
- package/dist/_internal/server/jobs/core/promotions.js +7 -4
- package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
- package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
- package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
- package/dist/_internal/server/jobs/handlers/index.js +1 -0
- package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
- package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
- package/dist/_internal/shared/actions/action-registry.js +29 -0
- package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
- package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
- package/dist/_internal/shared/checkout/rules/_defaults.js +0 -2
- package/dist/_internal/shared/checkout/rules/_limits.d.ts +14 -1
- package/dist/_internal/shared/checkout/rules/_limits.js +14 -1
- package/dist/_internal/shared/checkout/rules/_registry.js +2 -0
- package/dist/_internal/shared/checkout/rules/auction.rule.js +9 -1
- package/dist/_internal/shared/checkout/rules/bundle.rule.js +13 -0
- package/dist/_internal/shared/checkout/rules/index.d.ts +2 -0
- package/dist/_internal/shared/checkout/rules/index.js +9 -0
- package/dist/_internal/shared/checkout/rules/offer.rule.js +0 -1
- package/dist/_internal/shared/checkout/rules/payment-gate.d.ts +26 -0
- package/dist/_internal/shared/checkout/rules/payment-gate.js +133 -0
- package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +29 -8
- package/dist/_internal/shared/checkout/rules/spares.rule.d.ts +16 -0
- package/dist/_internal/shared/checkout/rules/spares.rule.js +5 -0
- package/dist/_internal/shared/checkout/rules/types.d.ts +26 -2
- package/dist/_internal/shared/config/schema.d.ts +122 -0
- package/dist/_internal/shared/features/cart/schema.js +3 -2
- package/dist/_internal/shared/features/events/config.d.ts +14 -0
- package/dist/_internal/shared/features/events/config.js +14 -0
- package/dist/_internal/shared/features/notifications/action-url.js +8 -0
- package/dist/_internal/shared/features/products/group-rules.d.ts +75 -0
- package/dist/_internal/shared/features/products/group-rules.js +142 -0
- package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
- package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
- package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
- package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
- package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
- package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
- package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
- package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +35 -0
- package/dist/_internal/shared/listing-types/_registry.js +39 -1
- package/dist/_internal/shared/listing-types/art/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/art/config.js +3 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/auction/config.js +3 -0
- package/dist/_internal/shared/listing-types/availability.js +48 -0
- package/dist/_internal/shared/listing-types/capabilities.js +19 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/classified/config.js +3 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +3 -0
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
- package/dist/_internal/shared/listing-types/feature-flags.js +10 -0
- package/dist/_internal/shared/listing-types/live/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/live/config.js +3 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +3 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +3 -0
- package/dist/_internal/shared/listing-types/spares/config.d.ts +74 -0
- package/dist/_internal/shared/listing-types/spares/config.js +60 -0
- package/dist/_internal/shared/listing-types/spares/ctas.d.ts +1 -0
- package/dist/_internal/shared/listing-types/spares/ctas.js +4 -0
- package/dist/_internal/shared/listing-types/spares/og.js +1 -0
- package/dist/_internal/shared/listing-types/spares/schema.d.ts +2 -0
- package/dist/_internal/shared/listing-types/spares/schema.js +3 -0
- package/dist/_internal/shared/listing-types/spares/seed-factory.d.ts +1 -0
- package/dist/_internal/shared/listing-types/spares/seed-factory.js +1 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/standard/config.js +3 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +2 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +3 -0
- package/dist/_internal/shared/media/limits.d.ts +12 -2
- package/dist/_internal/shared/media/limits.js +12 -2
- package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
- package/dist/_internal/shared/search/artifact-url.js +119 -0
- package/dist/_internal/shared/search/index-record.d.ts +68 -0
- package/dist/_internal/shared/search/index-record.js +96 -0
- package/dist/_internal/shared/search/match.d.ts +76 -0
- package/dist/_internal/shared/search/match.js +264 -0
- package/dist/_internal/shared/search/to-groups.d.ts +52 -0
- package/dist/_internal/shared/search/to-groups.js +141 -0
- package/dist/client.d.ts +16 -9
- package/dist/client.js +16 -6
- package/dist/configs/eslint.js +22 -2
- package/dist/constants/api-endpoints.d.ts +107 -15
- package/dist/constants/api-endpoints.js +60 -5
- package/dist/constants/cache-invalidation.js +3 -1
- package/dist/constants/field-names.d.ts +13 -1
- package/dist/constants/field-names.js +42 -1
- package/dist/contracts/repository.d.ts +8 -7
- package/dist/contracts/search.d.ts +2 -2
- package/dist/contracts/table.d.ts +3 -3
- package/dist/contracts/table.js +3 -3
- package/dist/core/contact-submissions.repository.js +2 -2
- package/dist/core/integration-keys.js +7 -1
- package/dist/core/newsletter.repository.js +2 -2
- package/dist/core/site-config.js +1 -1
- package/dist/errors/error-codes.d.ts +30 -0
- package/dist/errors/error-codes.js +30 -0
- package/dist/errors/error-display-map.js +40 -1
- package/dist/features/about/components/PolicyPageView.d.ts +22 -2
- package/dist/features/about/components/PolicyPageView.js +14 -2
- package/dist/features/about/components/PublicProfileView.js +2 -1
- package/dist/features/about/components/ShippingPolicyView.js +42 -2
- package/dist/features/account/api/[userId]/addresses/route.js +1 -1
- package/dist/features/account/components/NotificationBell.js +1 -1
- package/dist/features/account/components/UserBidsView.js +1 -1
- package/dist/features/account/components/index.d.ts +0 -8
- package/dist/features/account/components/index.js +0 -4
- package/dist/features/account/hooks/useProfileStats.js +5 -1
- package/dist/features/addresses/repository/addresses.repository.d.ts +33 -6
- package/dist/features/addresses/repository/addresses.repository.js +86 -9
- package/dist/features/addresses/schemas/firestore.d.ts +17 -6
- package/dist/features/admin/actions/admin-actions.js +16 -1
- package/dist/features/admin/actions/notification-actions.js +15 -6
- package/dist/features/admin/api/bids/route.js +1 -1
- package/dist/features/admin/api/coupons/route.js +1 -1
- package/dist/features/admin/api/products/route.js +1 -1
- package/dist/features/admin/api/reviews/route.js +1 -1
- package/dist/features/admin/components/AdminAdEditorView.js +19 -5
- package/dist/features/admin/components/AdminAuditLogView.js +1 -1
- package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
- package/dist/features/admin/components/AdminBlogView.js +1 -1
- package/dist/features/admin/components/AdminBrandsView.js +17 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +19 -3
- package/dist/features/admin/components/AdminContactView.js +1 -1
- package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
- package/dist/features/admin/components/AdminNavigationView.js +1 -1
- package/dist/features/admin/components/AdminNewsletterView.js +1 -1
- package/dist/features/admin/components/AdminOrdersView.js +9 -2
- package/dist/features/admin/components/AdminPageHeader.js +1 -1
- package/dist/features/admin/components/AdminPayoutsView.js +1 -1
- package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
- package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
- package/dist/features/admin/components/AdminProductEditorView.js +41 -39
- package/dist/features/admin/components/AdminProductsView.js +10 -3
- package/dist/features/admin/components/AdminScammersView.js +1 -1
- package/dist/features/admin/components/AdminSectionsView.js +21 -5
- package/dist/features/admin/components/AdminSessionsView.js +1 -1
- package/dist/features/admin/components/AdminSidebar.js +1 -1
- package/dist/features/admin/components/AdminSiteSettingsView.js +39 -8
- package/dist/features/admin/components/AdminSparesView.d.ts +12 -0
- package/dist/features/admin/components/AdminSparesView.js +30 -0
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
- package/dist/features/admin/components/AdminTeamView.js +1 -1
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
- package/dist/features/admin/components/AdminUsersView.js +10 -8
- package/dist/features/admin/components/DataListingView.d.ts +2 -1
- package/dist/features/admin/components/DataListingView.js +9 -4
- package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
- package/dist/features/admin/components/index.d.ts +2 -0
- package/dist/features/admin/components/index.js +1 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.js +7 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +3 -0
- package/dist/features/admin/constants/filter-tabs.js +1 -0
- package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
- package/dist/features/admin/repository/site-settings.repository.js +8 -3
- package/dist/features/admin/schemas/firestore.d.ts +88 -3
- package/dist/features/admin/schemas/firestore.js +32 -0
- package/dist/features/admin/types/index.d.ts +1 -1
- package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
- package/dist/features/auctions/actions/bid-actions.js +16 -4
- package/dist/features/auctions/api/route.js +1 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
- package/dist/features/auctions/components/AuctionDetailPageView.js +4 -11
- package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
- package/dist/features/auctions/repository/bid.repository.js +114 -13
- package/dist/features/auctions/schemas/firestore.d.ts +24 -4
- package/dist/features/auctions/schemas/firestore.js +1 -0
- package/dist/features/auth/actions/profile-actions.js +30 -4
- package/dist/features/auth/components/index.d.ts +0 -1
- package/dist/features/auth/components/index.js +0 -1
- package/dist/features/auth/repository/session.repository.d.ts +17 -3
- package/dist/features/auth/repository/session.repository.js +46 -5
- package/dist/features/auth/repository/token.repository.d.ts +27 -4
- package/dist/features/auth/repository/token.repository.js +65 -11
- package/dist/features/auth/repository/user.repository.d.ts +46 -7
- package/dist/features/auth/repository/user.repository.js +128 -15
- package/dist/features/auth/schemas/firestore.d.ts +65 -12
- package/dist/features/auth/schemas/firestore.js +13 -0
- package/dist/features/before-after/api/route.js +1 -1
- package/dist/features/blog/components/BlogListView.js +16 -3
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/blog/schemas/index.d.ts +2 -2
- package/dist/features/business-documents/repository/business-documents.repository.d.ts +58 -0
- package/dist/features/business-documents/repository/business-documents.repository.js +54 -0
- package/dist/features/business-documents/schemas/firestore.d.ts +105 -0
- package/dist/features/business-documents/schemas/firestore.js +75 -0
- package/dist/features/cart/actions/cart-actions.js +83 -6
- package/dist/features/cart/api/route.js +1 -1
- package/dist/features/cart/repository/cart.repository.js +32 -4
- package/dist/features/cart/schemas/firestore.d.ts +20 -0
- package/dist/features/cart/schemas/index.d.ts +2 -2
- package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +1 -1
- package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
- package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
- package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
- package/dist/features/categories/api/[id]/price-guidance/route.d.ts +42 -0
- package/dist/features/categories/api/[id]/price-guidance/route.js +113 -0
- package/dist/features/categories/api/route.js +10 -10
- package/dist/features/categories/components/BrandDetailPageView.js +19 -3
- package/dist/features/categories/components/BrandDetailTabs.js +10 -0
- package/dist/features/categories/components/CategoriesIndexListing.js +23 -8
- package/dist/features/categories/components/CategoryDetailPageView.js +170 -13
- package/dist/features/categories/components/CategoryDetailTabs.js +12 -0
- package/dist/features/categories/components/CategoryGrid.js +10 -1
- package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
- package/dist/features/categories/components/PriceGuidanceHint.d.ts +29 -0
- package/dist/features/categories/components/PriceGuidanceHint.js +61 -0
- package/dist/features/categories/components/SubcategoryCardRow.d.ts +27 -0
- package/dist/features/categories/components/SubcategoryCardRow.js +98 -0
- package/dist/features/categories/components/index.d.ts +0 -2
- package/dist/features/categories/components/index.js +0 -1
- package/dist/features/categories/constants/category-tabs.d.ts +20 -25
- package/dist/features/categories/constants/category-tabs.js +22 -39
- package/dist/features/categories/repository/categories.repository.d.ts +13 -0
- package/dist/features/categories/repository/categories.repository.js +51 -1
- package/dist/features/categories/schemas/firestore.d.ts +22 -1
- package/dist/features/categories/schemas/firestore.js +10 -0
- package/dist/features/categories/schemas/index.d.ts +8 -2
- package/dist/features/categories/schemas/index.js +2 -0
- package/dist/features/categories/types/index.d.ts +8 -0
- package/dist/features/categories/utils/taxonomy-visual.d.ts +34 -0
- package/dist/features/categories/utils/taxonomy-visual.js +74 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
- package/dist/features/classified/components/ClassifiedDetailPageView.js +4 -9
- package/dist/features/collections/api/[slug]/route.js +3 -3
- package/dist/features/collections/api/route.js +1 -1
- package/dist/features/consultation/api/route.js +1 -1
- package/dist/features/consultation/repository/consultations.repository.js +1 -1
- package/dist/features/consultation/types/index.d.ts +1 -1
- package/dist/features/contact/components/ContactForm.js +1 -3
- package/dist/features/contact/components/ContactPageView.d.ts +33 -1
- package/dist/features/contact/components/ContactPageView.js +58 -28
- package/dist/features/corporate/api/route.js +1 -1
- package/dist/features/corporate/repository/corporate.repository.js +1 -1
- package/dist/features/corporate/types/index.d.ts +1 -1
- package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
- package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
- package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -9
- package/dist/features/events/actions/event-actions.d.ts +14 -0
- package/dist/features/events/actions/event-actions.js +82 -3
- package/dist/features/events/api/[id]/route.js +2 -2
- package/dist/features/events/components/AdminEventEditorView.js +22 -3
- package/dist/features/events/components/AdminEventsView.js +32 -8
- package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
- package/dist/features/events/components/EventRafflesSection.js +52 -3
- package/dist/features/events/components/SpinWheelView.d.ts +2 -2
- package/dist/features/events/components/SpinWheelView.js +41 -4
- package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
- package/dist/features/events/repository/event-entry.repository.js +41 -7
- package/dist/features/events/schemas/firestore.d.ts +17 -4
- package/dist/features/events/types/index.d.ts +37 -0
- package/dist/features/faq/repository/faqs.repository.js +1 -1
- package/dist/features/faq/schemas/index.d.ts +5 -2
- package/dist/features/faq/schemas/index.js +6 -0
- package/dist/features/faq/types/index.d.ts +0 -1
- package/dist/features/grouped/components/GroupedListingDetailView.js +9 -1
- package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
- package/dist/features/grouped/schemas/firestore.d.ts +5 -0
- package/dist/features/homepage/actions/homepage-section-actions.d.ts +3 -3
- package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
- package/dist/features/homepage/api/carousel/route.js +4 -4
- package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
- package/dist/features/homepage/components/AnnouncementBar.js +13 -19
- package/dist/features/homepage/components/CollectionCardsSection.d.ts +28 -6
- package/dist/features/homepage/components/CollectionCardsSection.js +43 -8
- package/dist/features/homepage/components/HowItWorksSection.d.ts +23 -6
- package/dist/features/homepage/components/HowItWorksSection.js +4 -4
- package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
- package/dist/features/homepage/components/PromoGrid.d.ts +31 -2
- package/dist/features/homepage/components/PromoGrid.js +12 -3
- package/dist/features/homepage/components/TestimonialsCarousel.d.ts +34 -2
- package/dist/features/homepage/components/TestimonialsCarousel.js +1 -1
- package/dist/features/homepage/components/index.d.ts +0 -22
- package/dist/features/homepage/components/index.js +0 -12
- package/dist/features/homepage/index.d.ts +0 -2
- package/dist/features/homepage/index.js +0 -2
- package/dist/features/homepage/lib/section-renderer.d.ts +9 -0
- package/dist/features/homepage/lib/section-renderer.js +202 -58
- package/dist/features/homepage/repository/homepage-sections.repository.d.ts +35 -3
- package/dist/features/homepage/repository/homepage-sections.repository.js +58 -8
- package/dist/features/homepage/schemas/firestore.d.ts +112 -3
- package/dist/features/homepage/schemas/firestore.js +32 -2
- package/dist/features/homepage/schemas/index.d.ts +46 -17
- package/dist/features/homepage/schemas/index.js +39 -27
- package/dist/features/homepage/server.d.ts +0 -3
- package/dist/features/homepage/server.js +0 -3
- package/dist/features/homepage/types/index.d.ts +0 -47
- package/dist/features/homepage/types/index.js +49 -0
- package/dist/features/layout/AppLayoutShell.d.ts +11 -0
- package/dist/features/layout/AppLayoutShell.js +65 -13
- package/dist/features/layout/BottomActionsContext.d.ts +16 -0
- package/dist/features/layout/BottomActionsContext.js +5 -0
- package/dist/features/layout/BottomChrome.js +48 -9
- package/dist/features/layout/BottomNavItem.js +1 -1
- package/dist/features/layout/BottomNavbar.d.ts +14 -0
- package/dist/features/layout/BottomNavbar.js +43 -3
- package/dist/features/layout/BottomSheet.js +1 -1
- package/dist/features/layout/MainNavbar.d.ts +11 -0
- package/dist/features/layout/NavbarLayout.d.ts +3 -0
- package/dist/features/layout/NavbarLayout.js +88 -11
- package/dist/features/layout/SideActionDock.d.ts +1 -0
- package/dist/features/layout/SideActionDock.js +219 -0
- package/dist/features/layout/TitleBarLayout.js +1 -1
- package/dist/features/layout/cta-anchor.d.ts +31 -0
- package/dist/features/layout/cta-anchor.js +31 -0
- package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
- package/dist/features/layout/hooks/useBottomActions.js +6 -1
- package/dist/features/layout/index.d.ts +9 -1
- package/dist/features/layout/index.js +9 -1
- package/dist/features/layout/useCtaReveal.d.ts +24 -0
- package/dist/features/layout/useCtaReveal.js +82 -0
- package/dist/features/layout/useHoldToOpen.d.ts +41 -0
- package/dist/features/layout/useHoldToOpen.js +84 -0
- package/dist/features/live/components/LiveItemDetailPageView.js +4 -9
- package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
- package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
- package/dist/features/lottery/schemas/firestore.d.ts +33 -5
- package/dist/features/loyalty/api/balance/route.js +1 -1
- package/dist/features/loyalty/api/history/route.js +1 -1
- package/dist/features/media/MediaImage.js +0 -1
- package/dist/features/media/MediaPickerModal.js +7 -1
- package/dist/features/media/hooks/useMedia.js +17 -0
- package/dist/features/media/modals/ImageEditor.js +5 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
- package/dist/features/media/repository/media-assets.repository.d.ts +65 -0
- package/dist/features/media/repository/media-assets.repository.js +31 -0
- package/dist/features/media/trust-signals.d.ts +85 -0
- package/dist/features/media/trust-signals.js +126 -0
- package/dist/features/media/upload/CameraCapture.js +16 -1
- package/dist/features/media/upload/ImageUpload.js +42 -4
- package/dist/features/media/upload/MediaUploadField.js +69 -13
- package/dist/features/media/upload/downscale-image.d.ts +56 -0
- package/dist/features/media/upload/downscale-image.js +150 -0
- package/dist/features/messages/components/ConversationThreadView.js +45 -2
- package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
- package/dist/features/messages/components/MessageSellerButton.js +10 -2
- package/dist/features/messages/schemas/firestore.d.ts +15 -0
- package/dist/features/orders/hooks/useOrders.js +4 -2
- package/dist/features/orders/repository/orders.repository.d.ts +15 -4
- package/dist/features/orders/repository/orders.repository.js +52 -20
- package/dist/features/orders/schemas/firestore.d.ts +15 -4
- package/dist/features/orders/schemas/index.d.ts +8 -8
- package/dist/features/orders/types/index.d.ts +2 -2
- package/dist/features/parts/components/PartDetailPageView.d.ts +14 -1
- package/dist/features/parts/components/PartDetailPageView.js +2 -2
- package/dist/features/parts/components/PartsIndexPageView.d.ts +11 -2
- package/dist/features/parts/components/PartsIndexPageView.js +2 -2
- package/dist/features/parts/components/PartsSearchBox.d.ts +9 -0
- package/dist/features/parts/components/PartsSearchBox.js +57 -0
- package/dist/features/parts/schemas/firestore.d.ts +149 -3
- package/dist/features/parts/schemas/firestore.js +184 -0
- package/dist/features/payments/repository/payments.repository.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +38 -6
- package/dist/features/payments/repository/payout.repository.js +84 -23
- package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
- package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
- package/dist/features/payments/schemas/firestore.d.ts +14 -3
- package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
- package/dist/features/pre-orders/api/[slug]/route.js +1 -1
- package/dist/features/pre-orders/api/admin/route.js +1 -1
- package/dist/features/pre-orders/api/route.js +1 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -11
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
- package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
- package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
- package/dist/features/price-index/components/PriceIndexToolView.d.ts +3 -1
- package/dist/features/price-index/components/PriceIndexToolView.js +92 -13
- package/dist/features/products/api/[id]/route.js +1 -1
- package/dist/features/products/components/CompareOverlay.d.ts +18 -1
- package/dist/features/products/components/CompareOverlay.js +21 -2
- package/dist/features/products/components/CustomSectionTabContent.d.ts +31 -0
- package/dist/features/products/components/CustomSectionTabContent.js +29 -3
- package/dist/features/products/components/GroupMemberPicker.d.ts +19 -1
- package/dist/features/products/components/GroupMemberPicker.js +46 -8
- package/dist/features/products/components/GroupSettingsPanel.d.ts +11 -1
- package/dist/features/products/components/GroupSettingsPanel.js +91 -3
- package/dist/features/products/components/ListingBottomActions.js +4 -0
- package/dist/features/products/components/PrizeDrawDetailPageView.js +1 -1
- package/dist/features/products/components/PrizeDrawEntryActions.d.ts +15 -1
- package/dist/features/products/components/PrizeDrawEntryActions.js +70 -8
- package/dist/features/products/components/ProductDetailPageView.js +75 -15
- package/dist/features/products/components/ProductForm.d.ts +13 -1
- package/dist/features/products/components/ProductForm.js +16 -2
- package/dist/features/products/components/ProductGalleryClient.js +2 -2
- package/dist/features/products/components/ProductGrid.js +12 -1
- package/dist/features/products/components/ProductsIndexListing.d.ts +16 -1
- package/dist/features/products/components/ProductsIndexListing.js +3 -3
- package/dist/features/products/components/ShowGroupSection.js +15 -2
- package/dist/features/products/components/SparesListView.d.ts +7 -0
- package/dist/features/products/components/SparesListView.js +39 -0
- package/dist/features/products/components/index.d.ts +0 -2
- package/dist/features/products/components/index.js +0 -1
- package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
- package/dist/features/products/config/listing-type-listing-config.js +27 -2
- package/dist/features/products/constants/action-defs.d.ts +1 -0
- package/dist/features/products/constants/action-defs.js +1 -0
- package/dist/features/products/constants/listing-tabs.d.ts +9 -0
- package/dist/features/products/constants/listing-tabs.js +3 -2
- package/dist/features/products/hooks/useProducts.js +2 -2
- package/dist/features/products/repository/products.repository.d.ts +98 -0
- package/dist/features/products/repository/products.repository.js +248 -18
- package/dist/features/products/schemas/firestore.d.ts +97 -4
- package/dist/features/products/schemas/firestore.js +104 -0
- package/dist/features/products/schemas/index.d.ts +12 -21
- package/dist/features/products/schemas/index.js +23 -6
- package/dist/features/products/types/index.d.ts +46 -2
- package/dist/features/products/utils/group-member-image.d.ts +39 -0
- package/dist/features/products/utils/group-member-image.js +3 -0
- package/dist/features/products/utils/listing-badge-variant.js +4 -0
- package/dist/features/promotions/api/route.js +1 -1
- package/dist/features/reviews/actions/review-actions.d.ts +6 -6
- package/dist/features/reviews/actions/review-actions.js +22 -8
- package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
- package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
- package/dist/features/reviews/components/ReviewsList.js +1 -1
- package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
- package/dist/features/reviews/repository/reviews.repository.js +63 -12
- package/dist/features/reviews/schemas/firestore.d.ts +13 -2
- package/dist/features/reviews/schemas/index.d.ts +2 -2
- package/dist/features/scams/actions/scam-actions.js +16 -4
- package/dist/features/scams/components/ScamProfileView.js +1 -1
- package/dist/features/search/components/EntityTypeahead.d.ts +44 -0
- package/dist/features/search/components/EntityTypeahead.js +92 -0
- package/dist/features/search/components/Search.d.ts +12 -1
- package/dist/features/search/components/Search.js +47 -3
- package/dist/features/search/components/SearchFacetRail.d.ts +11 -0
- package/dist/features/search/components/SearchFacetRail.js +92 -0
- package/dist/features/search/components/SearchResultsClient.d.ts +33 -0
- package/dist/features/search/components/SearchResultsClient.js +103 -0
- package/dist/features/search/components/SearchResultsPageView.d.ts +15 -1
- package/dist/features/search/components/SearchResultsPageView.js +3 -2
- package/dist/features/search/components/index.d.ts +0 -6
- package/dist/features/search/components/index.js +0 -3
- package/dist/features/search/hooks/useNavSuggestions.d.ts +13 -0
- package/dist/features/search/hooks/useScopedSearch.d.ts +34 -0
- package/dist/features/search/hooks/useScopedSearch.js +114 -0
- package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
- package/dist/features/search/hooks/useSearchIndex.js +172 -0
- package/dist/features/search/hooks/useSiteSearch.d.ts +26 -0
- package/dist/features/search/hooks/useSiteSearch.js +149 -0
- package/dist/features/search/index.d.ts +0 -4
- package/dist/features/search/index.js +0 -4
- package/dist/features/search/manifest.d.ts +12 -0
- package/dist/features/search/manifest.js +17 -2
- package/dist/features/search/server.d.ts +0 -3
- package/dist/features/search/server.js +0 -3
- package/dist/features/seller/actions/offer-actions.d.ts +5 -5
- package/dist/features/seller/actions/offer-actions.js +38 -8
- package/dist/features/seller/actions/seller-actions.js +34 -7
- package/dist/features/seller/api/coupons/route.js +1 -1
- package/dist/features/seller/api/products/route.js +1 -1
- package/dist/features/seller/api/store/route.js +1 -1
- package/dist/features/seller/components/SellerBidsView.js +1 -1
- package/dist/features/seller/components/SellerCouponsView.js +1 -1
- package/dist/features/seller/components/SellerListingTypeView.d.ts +1 -1
- package/dist/features/seller/components/SellerListingTypeView.js +29 -1
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutSettingsView.js +35 -15
- package/dist/features/seller/components/SellerPayoutsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.d.ts +1 -1
- package/dist/features/seller/components/SellerProductShell.js +2 -2
- package/dist/features/seller/components/SellerProductsView.js +1 -1
- package/dist/features/seller/components/SellerShippingView.js +0 -1
- package/dist/features/seller/components/SellerSidebar.js +1 -1
- package/dist/features/seller/components/SellerSparesView.d.ts +17 -0
- package/dist/features/seller/components/SellerSparesView.js +6 -0
- package/dist/features/seller/components/SellerStorefrontView.js +0 -1
- package/dist/features/seller/components/index.d.ts +2 -4
- package/dist/features/seller/components/index.js +1 -2
- package/dist/features/seller/repository/offer.repository.d.ts +15 -3
- package/dist/features/seller/repository/offer.repository.js +43 -7
- package/dist/features/seller/schemas/firestore.d.ts +14 -3
- package/dist/features/seller/schemas/index.d.ts +4 -4
- package/dist/features/seller/schemas/order-forms.d.ts +39 -0
- package/dist/features/seller/schemas/order-forms.js +37 -0
- package/dist/features/shell/CommandPalette.js +1 -1
- package/dist/features/shell/FormShell.js +6 -2
- package/dist/features/shell/QuickFormDrawer.js +15 -1
- package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
- package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
- package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
- package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
- package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
- package/dist/features/sticker-trace/constants/help-content.js +172 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
- package/dist/features/sticker-trace/schemas/firestore.d.ts +267 -0
- package/dist/features/sticker-trace/schemas/firestore.js +79 -0
- package/dist/features/sticker-trace/server.d.ts +8 -0
- package/dist/features/sticker-trace/server.js +51 -0
- package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
- package/dist/features/stores/actions/store-query-actions.js +7 -2
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/route.js +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.js +7 -82
- package/dist/features/stores/components/StoreHeader.js +1 -2
- package/dist/features/stores/components/StoreNavTabs.js +17 -2
- package/dist/features/stores/components/StoreSparesPageView.d.ts +27 -0
- package/dist/features/stores/components/StoreSparesPageView.js +48 -0
- package/dist/features/stores/manifest.js +8 -4
- package/dist/features/stores/schemas/firestore.d.ts +19 -0
- package/dist/features/support/repository/support.repository.d.ts +14 -3
- package/dist/features/support/repository/support.repository.js +93 -13
- package/dist/features/support/schemas/firestore.d.ts +16 -5
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +96 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +4 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +478 -0
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +54 -32
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +3 -2
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +73 -0
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +340 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
- package/dist/features/tester/seed-data/authored/index.js +24 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +1 -0
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +57 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +77 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +58 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +284 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +558 -34
- package/dist/index.d.ts +27 -80
- package/dist/index.js +62 -115
- package/dist/next/api/routeHandler.js +9 -0
- package/dist/next/routing/require-record.d.ts +13 -0
- package/dist/next/routing/require-record.js +62 -0
- package/dist/next/routing/route-map.d.ts +46 -5
- package/dist/next/routing/route-map.js +70 -3
- package/dist/providers/db-firebase/base.d.ts +4 -2
- package/dist/providers/db-firebase/base.js +21 -5
- package/dist/providers/db-firebase/base.repository.d.ts +33 -9
- package/dist/providers/db-firebase/base.repository.js +55 -0
- package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
- package/dist/providers/db-firebase/rtdb-paths.js +12 -0
- package/dist/react/ErrorBoundary.js +6 -1
- package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
- package/dist/react/hooks/realtime-event-constants.js +8 -0
- package/dist/react/hooks/useEntityDelete.js +5 -1
- package/dist/react/hooks/useMessage.js +5 -1
- package/dist/repositories/index.d.ts +2 -2
- package/dist/repositories/index.js +6 -1
- package/dist/schemas/registry.d.ts +28 -26
- package/dist/schemas/registry.js +31 -14
- package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
- package/dist/security/blind-index-tokens.d.ts +54 -0
- package/dist/security/blind-index-tokens.js +152 -0
- package/dist/security/encrypted.d.ts +117 -0
- package/dist/security/encrypted.js +100 -0
- package/dist/security/index.d.ts +6 -3
- package/dist/security/index.js +17 -3
- package/dist/security/pii-accessors.d.ts +71 -0
- package/dist/security/pii-accessors.js +150 -0
- package/dist/security/pii-encrypt.d.ts +0 -8
- package/dist/security/pii-encrypt.js +22 -15
- package/dist/security/pii-mask.d.ts +18 -0
- package/dist/security/pii-mask.js +27 -0
- package/dist/security/settings-encryption.d.ts +35 -0
- package/dist/security/settings-encryption.js +91 -0
- package/dist/seed/_helpers/brand-rows.js +38 -14
- package/dist/seed/_helpers/category-forest.js +73 -7
- package/dist/seed/_helpers/category-images-generated.d.ts +25 -6
- package/dist/seed/_helpers/category-images-generated.js +81 -6
- package/dist/seed/_helpers/category-models.d.ts +1 -1
- package/dist/seed/_helpers/category-models.js +7 -1
- package/dist/seed/_helpers/category-parts-glossary-map.js +8 -0
- package/dist/seed/_helpers/category-parts.d.ts +1 -1
- package/dist/seed/_helpers/category-parts.js +50 -2
- package/dist/seed/_helpers/character-features.d.ts +1 -1
- package/dist/seed/_helpers/character-features.js +2 -1
- package/dist/seed/_helpers/franchise-rows.js +10 -2
- package/dist/seed/_helpers/media.d.ts +47 -0
- package/dist/seed/_helpers/media.js +34 -0
- package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
- package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
- package/dist/seed/addresses-seed-data.d.ts +2 -2
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +78 -0
- package/dist/seed/authenticity-knowledge-seed-data.js +10729 -0
- package/dist/seed/bids-seed-data.d.ts +2 -2
- package/dist/seed/bids-seed-data.js +23 -2
- package/dist/seed/categories-seed-data.js +124 -20
- package/dist/seed/events-seed-data.d.ts +2 -2
- package/dist/seed/events-seed-data.js +5 -0
- package/dist/seed/faq-seed-data.js +175 -5
- package/dist/seed/grouped-listings-seed-data.js +16 -0
- package/dist/seed/homepage-sections-seed-data.js +131 -26
- package/dist/seed/index.d.ts +3 -3
- package/dist/seed/index.js +3 -2
- package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
- package/dist/seed/manifest.js +3 -0
- package/dist/seed/media-assets-seed-data.d.ts +1 -1
- package/dist/seed/media-assets-seed-data.js +746 -196
- package/dist/seed/model-composition-seed-data.js +122 -6
- package/dist/seed/offers-seed-data.d.ts +2 -2
- package/dist/seed/offers-seed-data.js +1 -1
- package/dist/seed/orders-seed-data.d.ts +2 -2
- package/dist/seed/part-glossary-seed-data.d.ts +1 -1
- package/dist/seed/part-glossary-seed-data.js +37219 -463
- package/dist/seed/payouts-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.js +1 -1
- package/dist/seed/products-art-seed-data.js +7 -18
- package/dist/seed/products-auctions-seed-data.js +56 -47
- package/dist/seed/products-beyblade-x-seed-data.d.ts +2 -0
- package/dist/seed/products-beyblade-x-seed-data.js +441 -0
- package/dist/seed/products-catalogue-seed-data.d.ts +5 -5
- package/dist/seed/products-catalogue-seed-data.js +1500 -1240
- package/dist/seed/products-classifieds-seed-data.js +9 -27
- package/dist/seed/products-digital-codes-seed-data.js +9 -18
- package/dist/seed/products-live-items-seed-data.js +5 -13
- package/dist/seed/products-preorders-seed-data.js +67 -33
- package/dist/seed/products-prize-draws-seed-data.js +8 -17
- package/dist/seed/products-spares-seed-data.d.ts +2 -0
- package/dist/seed/products-spares-seed-data.js +368 -0
- package/dist/seed/products-standard-seed-data.js +39 -126
- package/dist/seed/products-stickers-seed-data.js +59 -15
- package/dist/seed/reviews-seed-data.d.ts +1 -2
- package/dist/seed/seed-purpose.js +7 -0
- package/dist/seed/sessions-seed-data.d.ts +2 -2
- package/dist/seed/sessions-seed-data.js +5 -0
- package/dist/seed/site-settings-seed-data.js +9 -1
- package/dist/seed/support-tickets-seed-data.d.ts +2 -2
- package/dist/seed/support-tickets-seed-data.js +1 -1
- package/dist/seed/users-seed-data.d.ts +2 -2
- package/dist/seed/users-seed-data.js +1 -1
- package/dist/seo/json-ld.d.ts +25 -0
- package/dist/seo/json-ld.js +33 -1
- package/dist/server-entry.d.ts +3 -1
- package/dist/server-entry.js +2 -2
- package/dist/server.d.ts +27 -12
- package/dist/server.js +86 -28
- package/dist/styles.css +438 -1
- package/dist/tailwind-input.css +31 -17
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Accordion.js +1 -1
- package/dist/ui/components/Breadcrumb.js +1 -1
- package/dist/ui/components/Button.js +7 -1
- package/dist/ui/components/DetailPageGallery.js +0 -2
- package/dist/ui/components/DetailPageHero.js +0 -1
- package/dist/ui/components/DetailPageTabs.js +1 -1
- package/dist/ui/components/Divider.js +3 -3
- package/dist/ui/components/FilterChipGroup.d.ts +11 -0
- package/dist/ui/components/FilterChipGroup.js +1 -1
- package/dist/ui/components/GatedPrice.js +5 -1
- package/dist/ui/components/HorizontalScroller.js +1 -1
- package/dist/ui/components/ImageGallery.js +6 -1
- package/dist/ui/components/ListingLayout.js +17 -11
- package/dist/ui/components/MediaTabs.style.css +81 -0
- package/dist/ui/components/OverflowRow.d.ts +92 -0
- package/dist/ui/components/OverflowRow.js +203 -0
- package/dist/ui/components/OverflowRow.style.css +235 -0
- package/dist/ui/components/Pagination.js +1 -1
- package/dist/ui/components/PendingValue.d.ts +45 -0
- package/dist/ui/components/PendingValue.js +7 -0
- package/dist/ui/components/Radio.style.css +119 -0
- package/dist/ui/components/RatingDisplay.js +2 -2
- package/dist/ui/components/RecordDetailModal.js +14 -1
- package/dist/ui/components/RowActionMenu.js +5 -1
- package/dist/ui/components/SettingsSection.js +0 -2
- package/dist/ui/components/SideDrawer.js +5 -1
- package/dist/ui/components/SideModal.js +9 -1
- package/dist/ui/components/SiteLogo.js +3 -0
- package/dist/ui/components/SiteMark.js +3 -0
- package/dist/ui/components/SortDropdown.js +1 -1
- package/dist/ui/components/SpecTable.d.ts +58 -0
- package/dist/ui/components/SpecTable.js +8 -0
- package/dist/ui/components/StarRating.js +1 -3
- package/dist/ui/components/SummaryCard.js +1 -1
- package/dist/ui/components/TabBarShell.d.ts +12 -1
- package/dist/ui/components/TabBarShell.js +3 -2
- package/dist/ui/components/Tabs.js +36 -24
- package/dist/ui/components/Toast.d.ts +3 -24
- package/dist/ui/components/Toast.js +2 -19
- package/dist/ui/components/TopBannerPortal.d.ts +15 -0
- package/dist/ui/components/TopBannerPortal.js +19 -0
- package/dist/ui/components/UnsavedChangesModal.js +5 -1
- package/dist/ui/components/index.style.css +2 -0
- package/dist/ui/components/row-collapse.d.ts +15 -0
- package/dist/ui/components/row-collapse.js +127 -0
- package/dist/ui/components/toast-context.d.ts +63 -0
- package/dist/ui/components/toast-context.js +48 -0
- package/dist/ui/components/top-banner-slot.d.ts +37 -0
- package/dist/ui/components/top-banner-slot.js +45 -0
- package/dist/ui/icons/icon-registry.d.ts +7 -0
- package/dist/ui/icons/icon-registry.js +25 -1
- package/dist/ui/index.d.ts +6 -0
- package/dist/ui/index.js +3 -0
- package/dist/utils/array.helper.d.ts +2 -2
- package/dist/utils/array.helper.js +5 -5
- package/dist/utils/id-generators.d.ts +6 -0
- package/dist/utils/id-generators.js +10 -0
- package/dist/utils/media-url.js +0 -2
- package/dist/utils/search-txt-builders.d.ts +28 -4
- package/dist/utils/search-txt-builders.js +41 -1
- package/dist/utils/search-txt-query.d.ts +12 -0
- package/dist/utils/search-txt-query.js +12 -0
- package/dist/validation/schemas.d.ts +8 -8
- package/package.json +6 -2
- package/scripts/dedupe-peer-deps.mjs +18 -0
- package/scripts/seed-cli.mjs +138 -26
- package/scripts/verify-css-build.mjs +118 -37
- package/dist/_internal/server/features/search/actions.d.ts +0 -7
- package/dist/_internal/server/features/search/actions.js +0 -21
- package/dist/_internal/server/features/search/data.d.ts +0 -15
- package/dist/_internal/server/features/search/data.js +0 -18
- package/dist/_internal/server/features/search/index.d.ts +0 -3
- package/dist/_internal/server/features/search/index.js +0 -2
- package/dist/features/account/components/UserAddressesView.d.ts +0 -13
- package/dist/features/account/components/UserAddressesView.js +0 -5
- package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
- package/dist/features/account/components/UserNotificationsView.js +0 -12
- package/dist/features/account/components/UserSettingsView.d.ts +0 -16
- package/dist/features/account/components/UserSettingsView.js +0 -13
- package/dist/features/account/components/UserSupportView.d.ts +0 -3
- package/dist/features/account/components/UserSupportView.js +0 -166
- package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
- package/dist/features/admin/components/DemoSeedView.js +0 -5
- package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
- package/dist/features/auth/components/AuthStatusPanel.js +0 -22
- package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
- package/dist/features/categories/components/CategoryProductsView.js +0 -21
- package/dist/features/homepage/api/[id]/route.d.ts +0 -23
- package/dist/features/homepage/api/[id]/route.js +0 -103
- package/dist/features/homepage/api/route.d.ts +0 -14
- package/dist/features/homepage/api/route.js +0 -140
- package/dist/features/homepage/api/sections/[id]/route.d.ts +0 -26
- package/dist/features/homepage/api/sections/[id]/route.js +0 -95
- package/dist/features/homepage/api/sections/route.d.ts +0 -13
- package/dist/features/homepage/api/sections/route.js +0 -82
- package/dist/features/homepage/components/AdvertisementBanner.d.ts +0 -14
- package/dist/features/homepage/components/AdvertisementBanner.js +0 -35
- package/dist/features/homepage/components/BeforeAfterCard.d.ts +0 -9
- package/dist/features/homepage/components/BeforeAfterCard.js +0 -73
- package/dist/features/homepage/components/FeaturedResultsSection.d.ts +0 -17
- package/dist/features/homepage/components/FeaturedResultsSection.js +0 -17
- package/dist/features/homepage/components/HeroBanner.d.ts +0 -7
- package/dist/features/homepage/components/HeroBanner.js +0 -43
- package/dist/features/homepage/components/HeroSection.d.ts +0 -7
- package/dist/features/homepage/components/HeroSection.js +0 -6
- package/dist/features/homepage/components/HomepageSkeleton.d.ts +0 -2
- package/dist/features/homepage/components/HomepageSkeleton.js +0 -21
- package/dist/features/homepage/components/HomepageView.d.ts +0 -25
- package/dist/features/homepage/components/HomepageView.js +0 -5
- package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
- package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
- package/dist/features/homepage/components/NewsletterBanner.d.ts +0 -23
- package/dist/features/homepage/components/NewsletterBanner.js +0 -37
- package/dist/features/homepage/components/SiteFeaturesSection.d.ts +0 -14
- package/dist/features/homepage/components/SiteFeaturesSection.js +0 -11
- package/dist/features/homepage/components/TrustBadges.d.ts +0 -6
- package/dist/features/homepage/components/TrustBadges.js +0 -46
- package/dist/features/homepage/components/TrustIndicatorsSection.d.ts +0 -12
- package/dist/features/homepage/components/TrustIndicatorsSection.js +0 -11
- package/dist/features/homepage/hooks/useHomepage.d.ts +0 -11
- package/dist/features/homepage/hooks/useHomepage.js +0 -17
- package/dist/features/homepage/hooks/useHomepageSections.d.ts +0 -2
- package/dist/features/homepage/hooks/useHomepageSections.js +0 -10
- package/dist/features/homepage/repository/homepage.repository.d.ts +0 -11
- package/dist/features/homepage/repository/homepage.repository.js +0 -25
- package/dist/features/layout/BottomActions.d.ts +0 -1
- package/dist/features/layout/BottomActions.js +0 -311
- package/dist/features/products/components/ProductsView.d.ts +0 -6
- package/dist/features/products/components/ProductsView.js +0 -5
- package/dist/features/search/actions/index.d.ts +0 -1
- package/dist/features/search/actions/index.js +0 -1
- package/dist/features/search/actions/search-actions.d.ts +0 -18
- package/dist/features/search/actions/search-actions.js +0 -43
- package/dist/features/search/api/route.d.ts +0 -22
- package/dist/features/search/api/route.js +0 -128
- package/dist/features/search/columns/index.d.ts +0 -17
- package/dist/features/search/columns/index.js +0 -49
- package/dist/features/search/components/SearchFiltersRow.d.ts +0 -22
- package/dist/features/search/components/SearchFiltersRow.js +0 -21
- package/dist/features/search/components/SearchResultsSection.d.ts +0 -53
- package/dist/features/search/components/SearchResultsSection.js +0 -35
- package/dist/features/search/components/SearchView.d.ts +0 -27
- package/dist/features/search/components/SearchView.js +0 -8
- package/dist/features/search/hooks/useSearch.d.ts +0 -21
- package/dist/features/search/hooks/useSearch.js +0 -33
- package/dist/features/search/repository/search.repository.d.ts +0 -14
- package/dist/features/search/repository/search.repository.js +0 -59
- package/dist/features/search/schemas/index.d.ts +0 -70
- package/dist/features/search/schemas/index.js +0 -36
- package/dist/features/search/types/index.d.ts +0 -48
- package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
- package/dist/features/seller/components/SellerStoreView.js +0 -8
- package/dist/features/stores/components/StoreScopedSearch.d.ts +0 -17
- package/dist/features/stores/components/StoreScopedSearch.js +0 -27
- package/dist/seed/defaults/homepage-sections.d.ts +0 -2
- package/dist/seed/defaults/homepage-sections.js +0 -60
- package/dist/seed/factories/homepage-section.factory.d.ts +0 -10
- package/dist/seed/factories/homepage-section.factory.js +0 -13
- /package/dist/{features/search/types/index.js → _internal/shared/listing-types/spares/og.d.ts} +0 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import type { CutPath, Rect } from "../../../shared/features/sticker-trace/types";
|
|
2
|
+
/**
|
|
3
|
+
* Everything this feature writes lives under here.
|
|
4
|
+
*
|
|
5
|
+
* 🛑 The one-line claim this used to carry — "nothing under here is reachable
|
|
6
|
+
* without a signed URL minted by this module" — was FALSE, in the same way the
|
|
7
|
+
* identical claim on `DIGITAL_CONTENT_PREFIX` was: `/media/[...slug]`'s
|
|
8
|
+
* raw-path fallback resolved any multi-segment slug as a literal storage path,
|
|
9
|
+
* so `/media/private/sticker-sheets/...` served these objects, watermarked, to
|
|
10
|
+
* anyone. Unlike digital-content's `randomUUID()` names, a part is written as
|
|
11
|
+
* `part-003.png` — guessable on the first try.
|
|
12
|
+
*
|
|
13
|
+
* The proxy now refuses a raw `private/` path outright. What is true is
|
|
14
|
+
* narrower than the old sentence and worth stating precisely: **no public URL
|
|
15
|
+
* exists for one of these objects unless something deliberately mints a
|
|
16
|
+
* `mediaAssets` row for it.** A row is what creates a `/media/{shortId}` slug,
|
|
17
|
+
* and a resolved row is intentionally still allowed through the proxy — that is
|
|
18
|
+
* how a promoted part gets a watermarked marketplace copy with no byte
|
|
19
|
+
* duplicated. The unwatermarked printable original has no row and is reachable
|
|
20
|
+
* only by a signed URL from this module.
|
|
21
|
+
*/
|
|
22
|
+
export declare const SCAN_ROOT = "private/sticker-sheets";
|
|
23
|
+
export declare function runPrefix(sheetId: string, runId: string): string;
|
|
24
|
+
export interface SignedUpload {
|
|
25
|
+
/** PUT here with the exact `contentType`, or the signature will not match. */
|
|
26
|
+
uploadUrl: string;
|
|
27
|
+
/** Hand back to `finalizeScanUpload`. Never returned to a client afterwards. */
|
|
28
|
+
assetPath: string;
|
|
29
|
+
expiresAt: Date;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Mint a one-object write URL for a scan.
|
|
33
|
+
*
|
|
34
|
+
* 🛑 `contentType` is BOUND INTO THE SIGNATURE. A client that PUTs different
|
|
35
|
+
* bytes than it declared gets a 403 from GCS rather than a stored lie — which
|
|
36
|
+
* is the cheap half of the guarantee. The expensive half is `finalizeScanUpload`
|
|
37
|
+
* below, because a matching header still proves nothing about the content.
|
|
38
|
+
*/
|
|
39
|
+
export declare function signScanUpload(input: {
|
|
40
|
+
sheetId: string;
|
|
41
|
+
runId: string;
|
|
42
|
+
contentType: string;
|
|
43
|
+
extension: string;
|
|
44
|
+
}): Promise<SignedUpload>;
|
|
45
|
+
export type FinalizeResult = {
|
|
46
|
+
ok: true;
|
|
47
|
+
contentType: string;
|
|
48
|
+
bytes: number;
|
|
49
|
+
} | {
|
|
50
|
+
ok: false;
|
|
51
|
+
code: "MISSING" | "MIME_MISMATCH" | "TOO_LARGE";
|
|
52
|
+
message: string;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Prove the uploaded object is the image it claims to be.
|
|
56
|
+
*
|
|
57
|
+
* 🛑 The DECLARED type is not evidence, and a mismatch DELETES the object.
|
|
58
|
+
* Leaving it would mean an arbitrary file sitting in our bucket at a path our
|
|
59
|
+
* own code will later hand a signed URL for. The same magic-byte discipline as
|
|
60
|
+
* `/api/media/finalize`, which emits a structured 422 for exactly this.
|
|
61
|
+
*
|
|
62
|
+
* Reads only the first 4 KB — magic bytes live in the first few, and
|
|
63
|
+
* downloading a 79 MB scan into a Vercel function to inspect its header would
|
|
64
|
+
* be the egress mistake this module exists to prevent.
|
|
65
|
+
*/
|
|
66
|
+
export declare function finalizeScanUpload(assetPath: string, maxBytes: number): Promise<FinalizeResult>;
|
|
67
|
+
/**
|
|
68
|
+
* A short-lived read URL for one private object.
|
|
69
|
+
*
|
|
70
|
+
* 🛑 The CALLER is responsible for having authorised the request. This function
|
|
71
|
+
* mints capability and checks nothing — it cannot, because it does not see the
|
|
72
|
+
* session. Every call site must sit behind `createRouteHandler`'s admin gate.
|
|
73
|
+
*
|
|
74
|
+
* SVG is forced to `attachment`: it is deliberately excluded from
|
|
75
|
+
* `ALLOWED_IMAGE_MIMES` as an XSS surface, and a signed GCS URL is still our
|
|
76
|
+
* origin's data. The canvas draws cut lines from `geometry.json`, never by
|
|
77
|
+
* rendering the SVG.
|
|
78
|
+
*/
|
|
79
|
+
export declare function signedReadUrl(assetPath: string, opts?: {
|
|
80
|
+
downloadAs?: string;
|
|
81
|
+
}): Promise<{
|
|
82
|
+
url: string;
|
|
83
|
+
expiresAt: Date;
|
|
84
|
+
}>;
|
|
85
|
+
/** Save an artifact the tracer produced. Server-side only — never a client upload. */
|
|
86
|
+
export declare function writeRunArtifact(input: {
|
|
87
|
+
sheetId: string;
|
|
88
|
+
runId: string;
|
|
89
|
+
name: string;
|
|
90
|
+
contentType: string;
|
|
91
|
+
body: Buffer | Uint8Array;
|
|
92
|
+
}): Promise<{
|
|
93
|
+
assetPath: string;
|
|
94
|
+
bytes: number;
|
|
95
|
+
}>;
|
|
96
|
+
/**
|
|
97
|
+
* Delete everything one run wrote.
|
|
98
|
+
*
|
|
99
|
+
* `deleteFiles` pages internally, so this is safe on a `max`-tier run that
|
|
100
|
+
* produced sixty parts plus exports — unlike a hand-batched delete, which is
|
|
101
|
+
* the shape that died with `Transaction too big` on `categories`.
|
|
102
|
+
*/
|
|
103
|
+
export declare function deleteRunTree(sheetId: string, runId: string): Promise<void>;
|
|
104
|
+
/** Delete a whole sheet: the scan, and every run under it. */
|
|
105
|
+
export declare function deleteSheetTree(sheetId: string): Promise<void>;
|
|
106
|
+
/**
|
|
107
|
+
* Total stored bytes and object count under one sheet, for the usage meter.
|
|
108
|
+
*
|
|
109
|
+
* 🛑 A quota only discoverable in the GCP console is a quota nobody watches —
|
|
110
|
+
* the same failure as Root Cause #104, where the first signal was a billing
|
|
111
|
+
* page. This is what makes "keep every run" a safe default rather than a
|
|
112
|
+
* deferred surprise.
|
|
113
|
+
*/
|
|
114
|
+
export declare function measureSheetBytes(sheetId: string): Promise<{
|
|
115
|
+
bytes: number;
|
|
116
|
+
objects: number;
|
|
117
|
+
}>;
|
|
118
|
+
/**
|
|
119
|
+
* Download a stored object's bytes.
|
|
120
|
+
*
|
|
121
|
+
* 🛑 Takes a RAW assetPath, which is only ever a value this module produced —
|
|
122
|
+
* `sourceScan.assetPath` or a `runPrefix`-derived artifact path. It must never
|
|
123
|
+
* be fed a client-supplied string: the bucket's storage rule is
|
|
124
|
+
* `allow read: if true`, so path containment is enforced here or nowhere.
|
|
125
|
+
*/
|
|
126
|
+
export declare function readScanBytes(assetPath: string): Promise<Uint8Array>;
|
|
127
|
+
/**
|
|
128
|
+
* The shape the coordinator writes and the shards read back.
|
|
129
|
+
*
|
|
130
|
+
* 🛑 `path` is declared because the coordinator ALREADY writes it — the first
|
|
131
|
+
* version of this interface omitted it, which made the shard's rasterise
|
|
132
|
+
* dependency take an `ordinal` it could not turn into a mask, and the only way
|
|
133
|
+
* to implement that honestly was a second geometry read per part inside a
|
|
134
|
+
* sixty-iteration loop. The field was always in the JSON; the type just did
|
|
135
|
+
* not say so.
|
|
136
|
+
*/
|
|
137
|
+
export interface RunGeometry {
|
|
138
|
+
workingSize: Rect;
|
|
139
|
+
parts: {
|
|
140
|
+
ordinal: number;
|
|
141
|
+
bbox: Rect;
|
|
142
|
+
path: CutPath;
|
|
143
|
+
}[];
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Read and parse a run's `geometry.json`.
|
|
147
|
+
*
|
|
148
|
+
* 🛑 Parsed HERE rather than in the shard, so the one place that knows the
|
|
149
|
+
* artifact's name also owns its shape. A shard assembling the path itself
|
|
150
|
+
* would be a second definition of the layout — and the `parts` array is what
|
|
151
|
+
* every shard slices, so a disagreement renders the wrong crops rather than
|
|
152
|
+
* failing.
|
|
153
|
+
*/
|
|
154
|
+
export declare function readRunGeometry(runId: string, sheetId: string): Promise<RunGeometry>;
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Scans and artifacts are private bytes that must never be watermarked,
|
|
3
|
+
* never be publicly addressable, and never traverse Vercel.
|
|
4
|
+
* WHAT: Paths, the signed upload/read pair, magic-byte finalize, and tree
|
|
5
|
+
* deletion.
|
|
6
|
+
*
|
|
7
|
+
* 🛑 THREE RULES, each closing a failure this project has already paid for.
|
|
8
|
+
*
|
|
9
|
+
* 1. NOT through /api/media/[...slug]. That route applies NO authentication —
|
|
10
|
+
* deliberately, because its job is public product photography — and it
|
|
11
|
+
* ALWAYS watermarks (`resolveWatermarkConfig` has no skip path), which would
|
|
12
|
+
* ruin a cut-out and make the printed mosaic unusable. See § "Digital
|
|
13
|
+
* Content Delivery" for the same decision made for purchased assets.
|
|
14
|
+
*
|
|
15
|
+
* 2. NO `mediaAssets` row. That row IS the public `/media/{shortId}` slug — the
|
|
16
|
+
* resolver looks up `mediaAssets/{slug}` to find `storagePath` — so no row
|
|
17
|
+
* means no public URL exists at all. Object names are RANDOM, against the
|
|
18
|
+
* SEO-slug convention used everywhere else, because media filenames here are
|
|
19
|
+
* content-derived and therefore guessable, and guessable is the one property
|
|
20
|
+
* a private asset must not have.
|
|
21
|
+
*
|
|
22
|
+
* 3. VERCEL RETURNS JSON, NEVER BYTES. Every binary is fetched by the browser
|
|
23
|
+
* straight from GCS with a 5-minute signed URL; the route returns
|
|
24
|
+
* `{ url, expiresAt }`. Vercel's Fast Origin Transfer allowance is 10 GB and
|
|
25
|
+
* exceeding it PAUSED this project once already — 52.52 GB against that 10 GB
|
|
26
|
+
* (Root Cause #104). Cloud Storage's own egress allowance is ten times
|
|
27
|
+
* larger and is not a cliff.
|
|
28
|
+
*
|
|
29
|
+
* Accepted residue, stated rather than hidden: a signed URL is a 5-minute
|
|
30
|
+
* bearer token. Acceptable here because an admin's own scan is not a paid
|
|
31
|
+
* good — which was the precise reason `digital-content` refused this and
|
|
32
|
+
* streams through its route instead.
|
|
33
|
+
*
|
|
34
|
+
* EXPORTS: SCAN_ROOT, runPrefix, signScanUpload, finalizeScanUpload,
|
|
35
|
+
* signedReadUrl, writeRunArtifact, deleteRunTree, deleteSheetTree,
|
|
36
|
+
* measureSheetBytes
|
|
37
|
+
*
|
|
38
|
+
* @tag domain:sticker-trace
|
|
39
|
+
* @tag layer:server
|
|
40
|
+
* @tag pattern:none
|
|
41
|
+
* @tag access:server
|
|
42
|
+
* @tag consumers:api/admin/sticker-sheets,functions/sticker-trace
|
|
43
|
+
* @tag sideEffects:storage
|
|
44
|
+
*/
|
|
45
|
+
import { normalizeError } from "../../../../errors/normalize.js";
|
|
46
|
+
import { serverLogger } from "../../../../monitoring/index.js";
|
|
47
|
+
import { getAdminStorage } from "../../../../providers/db-firebase/index.js";
|
|
48
|
+
/**
|
|
49
|
+
* Everything this feature writes lives under here.
|
|
50
|
+
*
|
|
51
|
+
* 🛑 The one-line claim this used to carry — "nothing under here is reachable
|
|
52
|
+
* without a signed URL minted by this module" — was FALSE, in the same way the
|
|
53
|
+
* identical claim on `DIGITAL_CONTENT_PREFIX` was: `/media/[...slug]`'s
|
|
54
|
+
* raw-path fallback resolved any multi-segment slug as a literal storage path,
|
|
55
|
+
* so `/media/private/sticker-sheets/...` served these objects, watermarked, to
|
|
56
|
+
* anyone. Unlike digital-content's `randomUUID()` names, a part is written as
|
|
57
|
+
* `part-003.png` — guessable on the first try.
|
|
58
|
+
*
|
|
59
|
+
* The proxy now refuses a raw `private/` path outright. What is true is
|
|
60
|
+
* narrower than the old sentence and worth stating precisely: **no public URL
|
|
61
|
+
* exists for one of these objects unless something deliberately mints a
|
|
62
|
+
* `mediaAssets` row for it.** A row is what creates a `/media/{shortId}` slug,
|
|
63
|
+
* and a resolved row is intentionally still allowed through the proxy — that is
|
|
64
|
+
* how a promoted part gets a watermarked marketplace copy with no byte
|
|
65
|
+
* duplicated. The unwatermarked printable original has no row and is reachable
|
|
66
|
+
* only by a signed URL from this module.
|
|
67
|
+
*/
|
|
68
|
+
export const SCAN_ROOT = "private/sticker-sheets";
|
|
69
|
+
/** How long a read URL lives. Long enough to fetch, short enough to be useless if leaked. */
|
|
70
|
+
const READ_TTL_MS = 5 * 60 * 1000;
|
|
71
|
+
/** An upload may take a while on a 79 MB PNG over a domestic uplink. */
|
|
72
|
+
const UPLOAD_TTL_MS = 15 * 60 * 1000;
|
|
73
|
+
/** Magic-byte families a scan may legitimately be. */
|
|
74
|
+
const ALLOWED_SCAN_MIMES = new Set([
|
|
75
|
+
"image/jpeg",
|
|
76
|
+
"image/png",
|
|
77
|
+
"image/webp",
|
|
78
|
+
"image/tiff",
|
|
79
|
+
"image/bmp",
|
|
80
|
+
]);
|
|
81
|
+
export function runPrefix(sheetId, runId) {
|
|
82
|
+
return `${SCAN_ROOT}/${sheetId}/${runId}`;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* A random object name, with the caller's extension preserved for tooling only.
|
|
86
|
+
*
|
|
87
|
+
* `crypto.randomUUID` rather than a slug: see rule 2 in the header. The
|
|
88
|
+
* original name is NOT used — a human-supplied filename is both guessable and
|
|
89
|
+
* a path-traversal surface.
|
|
90
|
+
*/
|
|
91
|
+
function randomObjectName(extension) {
|
|
92
|
+
const ext = /^[a-z0-9]{1,5}$/i.test(extension) ? extension.toLowerCase() : "bin";
|
|
93
|
+
return `${globalThis.crypto.randomUUID()}.${ext}`;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Mint a one-object write URL for a scan.
|
|
97
|
+
*
|
|
98
|
+
* 🛑 `contentType` is BOUND INTO THE SIGNATURE. A client that PUTs different
|
|
99
|
+
* bytes than it declared gets a 403 from GCS rather than a stored lie — which
|
|
100
|
+
* is the cheap half of the guarantee. The expensive half is `finalizeScanUpload`
|
|
101
|
+
* below, because a matching header still proves nothing about the content.
|
|
102
|
+
*/
|
|
103
|
+
export async function signScanUpload(input) {
|
|
104
|
+
const assetPath = `${runPrefix(input.sheetId, input.runId)}/${randomObjectName(input.extension)}`;
|
|
105
|
+
const expiresAt = new Date(Date.now() + UPLOAD_TTL_MS);
|
|
106
|
+
const [uploadUrl] = await getAdminStorage()
|
|
107
|
+
.bucket()
|
|
108
|
+
.file(assetPath)
|
|
109
|
+
.getSignedUrl({
|
|
110
|
+
version: "v4",
|
|
111
|
+
action: "write",
|
|
112
|
+
expires: expiresAt,
|
|
113
|
+
contentType: input.contentType,
|
|
114
|
+
});
|
|
115
|
+
return { uploadUrl, assetPath, expiresAt };
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Prove the uploaded object is the image it claims to be.
|
|
119
|
+
*
|
|
120
|
+
* 🛑 The DECLARED type is not evidence, and a mismatch DELETES the object.
|
|
121
|
+
* Leaving it would mean an arbitrary file sitting in our bucket at a path our
|
|
122
|
+
* own code will later hand a signed URL for. The same magic-byte discipline as
|
|
123
|
+
* `/api/media/finalize`, which emits a structured 422 for exactly this.
|
|
124
|
+
*
|
|
125
|
+
* Reads only the first 4 KB — magic bytes live in the first few, and
|
|
126
|
+
* downloading a 79 MB scan into a Vercel function to inspect its header would
|
|
127
|
+
* be the egress mistake this module exists to prevent.
|
|
128
|
+
*/
|
|
129
|
+
export async function finalizeScanUpload(assetPath, maxBytes) {
|
|
130
|
+
const file = getAdminStorage().bucket().file(assetPath);
|
|
131
|
+
let bytes = 0;
|
|
132
|
+
try {
|
|
133
|
+
const [meta] = await file.getMetadata();
|
|
134
|
+
bytes = Number(meta.size ?? 0);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
const n = normalizeError(err);
|
|
138
|
+
serverLogger.warn("Sticker scan finalize: object missing", { assetPath, message: n.message });
|
|
139
|
+
return { ok: false, code: "MISSING", message: "The upload did not complete." };
|
|
140
|
+
}
|
|
141
|
+
if (bytes > maxBytes) {
|
|
142
|
+
await deleteObject(assetPath);
|
|
143
|
+
return {
|
|
144
|
+
ok: false,
|
|
145
|
+
code: "TOO_LARGE",
|
|
146
|
+
message: `That scan is ${(bytes / 1048576).toFixed(1)} MB; the limit is ${(maxBytes / 1048576).toFixed(0)} MB.`,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const [head] = await file.download({ start: 0, end: 4095 });
|
|
151
|
+
const { fileTypeFromBuffer } = await import("file-type");
|
|
152
|
+
const detected = await fileTypeFromBuffer(head);
|
|
153
|
+
if (!detected || !ALLOWED_SCAN_MIMES.has(detected.mime)) {
|
|
154
|
+
await deleteObject(assetPath);
|
|
155
|
+
return {
|
|
156
|
+
ok: false,
|
|
157
|
+
code: "MIME_MISMATCH",
|
|
158
|
+
message: "That file is not a readable image. Upload a JPEG, PNG, WebP, TIFF or BMP scan.",
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
return { ok: true, contentType: detected.mime, bytes };
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
const n = normalizeError(err);
|
|
165
|
+
serverLogger.error("Sticker scan finalize: magic-byte read failed", {
|
|
166
|
+
assetPath,
|
|
167
|
+
message: n.message,
|
|
168
|
+
});
|
|
169
|
+
// 🛑 Fails CLOSED and deletes. An object we could not verify must not stay
|
|
170
|
+
// at a path this module will later sign a URL for.
|
|
171
|
+
await deleteObject(assetPath);
|
|
172
|
+
return { ok: false, code: "MIME_MISMATCH", message: "The upload could not be verified." };
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* A short-lived read URL for one private object.
|
|
177
|
+
*
|
|
178
|
+
* 🛑 The CALLER is responsible for having authorised the request. This function
|
|
179
|
+
* mints capability and checks nothing — it cannot, because it does not see the
|
|
180
|
+
* session. Every call site must sit behind `createRouteHandler`'s admin gate.
|
|
181
|
+
*
|
|
182
|
+
* SVG is forced to `attachment`: it is deliberately excluded from
|
|
183
|
+
* `ALLOWED_IMAGE_MIMES` as an XSS surface, and a signed GCS URL is still our
|
|
184
|
+
* origin's data. The canvas draws cut lines from `geometry.json`, never by
|
|
185
|
+
* rendering the SVG.
|
|
186
|
+
*/
|
|
187
|
+
export async function signedReadUrl(assetPath, opts) {
|
|
188
|
+
const expiresAt = new Date(Date.now() + READ_TTL_MS);
|
|
189
|
+
const forceDownload = opts?.downloadAs || /\.svg$/i.test(assetPath);
|
|
190
|
+
const [url] = await getAdminStorage()
|
|
191
|
+
.bucket()
|
|
192
|
+
.file(assetPath)
|
|
193
|
+
.getSignedUrl({
|
|
194
|
+
version: "v4",
|
|
195
|
+
action: "read",
|
|
196
|
+
expires: expiresAt,
|
|
197
|
+
...(forceDownload
|
|
198
|
+
? {
|
|
199
|
+
responseDisposition: `attachment; filename="${(opts?.downloadAs ?? "cut.svg").replace(/"/g, "")}"`,
|
|
200
|
+
}
|
|
201
|
+
: {}),
|
|
202
|
+
});
|
|
203
|
+
return { url, expiresAt };
|
|
204
|
+
}
|
|
205
|
+
/** Save an artifact the tracer produced. Server-side only — never a client upload. */
|
|
206
|
+
export async function writeRunArtifact(input) {
|
|
207
|
+
const assetPath = `${runPrefix(input.sheetId, input.runId)}/${input.name}`;
|
|
208
|
+
const buffer = Buffer.isBuffer(input.body) ? input.body : Buffer.from(input.body);
|
|
209
|
+
await getAdminStorage()
|
|
210
|
+
.bucket()
|
|
211
|
+
.file(assetPath)
|
|
212
|
+
.save(buffer, { contentType: input.contentType, resumable: false });
|
|
213
|
+
return { assetPath, bytes: buffer.byteLength };
|
|
214
|
+
}
|
|
215
|
+
async function deleteObject(assetPath) {
|
|
216
|
+
try {
|
|
217
|
+
await getAdminStorage().bucket().file(assetPath).delete({ ignoreNotFound: true });
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
const n = normalizeError(err);
|
|
221
|
+
serverLogger.warn("Sticker trace object delete failed", { assetPath, message: n.message });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Delete everything one run wrote.
|
|
226
|
+
*
|
|
227
|
+
* `deleteFiles` pages internally, so this is safe on a `max`-tier run that
|
|
228
|
+
* produced sixty parts plus exports — unlike a hand-batched delete, which is
|
|
229
|
+
* the shape that died with `Transaction too big` on `categories`.
|
|
230
|
+
*/
|
|
231
|
+
export async function deleteRunTree(sheetId, runId) {
|
|
232
|
+
await deletePrefix(`${runPrefix(sheetId, runId)}/`);
|
|
233
|
+
}
|
|
234
|
+
/** Delete a whole sheet: the scan, and every run under it. */
|
|
235
|
+
export async function deleteSheetTree(sheetId) {
|
|
236
|
+
await deletePrefix(`${SCAN_ROOT}/${sheetId}/`);
|
|
237
|
+
}
|
|
238
|
+
async function deletePrefix(prefix) {
|
|
239
|
+
/*
|
|
240
|
+
* 🛑 The trailing slash is load-bearing. `prefix: "…/sheet-1"` also matches
|
|
241
|
+
* `…/sheet-10`, so deleting one sheet would delete its numeric neighbours —
|
|
242
|
+
* silently, and reported as success.
|
|
243
|
+
*/
|
|
244
|
+
if (!prefix.startsWith(`${SCAN_ROOT}/`) || !prefix.endsWith("/")) {
|
|
245
|
+
throw new Error(`Refusing to delete outside ${SCAN_ROOT}: ${prefix}`);
|
|
246
|
+
}
|
|
247
|
+
await getAdminStorage().bucket().deleteFiles({ prefix, force: true });
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Total stored bytes and object count under one sheet, for the usage meter.
|
|
251
|
+
*
|
|
252
|
+
* 🛑 A quota only discoverable in the GCP console is a quota nobody watches —
|
|
253
|
+
* the same failure as Root Cause #104, where the first signal was a billing
|
|
254
|
+
* page. This is what makes "keep every run" a safe default rather than a
|
|
255
|
+
* deferred surprise.
|
|
256
|
+
*/
|
|
257
|
+
export async function measureSheetBytes(sheetId) {
|
|
258
|
+
const [files] = await getAdminStorage()
|
|
259
|
+
.bucket()
|
|
260
|
+
.getFiles({ prefix: `${SCAN_ROOT}/${sheetId}/` });
|
|
261
|
+
let bytes = 0;
|
|
262
|
+
for (const f of files)
|
|
263
|
+
bytes += Number(f.metadata?.size ?? 0);
|
|
264
|
+
return { bytes, objects: files.length };
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Download a stored object's bytes.
|
|
268
|
+
*
|
|
269
|
+
* 🛑 Takes a RAW assetPath, which is only ever a value this module produced —
|
|
270
|
+
* `sourceScan.assetPath` or a `runPrefix`-derived artifact path. It must never
|
|
271
|
+
* be fed a client-supplied string: the bucket's storage rule is
|
|
272
|
+
* `allow read: if true`, so path containment is enforced here or nowhere.
|
|
273
|
+
*/
|
|
274
|
+
export async function readScanBytes(assetPath) {
|
|
275
|
+
if (!assetPath.startsWith(`${SCAN_ROOT}/`)) {
|
|
276
|
+
// Loud, not a silent empty read: an out-of-tree path means a caller
|
|
277
|
+
// assembled it rather than reading it off a document, and returning
|
|
278
|
+
// nothing would look like an empty scan.
|
|
279
|
+
throw new Error(`Refusing to read outside ${SCAN_ROOT}: ${assetPath}`);
|
|
280
|
+
}
|
|
281
|
+
const [buf] = await getAdminStorage().bucket().file(assetPath).download();
|
|
282
|
+
return new Uint8Array(buf);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Read and parse a run's `geometry.json`.
|
|
286
|
+
*
|
|
287
|
+
* 🛑 Parsed HERE rather than in the shard, so the one place that knows the
|
|
288
|
+
* artifact's name also owns its shape. A shard assembling the path itself
|
|
289
|
+
* would be a second definition of the layout — and the `parts` array is what
|
|
290
|
+
* every shard slices, so a disagreement renders the wrong crops rather than
|
|
291
|
+
* failing.
|
|
292
|
+
*/
|
|
293
|
+
export async function readRunGeometry(runId, sheetId) {
|
|
294
|
+
const assetPath = `${runPrefix(sheetId, runId)}/geometry.json`;
|
|
295
|
+
const [buf] = await getAdminStorage().bucket().file(assetPath).download();
|
|
296
|
+
const parsed = JSON.parse(buf.toString("utf8"));
|
|
297
|
+
if (!parsed || !Array.isArray(parsed.parts) || !parsed.workingSize) {
|
|
298
|
+
throw new Error(`geometry.json is malformed for run ${runId}`);
|
|
299
|
+
}
|
|
300
|
+
return parsed;
|
|
301
|
+
}
|
|
@@ -27,7 +27,7 @@ import type { StoreDetail, StoreListItem } from "../../../../features/stores/typ
|
|
|
27
27
|
*/
|
|
28
28
|
export declare const PUBLIC_STORE_FIELDS: readonly ["id", "storeSlug", "ownerId", "storeName", "storeDescription", "storeCategory", "storeLogoURL", "storeBannerURL", "status", "isPublic", "stats", "bio", "location", "website", "socialLinks", "returnPolicy", "shippingPolicy", "isVacationMode", "vacationMessage", "supportsShippingProtection", "supportsSaleProtection", "createdAt"];
|
|
29
29
|
/** Everything else, with the reason it stays server-side. */
|
|
30
|
-
export declare const PRIVATE_STORE_FIELDS: readonly ["searchTxt", "updatedAt", "whatsappConfig", "adminNotes", "statusHistory", "statusHistoryTruncated", "isVerified", "suspensionReason", "capabilities", "customCommissionRate", "googleReviews", "shippingConfig", "emiEnabled", "pricesIncludeGst", "shippingPricing", "returnsDirectToSeller", "isFeatured", "vacationReturnDate", "isTestData", "testDataExpiresAt"];
|
|
30
|
+
export declare const PRIVATE_STORE_FIELDS: readonly ["searchTxt", "updatedAt", "whatsappConfig", "adminNotes", "statusHistory", "statusHistoryTruncated", "isVerified", "suspensionReason", "capabilities", "customCommissionRate", "googleReviews", "shippingConfig", "emiEnabled", "pricesIncludeGst", "shippingPricing", "returnsDirectToSeller", "isFeatured", "vacationReturnDate", "isTestData", "testDataExpiresAt", "gstin", "legalName", "registeredAddress"];
|
|
31
31
|
/**
|
|
32
32
|
* Accepted input: a `StoreDocument` (the common case) or a loosely-typed
|
|
33
33
|
* Firestore row. The legacy top-level counters below predate `stats` and are
|
|
@@ -91,6 +91,22 @@ export const PRIVATE_STORE_FIELDS = [
|
|
|
91
91
|
"vacationReturnDate", // not rendered by StoreAboutView; add to PUBLIC when a reader exists
|
|
92
92
|
"isTestData", // tester-sandbox tagging; filtered by filterTestDataForViewer
|
|
93
93
|
"testDataExpiresAt", // ditto
|
|
94
|
+
/*
|
|
95
|
+
* Tax identity (2026-10-19). Read today by exactly two server-side
|
|
96
|
+
* consumers: `resolveSupplierIdentity` (checkout, to decide whose
|
|
97
|
+
* registration an order invoices under) and the seller's own authenticated
|
|
98
|
+
* payout-settings form. Neither is a public store-profile reader.
|
|
99
|
+
*
|
|
100
|
+
* A GSTIN is not secret in the way a bank account number is — it is
|
|
101
|
+
* legally published on an invoice — but "may be disclosed" and "has a
|
|
102
|
+
* reader that needs it published on /stores/{slug}" are different
|
|
103
|
+
* questions, and only the first is true today. Move to PUBLIC_STORE_FIELDS
|
|
104
|
+
* together, with the literal in `toStoreListItem()`, once a storefront
|
|
105
|
+
* surface actually needs to show a seller's registration.
|
|
106
|
+
*/
|
|
107
|
+
"gstin",
|
|
108
|
+
"legalName",
|
|
109
|
+
"registeredAddress",
|
|
94
110
|
];
|
|
95
111
|
/** `createdAt` is `Date` on the document and `string` on the client types. */
|
|
96
112
|
function toIsoString(value) {
|
|
@@ -3,3 +3,4 @@ export { STORES_PAGE_SIZE, STORES_PRODUCTS_PAGE_SIZE, STORES_SITEMAP_LIMIT, STOR
|
|
|
3
3
|
export { renderStoreOgImage, renderStoreOg, type StoreOgData } from "./og";
|
|
4
4
|
export { resolveStoreFields, resolveStoreFieldsMany, type ProductStoreFields, } from "./denormalize";
|
|
5
5
|
export { toStoreDetail, toStoreListItem, PUBLIC_STORE_FIELDS, PRIVATE_STORE_FIELDS, type ToStoreDetailOptions, type ToStoreListItemOptions, type StoreProjectionSource, } from "./adapters";
|
|
6
|
+
export { resolveStoreTabs, getDefaultStoreTabPath, type ResolvedStoreTabs, type StoreTabLink, } from "./tabs";
|
|
@@ -3,3 +3,4 @@ export { STORES_PAGE_SIZE, STORES_PRODUCTS_PAGE_SIZE, STORES_SITEMAP_LIMIT, STOR
|
|
|
3
3
|
export { renderStoreOgImage, renderStoreOg } from "./og.js";
|
|
4
4
|
export { resolveStoreFields, resolveStoreFieldsMany, } from "./denormalize.js";
|
|
5
5
|
export { toStoreDetail, toStoreListItem, PUBLIC_STORE_FIELDS, PRIVATE_STORE_FIELDS, } from "./adapters.js";
|
|
6
|
+
export { resolveStoreTabs, getDefaultStoreTabPath, } from "./tabs.js";
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { isListingTypeEnabled } from "../../../shared/listing-types/feature-flags";
|
|
2
|
+
import { type ListingTabCounts } from "../products/listing-tab-counts";
|
|
3
|
+
type SiteSettingsSnapshot = Parameters<typeof isListingTypeEnabled>[1];
|
|
4
|
+
export interface StoreTabLink {
|
|
5
|
+
value: string;
|
|
6
|
+
label: string;
|
|
7
|
+
href: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ResolvedStoreTabs {
|
|
10
|
+
/** Listing-type tabs with something in them, in `STORE_PAGE_TABS` order. */
|
|
11
|
+
dropdownTabs: StoreTabLink[];
|
|
12
|
+
/** Coupons (if any), Reviews (if any), About — always non-empty. */
|
|
13
|
+
tabs: StoreTabLink[];
|
|
14
|
+
listingCounts: ListingTabCounts;
|
|
15
|
+
couponsCount: number;
|
|
16
|
+
reviewsCount: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function resolveStoreTabs(storeSlug: string, storeId: string | undefined, settings: SiteSettingsSnapshot): Promise<ResolvedStoreTabs>;
|
|
19
|
+
/**
|
|
20
|
+
* Where the bare `/stores/[slug]` route should land: the first listing-type
|
|
21
|
+
* tab holding anything, else Coupons, else Reviews, else About. `about` is
|
|
22
|
+
* always present in `tabs`, so this never falls through to nothing.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getDefaultStoreTabPath(storeSlug: string, storeId: string | undefined, settings: SiteSettingsSnapshot): Promise<string>;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* 🛑 Deliberately NO `"use server"`. That directive marks every export as a
|
|
3
|
+
* client-callable RPC endpoint, and these are not — they are read helpers
|
|
4
|
+
* invoked from a Server Component (`StoreDetailLayoutView`) and a server
|
|
5
|
+
* page (`/stores/[slug]`). Declaring it anyway also obliges every export to
|
|
6
|
+
* return `ActionResult<T>` (`audit-server-action-envelope`), which would
|
|
7
|
+
* wrap a path string in an envelope nobody unwraps. The sibling helpers
|
|
8
|
+
* this file sits beside — `adapters.ts`, `denormalize.ts` and
|
|
9
|
+
* `listing-tab-counts.ts`, which it calls — carry no directive either.
|
|
10
|
+
*
|
|
11
|
+
* WHY: `StoreDetailLayoutView`'s nav bar and the bare `/stores/[slug]`
|
|
12
|
+
* redirect both need "which tabs does this store actually have
|
|
13
|
+
* something in, and in what order". Before this file the redirect
|
|
14
|
+
* didn't ask the question at all — it always sent a visitor to
|
|
15
|
+
* `/products`, even for a store with zero products (and nothing else),
|
|
16
|
+
* landing on a tab that isn't even in the nav bar. Computing the answer
|
|
17
|
+
* twice (once per caller) is exactly the duplicated-predicate shape
|
|
18
|
+
* Root Cause #73 warns about, so it lives in one place.
|
|
19
|
+
* WHAT: `resolveStoreTabs` — every visible tab for a store, in priority
|
|
20
|
+
* order (listing types in `STORE_PAGE_TABS` order, then Coupons, then
|
|
21
|
+
* Reviews, then About last). `getDefaultStoreTabPath` picks the first
|
|
22
|
+
* one — the correct landing page for a store with no products.
|
|
23
|
+
*/
|
|
24
|
+
import { sieveAnd, sieveFilter, SIEVE_OP } from "../../../../utils/sieve-builder.js";
|
|
25
|
+
import { couponsRepository, reviewRepository } from "../../../../repositories/index.js";
|
|
26
|
+
import { ROUTES } from "../../../../next/routing/route-map.js";
|
|
27
|
+
import { STORE_PAGE_TABS } from "../../../../features/products/constants/listing-tabs.js";
|
|
28
|
+
import { isListingTypeEnabled, isCategoryTypeEnabled } from "../../../shared/listing-types/feature-flags.js";
|
|
29
|
+
import { pluginFor } from "../../../shared/listing-types/_registry.js";
|
|
30
|
+
import { listingTabCounts, } from "../products/listing-tab-counts.js";
|
|
31
|
+
function tabLabel(base, count) {
|
|
32
|
+
if (!count)
|
|
33
|
+
return base;
|
|
34
|
+
return `${base} (${count.toLocaleString()})`;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* tabSlug -> route builder. Mirrors `ROUTES.PUBLIC.STORE_*` exactly.
|
|
38
|
+
*
|
|
39
|
+
* 🛑 `spares` was missing here until this file was added, which meant
|
|
40
|
+
* `visibleStoreTabs` could include a tab this map had no builder for the
|
|
41
|
+
* moment a store's spares count went above zero — `STORE_LISTING_HREF[tab.id]`
|
|
42
|
+
* would resolve to `undefined`, and calling it as a function would throw.
|
|
43
|
+
* `/stores/[storeSlug]/spares/page.tsx` is a real route; the href map just
|
|
44
|
+
* never named it.
|
|
45
|
+
*/
|
|
46
|
+
const STORE_LISTING_HREF = {
|
|
47
|
+
products: (slug) => String(ROUTES.PUBLIC.STORE_PRODUCTS(slug)),
|
|
48
|
+
auctions: (slug) => String(ROUTES.PUBLIC.STORE_AUCTIONS(slug)),
|
|
49
|
+
"pre-orders": (slug) => String(ROUTES.PUBLIC.STORE_PRE_ORDERS(slug)),
|
|
50
|
+
"prize-draws": (slug) => String(ROUTES.PUBLIC.STORE_PRIZE_DRAWS(slug)),
|
|
51
|
+
bundles: (slug) => String(ROUTES.PUBLIC.STORE_BUNDLES(slug)),
|
|
52
|
+
classifieds: (slug) => String(ROUTES.PUBLIC.STORE_CLASSIFIEDS(slug)),
|
|
53
|
+
"digital-codes": (slug) => String(ROUTES.PUBLIC.STORE_DIGITAL_CODES(slug)),
|
|
54
|
+
live: (slug) => String(ROUTES.PUBLIC.STORE_LIVE(slug)),
|
|
55
|
+
// Combined art + stickers, mirroring the public /art page. This used to
|
|
56
|
+
// point at STORE_PRODUCTS, which filters to `standard` — so the tab showed
|
|
57
|
+
// a real non-zero count and landed on a page with none of those items.
|
|
58
|
+
art: (slug) => String(ROUTES.PUBLIC.STORE_ART(slug)),
|
|
59
|
+
spares: (slug) => String(ROUTES.PUBLIC.STORE_SPARES(slug)),
|
|
60
|
+
};
|
|
61
|
+
export async function resolveStoreTabs(storeSlug, storeId, settings) {
|
|
62
|
+
const [listingCounts, couponsCount, reviewsCount] = storeId
|
|
63
|
+
? await Promise.all([
|
|
64
|
+
listingTabCounts(STORE_PAGE_TABS, { storeId }),
|
|
65
|
+
// audit-public-test-data-ok: a COUNT of the store's own coupons, and
|
|
66
|
+
// `CouponDocument` carries no isTestData field — there is nothing to strip.
|
|
67
|
+
couponsRepository
|
|
68
|
+
.list({ filters: sieveAnd(sieveFilter("storeId", SIEVE_OP.EQ, storeId), sieveFilter("validity.isActive", SIEVE_OP.EQ, "true")), page: 1, pageSize: 1 })
|
|
69
|
+
.then((r) => r.total)
|
|
70
|
+
.catch(() => 0),
|
|
71
|
+
reviewRepository
|
|
72
|
+
.listAll({ filters: sieveAnd(sieveFilter("storeId", SIEVE_OP.EQ, storeId), sieveFilter("status", SIEVE_OP.EQ, "approved")), page: 1, pageSize: 1 })
|
|
73
|
+
.then((r) => r.total)
|
|
74
|
+
.catch(() => 0),
|
|
75
|
+
])
|
|
76
|
+
: [{}, 0, 0];
|
|
77
|
+
const visibleStoreTabs = STORE_PAGE_TABS.filter((tab) => {
|
|
78
|
+
if (tab.id === "bundles") {
|
|
79
|
+
if (!isCategoryTypeEnabled("bundle", settings))
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
else if (tab.id === pluginFor("art").tabSlug) {
|
|
83
|
+
// Combined tab — visible if either underlying listing type is enabled.
|
|
84
|
+
if (!(isListingTypeEnabled("art", settings) || isListingTypeEnabled("stickers", settings)))
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
else if (tab.listingType) {
|
|
88
|
+
if (!isListingTypeEnabled(tab.listingType, settings))
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
// A store with zero items of a given listing type shouldn't offer a tab
|
|
92
|
+
// that leads to an empty page. `undefined` means the count query FAILED,
|
|
93
|
+
// not zero, so the tab stays visible rather than hiding real stock
|
|
94
|
+
// behind a swallowed error (Root Cause #59).
|
|
95
|
+
const count = listingCounts[tab.id];
|
|
96
|
+
return count === undefined || count > 0;
|
|
97
|
+
});
|
|
98
|
+
const dropdownTabs = visibleStoreTabs.map((tab) => ({
|
|
99
|
+
value: tab.id,
|
|
100
|
+
label: tabLabel(tab.label, listingCounts[tab.id]),
|
|
101
|
+
href: STORE_LISTING_HREF[tab.id](storeSlug),
|
|
102
|
+
}));
|
|
103
|
+
const tabs = [
|
|
104
|
+
...(couponsCount > 0
|
|
105
|
+
? [{ value: "coupons", label: tabLabel("Coupons", couponsCount), href: String(ROUTES.PUBLIC.STORE_COUPONS(storeSlug)) }]
|
|
106
|
+
: []),
|
|
107
|
+
...(reviewsCount > 0
|
|
108
|
+
? [{ value: "reviews", label: tabLabel("Reviews", reviewsCount), href: String(ROUTES.PUBLIC.STORE_REVIEWS(storeSlug)) }]
|
|
109
|
+
: []),
|
|
110
|
+
{ value: "about", label: "About", href: String(ROUTES.PUBLIC.STORE_ABOUT(storeSlug)) },
|
|
111
|
+
];
|
|
112
|
+
return { dropdownTabs, tabs, listingCounts, couponsCount, reviewsCount };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Where the bare `/stores/[slug]` route should land: the first listing-type
|
|
116
|
+
* tab holding anything, else Coupons, else Reviews, else About. `about` is
|
|
117
|
+
* always present in `tabs`, so this never falls through to nothing.
|
|
118
|
+
*/
|
|
119
|
+
export async function getDefaultStoreTabPath(storeSlug, storeId, settings) {
|
|
120
|
+
const { dropdownTabs, tabs } = await resolveStoreTabs(storeSlug, storeId, settings);
|
|
121
|
+
return (dropdownTabs[0] ?? tabs[0]).href;
|
|
122
|
+
}
|