@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,174 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Rendering parts is the only embarrassingly parallel stage, and the only
|
|
3
|
+
* one that cannot fit one invocation at `precise`/`max` on a 34 MP scan
|
|
4
|
+
* with sixty parts.
|
|
5
|
+
* WHAT: One shard's slice of the parts, then its vote in the finalizer
|
|
6
|
+
* election.
|
|
7
|
+
*
|
|
8
|
+
* 🛑 Owns the `parts` TRACE_STAGE for audit-sticker-trace-progress R2.
|
|
9
|
+
*
|
|
10
|
+
* 🛑 Per-part progress is RTDB-ONLY, via emitPartProgress. A Firestore event
|
|
11
|
+
* per part would be ~60 writes per run instead of ~10 — 6x the write budget to
|
|
12
|
+
* say something the live bar already shows and the history does not need.
|
|
13
|
+
*
|
|
14
|
+
* EXPORTS: runShard, ShardDeps
|
|
15
|
+
*
|
|
16
|
+
* @tag domain:sticker-trace
|
|
17
|
+
* @tag layer:server
|
|
18
|
+
* @tag pattern:none
|
|
19
|
+
* @tag access:server
|
|
20
|
+
* @tag consumers:functions/consumer-functions
|
|
21
|
+
* @tag sideEffects:firestore,storage,rtdb
|
|
22
|
+
*/
|
|
23
|
+
import { normalizeError } from "../../../../errors/normalize.js";
|
|
24
|
+
import { serverLogger } from "../../../../monitoring/index.js";
|
|
25
|
+
import { stickerSheetsRepository } from "../../../../features/sticker-trace/repository/sticker-sheets.repository.js";
|
|
26
|
+
import { completeShardAndMaybeElectFinalizer } from "./fanout.js";
|
|
27
|
+
import { emitPartProgress, emitProgress } from "./progress.js";
|
|
28
|
+
/**
|
|
29
|
+
* One promoted part at full resolution.
|
|
30
|
+
*
|
|
31
|
+
* Extracted because the inline version sat at brace-depth 6 and tripped
|
|
32
|
+
* audit-code-quality's DEEP_NESTING — which was a fair call: the render is a
|
|
33
|
+
* distinct step, and naming it makes the mode branch in `runShard` read as the
|
|
34
|
+
* decision it is rather than as two blocks of plumbing.
|
|
35
|
+
*/
|
|
36
|
+
async function writeFullPart(deps, input) {
|
|
37
|
+
const png = await deps.codec.encodePngRegion(input.source, input.region, input.alpha);
|
|
38
|
+
await deps.writeArtifact({
|
|
39
|
+
sheetId: input.sheetId,
|
|
40
|
+
runId: input.runId,
|
|
41
|
+
name: `part-${String(input.ordinal).padStart(3, "0")}.png`,
|
|
42
|
+
contentType: png.contentType,
|
|
43
|
+
body: png.bytes,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Render this shard's parts, then report done.
|
|
48
|
+
*
|
|
49
|
+
* 🛑 `mode` decides resolution, and that is the single decision keeping this
|
|
50
|
+
* feature inside the Storage allowance. `thumb` renders review thumbnails into
|
|
51
|
+
* ONE sprite atlas; `full` renders full-resolution parts and only runs when a
|
|
52
|
+
* human promotes a run. Rendering full-res on every run costs ~600 MB per
|
|
53
|
+
* sheet across a tuning session against ~95 MB — roughly 8 sheets inside 5 GB
|
|
54
|
+
* instead of 52.
|
|
55
|
+
*
|
|
56
|
+
* 🛑 The shard reports done even when a part THROWS. Leaving the counter short
|
|
57
|
+
* means the finalizer is never elected and the run sits RUNNING forever — a
|
|
58
|
+
* stuck run is worse than a run that completes reporting a bad part, because
|
|
59
|
+
* nothing sweeps it and the RTDB channel prunes within the hour.
|
|
60
|
+
*/
|
|
61
|
+
export async function runShard(task, deps) {
|
|
62
|
+
const { runId, sheetId } = task;
|
|
63
|
+
let rendered = 0;
|
|
64
|
+
const failures = [];
|
|
65
|
+
try {
|
|
66
|
+
const sheet = await stickerSheetsRepository.findByIdOrFail(sheetId);
|
|
67
|
+
const geometry = await deps.readGeometry(runId, sheetId);
|
|
68
|
+
const source = await deps.readScan(sheet.sourceScan.assetPath);
|
|
69
|
+
/*
|
|
70
|
+
* 🛑 Scale is derived from the SHEET's full width against the working
|
|
71
|
+
* raster the geometry was traced on. Carrying vectors is what makes this
|
|
72
|
+
* exact — an upscaled mask would soften every cut line by the ratio.
|
|
73
|
+
*/
|
|
74
|
+
const scale = sheet.widthPx / Math.max(1, geometry.workingSize.width);
|
|
75
|
+
const mine = geometry.parts.filter((p) => task.partOrdinals.includes(p.ordinal));
|
|
76
|
+
const tiles = [];
|
|
77
|
+
for (const part of mine) {
|
|
78
|
+
try {
|
|
79
|
+
const region = {
|
|
80
|
+
x: Math.round(part.bbox.x * scale),
|
|
81
|
+
y: Math.round(part.bbox.y * scale),
|
|
82
|
+
width: Math.max(1, Math.round(part.bbox.width * scale)),
|
|
83
|
+
height: Math.max(1, Math.round(part.bbox.height * scale)),
|
|
84
|
+
};
|
|
85
|
+
const alpha = await deps.rasterise(part.path, region);
|
|
86
|
+
if (task.mode === "full") {
|
|
87
|
+
await writeFullPart(deps, { sheetId, runId, ordinal: part.ordinal, source, region, alpha });
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
tiles.push({ raster: await deps.codec.decodeTile(source, region), ordinal: part.ordinal });
|
|
91
|
+
}
|
|
92
|
+
rendered++;
|
|
93
|
+
}
|
|
94
|
+
catch (partErr) {
|
|
95
|
+
const n = normalizeError(partErr);
|
|
96
|
+
failures.push(part.ordinal);
|
|
97
|
+
serverLogger.warn("Sticker trace part render failed", {
|
|
98
|
+
runId,
|
|
99
|
+
ordinal: part.ordinal,
|
|
100
|
+
message: n.message,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/*
|
|
104
|
+
* No shard counters here on purpose. A shard knows its own index but not
|
|
105
|
+
* how many others have finished — that lives in the transactional
|
|
106
|
+
* counter — and the first draft of this call passed
|
|
107
|
+
* `task.shardIndex !== undefined ? undefined : undefined`, which is
|
|
108
|
+
* always undefined: a nonsense expression that typechecked and published
|
|
109
|
+
* nothing.
|
|
110
|
+
*/
|
|
111
|
+
await emitPartProgress(runId, rendered, mine.length);
|
|
112
|
+
}
|
|
113
|
+
/*
|
|
114
|
+
* One atlas per SHARD, not per run: a shard cannot see the other shards'
|
|
115
|
+
* tiles, and waiting to combine them would need the finalizer to re-read
|
|
116
|
+
* every thumbnail. Object count stays bounded by shard count (<= 8), which
|
|
117
|
+
* is the property that mattered — sixty individual thumbnails is what this
|
|
118
|
+
* avoids.
|
|
119
|
+
*/
|
|
120
|
+
if (task.mode === "thumb" && tiles.length > 0) {
|
|
121
|
+
const atlas = await deps.codec.encodeAtlas(tiles, { maxLongEdge: 1024 });
|
|
122
|
+
await deps.writeArtifact({
|
|
123
|
+
sheetId,
|
|
124
|
+
runId,
|
|
125
|
+
name: `atlas-${task.shardIndex ?? 0}.png`,
|
|
126
|
+
contentType: atlas.image.contentType,
|
|
127
|
+
body: atlas.image.bytes,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
const n = normalizeError(err);
|
|
133
|
+
serverLogger.error("Sticker trace shard failed", {
|
|
134
|
+
runId,
|
|
135
|
+
shardIndex: task.shardIndex,
|
|
136
|
+
message: n.message,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
// See the header: report done regardless, or the run never finishes.
|
|
141
|
+
const election = await completeShardAndMaybeElectFinalizer({
|
|
142
|
+
runId,
|
|
143
|
+
sheetId,
|
|
144
|
+
shardIndex: task.shardIndex ?? 0,
|
|
145
|
+
shardCount: await resolveShardCount(runId),
|
|
146
|
+
mode: task.mode,
|
|
147
|
+
});
|
|
148
|
+
if (failures.length > 0) {
|
|
149
|
+
await emitProgress({
|
|
150
|
+
runId,
|
|
151
|
+
stage: "parts",
|
|
152
|
+
pct: 90,
|
|
153
|
+
message: `${failures.length} part(s) could not be rendered.`,
|
|
154
|
+
level: "warn",
|
|
155
|
+
durable: true,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
if (election.electedFinalizer) {
|
|
159
|
+
serverLogger.info("Sticker trace finalizer elected", { runId });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* The run's own `shardCount`, read rather than passed.
|
|
165
|
+
*
|
|
166
|
+
* A shard receives its task, not the run, and trusting a count copied onto the
|
|
167
|
+
* task would be a mirror that drifts the moment the coordinator retries with a
|
|
168
|
+
* different fan-out (Root Cause #42).
|
|
169
|
+
*/
|
|
170
|
+
async function resolveShardCount(runId) {
|
|
171
|
+
const { stickerTraceRunsRepository } = await import("../../../../features/sticker-trace/repository/sticker-trace-runs.repository.js");
|
|
172
|
+
const run = await stickerTraceRunsRepository.findById(runId);
|
|
173
|
+
return run?.shardCount ?? 1;
|
|
174
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { DpiSource } from "../../../../features/sticker-trace/schemas/firestore";
|
|
2
|
+
import type { ScanType } from "../../../shared/features/sticker-trace/types";
|
|
3
|
+
import { type SignedUpload } from "./storage";
|
|
4
|
+
/**
|
|
5
|
+
* 100 MB.
|
|
6
|
+
*
|
|
7
|
+
* Measured against the reference corpus rather than picked: `@ShayBlader Scan
|
|
8
|
+
* 18` is 79 MB, the largest of the nine, and it is a legitimate scan rather
|
|
9
|
+
* than an outlier to design against. The cap exists because scans are stored
|
|
10
|
+
* AS UPLOADED — no re-encode, because compression artefacts measured ±7 on the
|
|
11
|
+
* JPEG samples and the halftone scan's cut-line signal is only ~3x noise, so
|
|
12
|
+
* transcoding would attack the exact signal the detector needs.
|
|
13
|
+
*/
|
|
14
|
+
export declare const STICKER_SHEET_MAX_BYTES: number;
|
|
15
|
+
export interface CreateStickerSheetInput {
|
|
16
|
+
/** 🛑 Mandatory — see `requireTitle`. */
|
|
17
|
+
title: string;
|
|
18
|
+
scanType?: ScanType;
|
|
19
|
+
contentType: string;
|
|
20
|
+
extension: string;
|
|
21
|
+
}
|
|
22
|
+
export interface CreateStickerSheetResult {
|
|
23
|
+
sheetId: string;
|
|
24
|
+
upload: SignedUpload;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create the sheet row and mint the write URL for its scan, in one call.
|
|
28
|
+
*
|
|
29
|
+
* 🛑 The ROW comes first and the bytes second, which is the opposite of what
|
|
30
|
+
* feels natural. The object path contains the sheet id, so an upload signed
|
|
31
|
+
* before the row exists has nowhere to go — and a bucket object with no
|
|
32
|
+
* document pointing at it is unreachable AND unmeterable: it costs storage
|
|
33
|
+
* forever with nothing in any UI to delete it from. A document whose upload
|
|
34
|
+
* never completes is the harmless direction: `traceStatus` stays `queued`,
|
|
35
|
+
* `sourceScan.bytes` is 0, and the list can say so.
|
|
36
|
+
*
|
|
37
|
+
* 🛑 `widthPx`/`heightPx` are 0 until `attachStickerSheetScan`. appkit cannot
|
|
38
|
+
* probe an image — the codec is injected, which is what Root Cause #24 is
|
|
39
|
+
* about — so the only party that already knows the dimensions is the browser
|
|
40
|
+
* that just decoded it for live tuning. Guessing them here would put two
|
|
41
|
+
* numbers on the document that nothing measured.
|
|
42
|
+
*/
|
|
43
|
+
export declare function createStickerSheet(input: CreateStickerSheetInput): Promise<CreateStickerSheetResult>;
|
|
44
|
+
export interface AttachScanInput {
|
|
45
|
+
sheetId: string;
|
|
46
|
+
assetPath: string;
|
|
47
|
+
widthPx: number;
|
|
48
|
+
heightPx: number;
|
|
49
|
+
dpi?: number;
|
|
50
|
+
dpiSource?: DpiSource;
|
|
51
|
+
scanType?: ScanType;
|
|
52
|
+
/** A dedupe hint the browser computed. Never trusted — see `StoredAsset`. */
|
|
53
|
+
sha256?: string;
|
|
54
|
+
}
|
|
55
|
+
export type AttachScanResult = {
|
|
56
|
+
ok: true;
|
|
57
|
+
bytes: number;
|
|
58
|
+
} | {
|
|
59
|
+
ok: false;
|
|
60
|
+
code: string;
|
|
61
|
+
message: string;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Verify the uploaded bytes and record them on the sheet.
|
|
65
|
+
*
|
|
66
|
+
* 🛑 The caller's `assetPath` is CONTAINED to this sheet's own prefix before
|
|
67
|
+
* anything reads it. Every other field here is merely wrong if wrong; this one
|
|
68
|
+
* is a capability — `readScanBytes` will later fetch whatever it names, and a
|
|
69
|
+
* path naming another sheet would turn this endpoint into a cross-sheet read
|
|
70
|
+
* primitive. `readScanBytes` has its own `SCAN_ROOT` check, which is the second
|
|
71
|
+
* layer, not the first: by the time it runs the path is already on a document.
|
|
72
|
+
*
|
|
73
|
+
* 🛑 `finalizeScanUpload` DELETES the object on a magic-byte mismatch, so a
|
|
74
|
+
* failure leaves nothing behind in the bucket. That is why the mismatch RETURNS
|
|
75
|
+
* rather than throwing: the sheet row survives and the operator re-uploads into
|
|
76
|
+
* it, instead of starting again with a fresh row and orphaning the first.
|
|
77
|
+
*/
|
|
78
|
+
export declare function attachStickerSheetScan(input: AttachScanInput): Promise<AttachScanResult>;
|
|
79
|
+
/**
|
|
80
|
+
* The asset kinds a client may ask for.
|
|
81
|
+
*
|
|
82
|
+
* 🛑 A KIND, never a path, and this is the whole security shape of the asset
|
|
83
|
+
* endpoint: the client names WHAT it wants and the server looks the path up on
|
|
84
|
+
* the document. Accepting an `assetPath` instead would make the endpoint a
|
|
85
|
+
* signed-URL mint for any object in the bucket — including another admin's
|
|
86
|
+
* scans and, since the same bucket holds them, `private/digital-content/`.
|
|
87
|
+
* It is also what keeps every `*Path` field off the wire entirely, which is the
|
|
88
|
+
* property `PRIVATE_STICKER_SHEET_FIELDS` declares and
|
|
89
|
+
* audit-public-projection-parity enforces.
|
|
90
|
+
*/
|
|
91
|
+
export declare const STICKER_ASSET_KINDS: readonly ["scan", "preview", "overlay", "geometry", "cutSvg", "thumbAtlas", "part"];
|
|
92
|
+
export type StickerAssetKind = (typeof STICKER_ASSET_KINDS)[number];
|
|
93
|
+
/**
|
|
94
|
+
* Mint a short-lived read URL for one asset of one sheet or run.
|
|
95
|
+
*
|
|
96
|
+
* `runId` absent means the sheet's currently-accepted artifacts; present means
|
|
97
|
+
* that specific run's, which is what makes two runs comparable side by side —
|
|
98
|
+
* the reason runs keep their own artifacts rather than overwriting the sheet's.
|
|
99
|
+
*
|
|
100
|
+
* Returns `null` for "there is no such asset", which the route maps to a 404.
|
|
101
|
+
* An absent artifact is the normal state of an unfinished or failed run, so it
|
|
102
|
+
* must not read as an error.
|
|
103
|
+
*/
|
|
104
|
+
export declare function resolveStickerAssetUrl(input: {
|
|
105
|
+
sheetId: string;
|
|
106
|
+
kind: StickerAssetKind;
|
|
107
|
+
runId?: string;
|
|
108
|
+
/** Required for `kind: "part"`. Matched against `SheetPart.ordinal`. */
|
|
109
|
+
ordinal?: number;
|
|
110
|
+
}): Promise<{
|
|
111
|
+
url: string;
|
|
112
|
+
expiresAt: Date;
|
|
113
|
+
} | null>;
|
|
114
|
+
export interface SheetUsageRow {
|
|
115
|
+
sheetId: string;
|
|
116
|
+
title: string;
|
|
117
|
+
bytes: number;
|
|
118
|
+
objects: number;
|
|
119
|
+
}
|
|
120
|
+
export interface StickerStorageUsage {
|
|
121
|
+
rows: SheetUsageRow[];
|
|
122
|
+
totalBytes: number;
|
|
123
|
+
totalObjects: number;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Stored bytes and object count per sheet, biggest first.
|
|
127
|
+
*
|
|
128
|
+
* 🛑 Object COUNT is reported beside bytes because GCS meters them separately
|
|
129
|
+
* (Class A writes, Class B reads). The sprite-atlas decision exists precisely
|
|
130
|
+
* because sixty thumbnails per run would spend that budget sixty times faster
|
|
131
|
+
* than the same pixels in one object — a meter showing only bytes would make
|
|
132
|
+
* undoing that look free.
|
|
133
|
+
*
|
|
134
|
+
* 🛑 Retention is manual by design: nothing auto-prunes, so any past run's
|
|
135
|
+
* overlay can still be opened and compared. That is only a safe default if the
|
|
136
|
+
* cost is VISIBLE rather than discovered, which is what this is for — Root
|
|
137
|
+
* Cause #104's first signal was a billing page.
|
|
138
|
+
*
|
|
139
|
+
* 🛑 One bucket listing per sheet, so this is deliberately NOT folded into the
|
|
140
|
+
* sheet list. Twenty sheets would be twenty `getFiles` calls on every page
|
|
141
|
+
* view; it is its own endpoint an operator opens.
|
|
142
|
+
*/
|
|
143
|
+
export declare function measureStickerStorage(sheetIds: readonly string[]): Promise<StickerStorageUsage>;
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: A scan has to exist in the bucket before anything can trace it, and the
|
|
3
|
+
* upload is the one hop where a client supplies a storage path. Getting
|
|
4
|
+
* that hop wrong is not a cosmetic bug — the bucket's own rule is
|
|
5
|
+
* `allow read: if true`, so path containment is enforced here or nowhere.
|
|
6
|
+
* WHAT: Create a sheet, attach its verified scan, resolve an asset to a
|
|
7
|
+
* short-lived signed URL, and measure what it all costs.
|
|
8
|
+
*
|
|
9
|
+
* 🛑 Separate from `actions.ts` on purpose. That file is the RUN lifecycle
|
|
10
|
+
* (start, retry, list) and this one is the SHEET lifecycle; they share nothing
|
|
11
|
+
* but the repositories. One file would also have meant appending imports into
|
|
12
|
+
* the middle of an existing module, which is how an import block stops being
|
|
13
|
+
* readable.
|
|
14
|
+
*
|
|
15
|
+
* 🛑 Plain objects and thrown errors, not an `ActionResult` envelope — same
|
|
16
|
+
* reasoning as `actions.ts`, and Root Cause #98 is what it costs to get wrong.
|
|
17
|
+
*
|
|
18
|
+
* EXPORTS: STICKER_SHEET_MAX_BYTES, STICKER_ASSET_KINDS, StickerAssetKind,
|
|
19
|
+
* createStickerSheet, attachStickerSheetScan, resolveStickerAssetUrl,
|
|
20
|
+
* measureStickerStorage, SheetUsageRow
|
|
21
|
+
*
|
|
22
|
+
* @tag domain:sticker-trace
|
|
23
|
+
* @tag layer:server
|
|
24
|
+
* @tag pattern:none
|
|
25
|
+
* @tag access:server
|
|
26
|
+
* @tag consumers:api/admin/sticker-sheets
|
|
27
|
+
* @tag sideEffects:firestore,storage
|
|
28
|
+
*/
|
|
29
|
+
import { ValidationError } from "../../../../errors/validation-error.js";
|
|
30
|
+
import { stickerSheetsRepository } from "../../../../features/sticker-trace/repository/sticker-sheets.repository.js";
|
|
31
|
+
import { stickerTraceRunsRepository } from "../../../../features/sticker-trace/repository/sticker-trace-runs.repository.js";
|
|
32
|
+
import { finalizeScanUpload, measureSheetBytes, runPrefix, signScanUpload, signedReadUrl, } from "./storage.js";
|
|
33
|
+
/**
|
|
34
|
+
* The storage segment a sheet's own scan lives under.
|
|
35
|
+
*
|
|
36
|
+
* 🛑 The literal `"source"`, in the slot `runPrefix` fills with a run id. A
|
|
37
|
+
* scan is uploaded BEFORE any run exists, so there is no run id to key it on —
|
|
38
|
+
* and filing it under the first run's id would mean deleting that run deletes
|
|
39
|
+
* the scan every later run reads. Run ids carry a `stickerrun-`-shaped prefix
|
|
40
|
+
* and a random suffix, so this cannot collide with one.
|
|
41
|
+
*/
|
|
42
|
+
const SOURCE_SEGMENT = "source";
|
|
43
|
+
/**
|
|
44
|
+
* 100 MB.
|
|
45
|
+
*
|
|
46
|
+
* Measured against the reference corpus rather than picked: `@ShayBlader Scan
|
|
47
|
+
* 18` is 79 MB, the largest of the nine, and it is a legitimate scan rather
|
|
48
|
+
* than an outlier to design against. The cap exists because scans are stored
|
|
49
|
+
* AS UPLOADED — no re-encode, because compression artefacts measured ±7 on the
|
|
50
|
+
* JPEG samples and the halftone scan's cut-line signal is only ~3x noise, so
|
|
51
|
+
* transcoding would attack the exact signal the detector needs.
|
|
52
|
+
*/
|
|
53
|
+
export const STICKER_SHEET_MAX_BYTES = 100 * 1024 * 1024;
|
|
54
|
+
/** Title text is mandatory everywhere in this feature. */
|
|
55
|
+
function requireTitle(raw) {
|
|
56
|
+
const title = (raw ?? "").trim();
|
|
57
|
+
if (title.length === 0) {
|
|
58
|
+
throw new ValidationError("A name is required.", {
|
|
59
|
+
title: "Give this sheet a name you will recognise later.",
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return title.slice(0, 160);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create the sheet row and mint the write URL for its scan, in one call.
|
|
66
|
+
*
|
|
67
|
+
* 🛑 The ROW comes first and the bytes second, which is the opposite of what
|
|
68
|
+
* feels natural. The object path contains the sheet id, so an upload signed
|
|
69
|
+
* before the row exists has nowhere to go — and a bucket object with no
|
|
70
|
+
* document pointing at it is unreachable AND unmeterable: it costs storage
|
|
71
|
+
* forever with nothing in any UI to delete it from. A document whose upload
|
|
72
|
+
* never completes is the harmless direction: `traceStatus` stays `queued`,
|
|
73
|
+
* `sourceScan.bytes` is 0, and the list can say so.
|
|
74
|
+
*
|
|
75
|
+
* 🛑 `widthPx`/`heightPx` are 0 until `attachStickerSheetScan`. appkit cannot
|
|
76
|
+
* probe an image — the codec is injected, which is what Root Cause #24 is
|
|
77
|
+
* about — so the only party that already knows the dimensions is the browser
|
|
78
|
+
* that just decoded it for live tuning. Guessing them here would put two
|
|
79
|
+
* numbers on the document that nothing measured.
|
|
80
|
+
*/
|
|
81
|
+
export async function createStickerSheet(input) {
|
|
82
|
+
const title = requireTitle(input.title);
|
|
83
|
+
const sheet = await stickerSheetsRepository.create({
|
|
84
|
+
title,
|
|
85
|
+
scanType: input.scanType ?? "auto",
|
|
86
|
+
widthPx: 0,
|
|
87
|
+
heightPx: 0,
|
|
88
|
+
sourceScan: { assetPath: "", contentType: input.contentType, bytes: 0 },
|
|
89
|
+
});
|
|
90
|
+
const upload = await signScanUpload({
|
|
91
|
+
sheetId: sheet.id,
|
|
92
|
+
runId: SOURCE_SEGMENT,
|
|
93
|
+
contentType: input.contentType,
|
|
94
|
+
extension: input.extension,
|
|
95
|
+
});
|
|
96
|
+
return { sheetId: sheet.id, upload };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Verify the uploaded bytes and record them on the sheet.
|
|
100
|
+
*
|
|
101
|
+
* 🛑 The caller's `assetPath` is CONTAINED to this sheet's own prefix before
|
|
102
|
+
* anything reads it. Every other field here is merely wrong if wrong; this one
|
|
103
|
+
* is a capability — `readScanBytes` will later fetch whatever it names, and a
|
|
104
|
+
* path naming another sheet would turn this endpoint into a cross-sheet read
|
|
105
|
+
* primitive. `readScanBytes` has its own `SCAN_ROOT` check, which is the second
|
|
106
|
+
* layer, not the first: by the time it runs the path is already on a document.
|
|
107
|
+
*
|
|
108
|
+
* 🛑 `finalizeScanUpload` DELETES the object on a magic-byte mismatch, so a
|
|
109
|
+
* failure leaves nothing behind in the bucket. That is why the mismatch RETURNS
|
|
110
|
+
* rather than throwing: the sheet row survives and the operator re-uploads into
|
|
111
|
+
* it, instead of starting again with a fresh row and orphaning the first.
|
|
112
|
+
*/
|
|
113
|
+
export async function attachStickerSheetScan(input) {
|
|
114
|
+
await stickerSheetsRepository.findByIdOrFail(input.sheetId);
|
|
115
|
+
const expected = `${runPrefix(input.sheetId, SOURCE_SEGMENT)}/`;
|
|
116
|
+
if (!input.assetPath.startsWith(expected)) {
|
|
117
|
+
throw new ValidationError("That upload does not belong to this sheet.", {
|
|
118
|
+
assetPath: "Path is outside this sheet's storage prefix.",
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
const sized = Number.isInteger(input.widthPx) &&
|
|
122
|
+
input.widthPx > 0 &&
|
|
123
|
+
Number.isInteger(input.heightPx) &&
|
|
124
|
+
input.heightPx > 0;
|
|
125
|
+
if (!sized) {
|
|
126
|
+
throw new ValidationError("The scan's pixel dimensions are required.", {
|
|
127
|
+
widthPx: "Decode the image and send its real size.",
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
const result = await finalizeScanUpload(input.assetPath, STICKER_SHEET_MAX_BYTES);
|
|
131
|
+
if (!result.ok)
|
|
132
|
+
return { ok: false, code: result.code, message: result.message };
|
|
133
|
+
const patch = {
|
|
134
|
+
widthPx: input.widthPx,
|
|
135
|
+
heightPx: input.heightPx,
|
|
136
|
+
sourceScan: {
|
|
137
|
+
assetPath: input.assetPath,
|
|
138
|
+
contentType: result.contentType,
|
|
139
|
+
bytes: result.bytes,
|
|
140
|
+
...(input.sha256 ? { sha256: input.sha256 } : {}),
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
if (input.scanType)
|
|
144
|
+
patch.scanType = input.scanType;
|
|
145
|
+
/*
|
|
146
|
+
* dpi is written ONLY when one was supplied. An absent dpi is the documented
|
|
147
|
+
* signal that millimetre output must be WITHHELD (`bboxMm: null`), so
|
|
148
|
+
* defaulting it — to 72, which five of the nine reference scans falsely
|
|
149
|
+
* declare — would manufacture confident mm figures from a number the encoder
|
|
150
|
+
* wrote rather than anything about the scanner. A fabricated millimetre on a
|
|
151
|
+
* cut file is a physical production error, not a cosmetic one.
|
|
152
|
+
*/
|
|
153
|
+
if (input.dpi) {
|
|
154
|
+
patch.dpi = input.dpi;
|
|
155
|
+
patch.dpiSource = input.dpiSource ?? "embedded";
|
|
156
|
+
}
|
|
157
|
+
await stickerSheetsRepository.update(input.sheetId, patch);
|
|
158
|
+
return { ok: true, bytes: result.bytes };
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* The asset kinds a client may ask for.
|
|
162
|
+
*
|
|
163
|
+
* 🛑 A KIND, never a path, and this is the whole security shape of the asset
|
|
164
|
+
* endpoint: the client names WHAT it wants and the server looks the path up on
|
|
165
|
+
* the document. Accepting an `assetPath` instead would make the endpoint a
|
|
166
|
+
* signed-URL mint for any object in the bucket — including another admin's
|
|
167
|
+
* scans and, since the same bucket holds them, `private/digital-content/`.
|
|
168
|
+
* It is also what keeps every `*Path` field off the wire entirely, which is the
|
|
169
|
+
* property `PRIVATE_STICKER_SHEET_FIELDS` declares and
|
|
170
|
+
* audit-public-projection-parity enforces.
|
|
171
|
+
*/
|
|
172
|
+
export const STICKER_ASSET_KINDS = [
|
|
173
|
+
"scan",
|
|
174
|
+
"preview",
|
|
175
|
+
"overlay",
|
|
176
|
+
"geometry",
|
|
177
|
+
"cutSvg",
|
|
178
|
+
"thumbAtlas",
|
|
179
|
+
/*
|
|
180
|
+
* One promoted part's full-resolution PNG, by `ordinal`.
|
|
181
|
+
*
|
|
182
|
+
* 🛑 Absent until the producing run is PROMOTED — `SheetPart.assetPath` is
|
|
183
|
+
* only written by the `mode: "full"` shard path. Resolving to `null` before
|
|
184
|
+
* then is correct and must not read as an error: it is the normal state of
|
|
185
|
+
* every traced-but-unpromoted sheet.
|
|
186
|
+
*/
|
|
187
|
+
"part",
|
|
188
|
+
];
|
|
189
|
+
/**
|
|
190
|
+
* Mint a short-lived read URL for one asset of one sheet or run.
|
|
191
|
+
*
|
|
192
|
+
* `runId` absent means the sheet's currently-accepted artifacts; present means
|
|
193
|
+
* that specific run's, which is what makes two runs comparable side by side —
|
|
194
|
+
* the reason runs keep their own artifacts rather than overwriting the sheet's.
|
|
195
|
+
*
|
|
196
|
+
* Returns `null` for "there is no such asset", which the route maps to a 404.
|
|
197
|
+
* An absent artifact is the normal state of an unfinished or failed run, so it
|
|
198
|
+
* must not read as an error.
|
|
199
|
+
*/
|
|
200
|
+
export async function resolveStickerAssetUrl(input) {
|
|
201
|
+
const sheet = await stickerSheetsRepository.findByIdOrFail(input.sheetId);
|
|
202
|
+
if (input.kind === "scan") {
|
|
203
|
+
return sheet.sourceScan?.assetPath ? signedReadUrl(sheet.sourceScan.assetPath) : null;
|
|
204
|
+
}
|
|
205
|
+
if (input.kind === "part") {
|
|
206
|
+
if (typeof input.ordinal !== "number")
|
|
207
|
+
return null;
|
|
208
|
+
/*
|
|
209
|
+
* 🛑 Matched on `ordinal`, NEVER on array index — the same rule
|
|
210
|
+
* `updatePart` already states. `parts[]` is not guaranteed to be dense or
|
|
211
|
+
* ordered: a part can be removed, and a re-promote rewrites the array. An
|
|
212
|
+
* index lookup would silently serve a DIFFERENT sticker's PNG, which is
|
|
213
|
+
* indistinguishable from a correct response.
|
|
214
|
+
*/
|
|
215
|
+
const part = (sheet.parts ?? []).find((pt) => pt.ordinal === input.ordinal);
|
|
216
|
+
if (!part?.assetPath)
|
|
217
|
+
return null;
|
|
218
|
+
/*
|
|
219
|
+
* Still a signed-URL mint, like every other kind here —
|
|
220
|
+
* `audit-sticker-trace-egress` forbids a route under this feature
|
|
221
|
+
* returning bytes, and this is the unwatermarked printable original, which
|
|
222
|
+
* is the one thing that must not be served through a public path.
|
|
223
|
+
*/
|
|
224
|
+
return signedReadUrl(part.assetPath, {
|
|
225
|
+
downloadAs: `part-${String(input.ordinal).padStart(3, "0")}.png`,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
let path;
|
|
229
|
+
if (input.runId) {
|
|
230
|
+
const run = await stickerTraceRunsRepository.findByIdOrFail(input.runId);
|
|
231
|
+
/*
|
|
232
|
+
* The run must belong to THIS sheet. The run id is caller-supplied and the
|
|
233
|
+
* sheet id is in the URL, so this is the only place the pairing can be
|
|
234
|
+
* checked — without it, any run id from any sheet resolves and signs.
|
|
235
|
+
*/
|
|
236
|
+
if (run.sheetId !== input.sheetId)
|
|
237
|
+
return null;
|
|
238
|
+
const a = run.artifacts ?? {};
|
|
239
|
+
path =
|
|
240
|
+
input.kind === "preview"
|
|
241
|
+
? a.previewPath
|
|
242
|
+
: input.kind === "overlay"
|
|
243
|
+
? a.overlayPath
|
|
244
|
+
: input.kind === "geometry"
|
|
245
|
+
? a.geometryPath
|
|
246
|
+
: input.kind === "cutSvg"
|
|
247
|
+
? a.cutSvgPath
|
|
248
|
+
: a.thumbAtlasPath;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
const a = sheet.artifacts ?? {};
|
|
252
|
+
/*
|
|
253
|
+
* A sheet has no `thumbAtlasPath` — the atlas is a REVIEW artifact, which
|
|
254
|
+
* only a run produces. Falling through to undefined is correct, and is why
|
|
255
|
+
* this is not the same lookup as the run branch above.
|
|
256
|
+
*/
|
|
257
|
+
path =
|
|
258
|
+
input.kind === "preview"
|
|
259
|
+
? a.previewPath
|
|
260
|
+
: input.kind === "overlay"
|
|
261
|
+
? a.overlayPath
|
|
262
|
+
: input.kind === "geometry"
|
|
263
|
+
? a.geometryPath
|
|
264
|
+
: input.kind === "cutSvg"
|
|
265
|
+
? a.cutSvgPath
|
|
266
|
+
: undefined;
|
|
267
|
+
}
|
|
268
|
+
if (!path)
|
|
269
|
+
return null;
|
|
270
|
+
/*
|
|
271
|
+
* The cut SVG is forced to `attachment`. SVG is deliberately excluded from
|
|
272
|
+
* `ALLOWED_IMAGE_MIMES` as an XSS surface, and a signed GCS URL is still our
|
|
273
|
+
* origin's data — the canvas draws cut lines from `geometry.json`, never by
|
|
274
|
+
* rendering the SVG.
|
|
275
|
+
*/
|
|
276
|
+
return signedReadUrl(path, input.kind === "cutSvg" ? { downloadAs: "cut.svg" } : undefined);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Stored bytes and object count per sheet, biggest first.
|
|
280
|
+
*
|
|
281
|
+
* 🛑 Object COUNT is reported beside bytes because GCS meters them separately
|
|
282
|
+
* (Class A writes, Class B reads). The sprite-atlas decision exists precisely
|
|
283
|
+
* because sixty thumbnails per run would spend that budget sixty times faster
|
|
284
|
+
* than the same pixels in one object — a meter showing only bytes would make
|
|
285
|
+
* undoing that look free.
|
|
286
|
+
*
|
|
287
|
+
* 🛑 Retention is manual by design: nothing auto-prunes, so any past run's
|
|
288
|
+
* overlay can still be opened and compared. That is only a safe default if the
|
|
289
|
+
* cost is VISIBLE rather than discovered, which is what this is for — Root
|
|
290
|
+
* Cause #104's first signal was a billing page.
|
|
291
|
+
*
|
|
292
|
+
* 🛑 One bucket listing per sheet, so this is deliberately NOT folded into the
|
|
293
|
+
* sheet list. Twenty sheets would be twenty `getFiles` calls on every page
|
|
294
|
+
* view; it is its own endpoint an operator opens.
|
|
295
|
+
*/
|
|
296
|
+
export async function measureStickerStorage(sheetIds) {
|
|
297
|
+
const measured = await Promise.all(sheetIds.map(async (id) => {
|
|
298
|
+
const sheet = await stickerSheetsRepository.findById(id);
|
|
299
|
+
if (!sheet)
|
|
300
|
+
return null;
|
|
301
|
+
const { bytes, objects } = await measureSheetBytes(id);
|
|
302
|
+
return { sheetId: id, title: sheet.title, bytes, objects };
|
|
303
|
+
}));
|
|
304
|
+
const rows = measured.filter((r) => r !== null);
|
|
305
|
+
rows.sort((a, b) => b.bytes - a.bytes);
|
|
306
|
+
return {
|
|
307
|
+
rows,
|
|
308
|
+
totalBytes: rows.reduce((n, r) => n + r.bytes, 0),
|
|
309
|
+
totalObjects: rows.reduce((n, r) => n + r.objects, 0),
|
|
310
|
+
};
|
|
311
|
+
}
|