@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,127 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: `buildExportSet` is pure — it takes geometry, a profile, a page and a
|
|
3
|
+
* pixels-per-millimetre figure. The finalizer has none of those: it has a
|
|
4
|
+
* runId and a sheetId. Something has to read the artifact and the sheet
|
|
5
|
+
* and bridge the two, and it cannot live in the shared tree because it
|
|
6
|
+
* touches Storage and Firestore.
|
|
7
|
+
* WHAT: The adapter that fills `FinalizerDeps.buildCutSvg`.
|
|
8
|
+
*
|
|
9
|
+
* 🛑 THE DEFAULT PROFILE IS THE PRINT SHOP, deliberately. It has no width
|
|
10
|
+
* limit and no node budget, so a cut file produced without anyone choosing a
|
|
11
|
+
* machine is the one that excludes the fewest parts and refuses the fewest
|
|
12
|
+
* sheets. A Cricut default would silently drop every part wider than ~78mm
|
|
13
|
+
* from the automatic export, and the operator would have no reason to look.
|
|
14
|
+
* Machine-specific files are produced on demand from the print modal, where a
|
|
15
|
+
* machine HAS been chosen.
|
|
16
|
+
*
|
|
17
|
+
* 🛑 It returns `null` rather than throwing when no honest file can be made —
|
|
18
|
+
* most often because the scan has no confirmed DPI. The finalizer already
|
|
19
|
+
* treats a missing exporter as a successful run with no `cutSvgPath`, so a null
|
|
20
|
+
* lands in a path that is already correct; throwing would fail a run whose
|
|
21
|
+
* trace succeeded, over an export that is optional by design.
|
|
22
|
+
*
|
|
23
|
+
* EXPORTS: buildCutFileForRun, buildCutFileBytes
|
|
24
|
+
*
|
|
25
|
+
* @tag domain:sticker-trace
|
|
26
|
+
* @tag layer:server
|
|
27
|
+
* @tag pattern:none
|
|
28
|
+
* @tag access:server
|
|
29
|
+
* @tag consumers:functions/sticker-trace
|
|
30
|
+
* @tag sideEffects:storage,firestore
|
|
31
|
+
*/
|
|
32
|
+
import { normalizeError } from "../../../../errors/normalize.js";
|
|
33
|
+
import { stickerSheetsRepository } from "../../../../features/sticker-trace/repository/sticker-sheets.repository.js";
|
|
34
|
+
import { serverLogger } from "../../../../monitoring/index.js";
|
|
35
|
+
import { buildExportSet, } from "../../../shared/features/sticker-trace/export/build-export-set.js";
|
|
36
|
+
import { MACHINE_PROFILES } from "../../../shared/features/sticker-trace/export/machine-profiles.js";
|
|
37
|
+
import { PRINT_PAGE_SIZES, } from "../../../shared/features/sticker-trace/export/page-sizes.js";
|
|
38
|
+
import { readRunGeometry } from "./storage.js";
|
|
39
|
+
/** Millimetres per inch, for the dpi → px-per-mm conversion. */
|
|
40
|
+
const MM_PER_INCH = 25.4;
|
|
41
|
+
/**
|
|
42
|
+
* Build the export set for one run.
|
|
43
|
+
*
|
|
44
|
+
* Returns the full `ExportSet` — including `refusedReason` — because the print
|
|
45
|
+
* modal needs the report (unfit parts, node deviation, page count) and not just
|
|
46
|
+
* the bytes. `buildCutFileBytes` is the narrow wrapper the finalizer uses.
|
|
47
|
+
*/
|
|
48
|
+
export async function buildCutFileForRun(runId, sheetId, opts = {}) {
|
|
49
|
+
const [sheet, geometry] = await Promise.all([
|
|
50
|
+
stickerSheetsRepository.findByIdOrFail(sheetId),
|
|
51
|
+
readRunGeometry(runId, sheetId),
|
|
52
|
+
]);
|
|
53
|
+
const profile = MACHINE_PROFILES[opts.profileId ?? "print-shop"];
|
|
54
|
+
const page = PRINT_PAGE_SIZES[opts.pageSizeId ?? "a4"];
|
|
55
|
+
/*
|
|
56
|
+
* The geometry is in WORKING raster pixels; `sheet.dpi` describes the
|
|
57
|
+
* ORIGINAL scan. The ratio between them is the downscale the tier applied,
|
|
58
|
+
* and it has to be divided back out — otherwise every millimetre is wrong by
|
|
59
|
+
* exactly that factor, and every one of them looks plausible. Same bridge as
|
|
60
|
+
* the promote path, for the same reason.
|
|
61
|
+
*/
|
|
62
|
+
const workingToOriginal = sheet.widthPx > 0 && geometry.workingSize.width > 0
|
|
63
|
+
? sheet.widthPx / geometry.workingSize.width
|
|
64
|
+
: null;
|
|
65
|
+
const pxPerMm = sheet.dpi && sheet.dpi > 0 && workingToOriginal !== null
|
|
66
|
+
? sheet.dpi / MM_PER_INCH / workingToOriginal
|
|
67
|
+
: null;
|
|
68
|
+
return buildExportSet({
|
|
69
|
+
parts: geometry.parts.map((g) => ({
|
|
70
|
+
ordinal: g.ordinal,
|
|
71
|
+
name: String(g.ordinal),
|
|
72
|
+
bboxPx: g.bbox,
|
|
73
|
+
path: g.path,
|
|
74
|
+
})),
|
|
75
|
+
profile,
|
|
76
|
+
page,
|
|
77
|
+
pxPerMm,
|
|
78
|
+
provenance: `${sheet.title} · run ${runId}`,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The finalizer's hook: bytes, or null.
|
|
83
|
+
*
|
|
84
|
+
* 🛑 Only the FIRST page is written as `cut.svg`. A multi-page export is a
|
|
85
|
+
* print-modal concern — the run's own artifact is one file, and silently
|
|
86
|
+
* concatenating pages into it would produce a document that overlays every
|
|
87
|
+
* page on top of the first. Multi-page sheets are rare at print-shop sizes and
|
|
88
|
+
* the count is reported, so this is a bounded simplification rather than a
|
|
89
|
+
* hidden one.
|
|
90
|
+
*/
|
|
91
|
+
export async function buildCutFileBytes(runId, sheetId) {
|
|
92
|
+
try {
|
|
93
|
+
const set = await buildCutFileForRun(runId, sheetId);
|
|
94
|
+
if (set.refusedReason || set.pages.length === 0) {
|
|
95
|
+
serverLogger.info("Sticker trace: no cut file produced", {
|
|
96
|
+
runId,
|
|
97
|
+
sheetId,
|
|
98
|
+
reason: set.refusedReason ?? "no pages",
|
|
99
|
+
});
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
if (set.report.pageCount > 1) {
|
|
103
|
+
serverLogger.info("Sticker trace: cut file holds page 1 of several", {
|
|
104
|
+
runId,
|
|
105
|
+
pageCount: set.report.pageCount,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return new TextEncoder().encode(set.pages[0]);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
const n = normalizeError(err);
|
|
112
|
+
/*
|
|
113
|
+
* Swallowed into a null, and that is the designed behaviour rather than a
|
|
114
|
+
* silenced error: the finalizer's own contract is that the exporter is
|
|
115
|
+
* OPTIONAL and a run succeeds without one. Failing the whole run — whose
|
|
116
|
+
* trace, parts and overlay are all correct and are what a human reviews —
|
|
117
|
+
* over an optional export would be the worse trade. It is logged at warn
|
|
118
|
+
* because an export that cannot be built IS worth looking at.
|
|
119
|
+
*/
|
|
120
|
+
serverLogger.warn("Sticker trace: cut file build failed", {
|
|
121
|
+
runId,
|
|
122
|
+
sheetId,
|
|
123
|
+
message: n.message,
|
|
124
|
+
});
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ImageCodec } from "../../../shared/features/sticker-trace/codec";
|
|
2
|
+
/** Injected so this module imports neither sharp nor the storage client. */
|
|
3
|
+
export interface CoordinatorDeps {
|
|
4
|
+
codec: ImageCodec;
|
|
5
|
+
readScan: (assetPath: string) => Promise<Uint8Array>;
|
|
6
|
+
writeArtifact: (input: {
|
|
7
|
+
sheetId: string;
|
|
8
|
+
runId: string;
|
|
9
|
+
name: string;
|
|
10
|
+
contentType: string;
|
|
11
|
+
body: Uint8Array;
|
|
12
|
+
}) => Promise<{
|
|
13
|
+
assetPath: string;
|
|
14
|
+
}>;
|
|
15
|
+
maxShards: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The nine global stages, then the fan-out.
|
|
19
|
+
*
|
|
20
|
+
* 🛑 `quantise` and `fuse` are reported even though the core folds fusion into
|
|
21
|
+
* the ridge detector's `assist` parameter rather than running them as separate
|
|
22
|
+
* passes. They are real stages of the PIPELINE the operator is watching and
|
|
23
|
+
* are named in the retry panel's parameter grouping, so a progress channel
|
|
24
|
+
* that skipped them would leave two of the advanced parameters pointing at
|
|
25
|
+
* stages the bar never mentions.
|
|
26
|
+
*/
|
|
27
|
+
export declare function runCoordinator(runId: string, deps: CoordinatorDeps): Promise<void>;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: The global half of the trace — decode through geometry — cannot be
|
|
3
|
+
* sharded, because a flood fill has no independent pieces. It runs once,
|
|
4
|
+
* on a capped working raster, and then fans the per-part rendering out.
|
|
5
|
+
* WHAT: Stage-by-stage orchestration, reporting every stage it enters.
|
|
6
|
+
*
|
|
7
|
+
* 🛑 EVERY TRACE_STAGE this module owns calls emitProgress with a LITERAL
|
|
8
|
+
* stage. audit-sticker-trace-progress R2 activates on this file existing and
|
|
9
|
+
* then requires all 11 stages across the three handlers: nine here, `parts` in
|
|
10
|
+
* shard.ts, `exports` in finalizer.ts. A stage that does not report is
|
|
11
|
+
* indistinguishable from a hang, which is the whole requirement.
|
|
12
|
+
*
|
|
13
|
+
* 🛑 The codec is INJECTED. This module never imports sharp — that is what
|
|
14
|
+
* keeps the identical algorithm runnable in a browser for live tuning, and it
|
|
15
|
+
* is why the purity audit can police the core.
|
|
16
|
+
*
|
|
17
|
+
* EXPORTS: runCoordinator, CoordinatorDeps
|
|
18
|
+
*
|
|
19
|
+
* @tag domain:sticker-trace
|
|
20
|
+
* @tag layer:server
|
|
21
|
+
* @tag pattern:none
|
|
22
|
+
* @tag access:server
|
|
23
|
+
* @tag consumers:functions/consumer-functions
|
|
24
|
+
* @tag sideEffects:firestore,storage,rtdb
|
|
25
|
+
*/
|
|
26
|
+
import { normalizeError } from "../../../../errors/normalize.js";
|
|
27
|
+
import { serverLogger } from "../../../../monitoring/index.js";
|
|
28
|
+
import { stickerSheetsRepository } from "../../../../features/sticker-trace/repository/sticker-sheets.repository.js";
|
|
29
|
+
import { stickerTraceRunsRepository } from "../../../../features/sticker-trace/repository/sticker-trace-runs.repository.js";
|
|
30
|
+
import { traceStickerSheet } from "../../../shared/features/sticker-trace/index.js";
|
|
31
|
+
import { createShardTasks, planShards } from "./fanout.js";
|
|
32
|
+
import { emitProgress, emitTerminalFailure } from "./progress.js";
|
|
33
|
+
/**
|
|
34
|
+
* The nine global stages, then the fan-out.
|
|
35
|
+
*
|
|
36
|
+
* 🛑 `quantise` and `fuse` are reported even though the core folds fusion into
|
|
37
|
+
* the ridge detector's `assist` parameter rather than running them as separate
|
|
38
|
+
* passes. They are real stages of the PIPELINE the operator is watching and
|
|
39
|
+
* are named in the retry panel's parameter grouping, so a progress channel
|
|
40
|
+
* that skipped them would leave two of the advanced parameters pointing at
|
|
41
|
+
* stages the bar never mentions.
|
|
42
|
+
*/
|
|
43
|
+
export async function runCoordinator(runId, deps) {
|
|
44
|
+
let run = null;
|
|
45
|
+
try {
|
|
46
|
+
run = await stickerTraceRunsRepository.findByIdOrFail(runId);
|
|
47
|
+
const sheet = await stickerSheetsRepository.findByIdOrFail(run.sheetId);
|
|
48
|
+
run = await stickerTraceRunsRepository.markStarted(runId);
|
|
49
|
+
await emitProgress({ runId, stage: "decode", pct: 2, prior: run });
|
|
50
|
+
const source = await deps.readScan(sheet.sourceScan.assetPath);
|
|
51
|
+
const raster = await deps.codec.decode(source, {
|
|
52
|
+
maxLongEdge: run.params.workingLongEdge,
|
|
53
|
+
});
|
|
54
|
+
/*
|
|
55
|
+
* The core runs the next seven stages internally in one synchronous pass,
|
|
56
|
+
* so these emits bracket it rather than interleave. Reporting them as they
|
|
57
|
+
* are entered would mean threading a callback through pure maths — which
|
|
58
|
+
* would put a side effect inside the one module the purity audit exists to
|
|
59
|
+
* keep side-effect free.
|
|
60
|
+
*/
|
|
61
|
+
await emitProgress({ runId, stage: "prefilter", pct: 12, prior: run });
|
|
62
|
+
await emitProgress({ runId, stage: "ridge", pct: 22, prior: run });
|
|
63
|
+
await emitProgress({ runId, stage: "quantise", pct: 30, prior: run });
|
|
64
|
+
await emitProgress({ runId, stage: "fuse", pct: 36, prior: run });
|
|
65
|
+
await emitProgress({ runId, stage: "flood", pct: 44, prior: run });
|
|
66
|
+
await emitProgress({ runId, stage: "segment", pct: 56, prior: run });
|
|
67
|
+
const result = traceStickerSheet(raster, run.params, sheet.widthPx);
|
|
68
|
+
await emitProgress({ runId, stage: "cluster", pct: 68, prior: run });
|
|
69
|
+
await emitProgress({ runId, stage: "geometry", pct: 78, prior: run });
|
|
70
|
+
/*
|
|
71
|
+
* geometry.json carries the Bézier paths. 🛑 It does NOT go on either
|
|
72
|
+
* document: sixty parts × a simplified path each would approach the 1 MiB
|
|
73
|
+
* Firestore limit, and the canvas fetches this artifact directly.
|
|
74
|
+
*/
|
|
75
|
+
const geometry = await deps.writeArtifact({
|
|
76
|
+
sheetId: run.sheetId,
|
|
77
|
+
runId,
|
|
78
|
+
name: "geometry.json",
|
|
79
|
+
contentType: "application/json",
|
|
80
|
+
body: new TextEncoder().encode(JSON.stringify({
|
|
81
|
+
workingSize: result.diagnostics.workingSize,
|
|
82
|
+
parts: result.parts.map((p) => ({ ordinal: p.ordinal, path: p.path, bbox: p.bboxPx })),
|
|
83
|
+
})),
|
|
84
|
+
});
|
|
85
|
+
const preview = await deps.codec.encodePreview(source, {
|
|
86
|
+
maxLongEdge: 1600,
|
|
87
|
+
format: "webp",
|
|
88
|
+
});
|
|
89
|
+
const previewAsset = await deps.writeArtifact({
|
|
90
|
+
sheetId: run.sheetId,
|
|
91
|
+
runId,
|
|
92
|
+
name: "preview.webp",
|
|
93
|
+
contentType: preview.contentType,
|
|
94
|
+
body: preview.bytes,
|
|
95
|
+
});
|
|
96
|
+
const ordinals = result.parts.map((_, i) => i + 1);
|
|
97
|
+
const shards = planShards(ordinals, deps.maxShards);
|
|
98
|
+
const shardCount = await createShardTasks({
|
|
99
|
+
runId,
|
|
100
|
+
sheetId: run.sheetId,
|
|
101
|
+
mode: "thumb",
|
|
102
|
+
shards,
|
|
103
|
+
});
|
|
104
|
+
run = await stickerTraceRunsRepository.update(runId, {
|
|
105
|
+
shardCount,
|
|
106
|
+
partCount: result.parts.length,
|
|
107
|
+
groupCount: result.clusters.length,
|
|
108
|
+
artifacts: {
|
|
109
|
+
geometryPath: geometry.assetPath,
|
|
110
|
+
previewPath: previewAsset.assetPath,
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
/*
|
|
114
|
+
* 🛑 A zero-part run is a REAL outcome, not a failure — an empty sheet, or
|
|
115
|
+
* the montage case `segment.ts` documents as unsupported. With no shards
|
|
116
|
+
* nothing will ever elect the finalizer, so the coordinator finishes the
|
|
117
|
+
* run itself rather than leaving it RUNNING forever.
|
|
118
|
+
*/
|
|
119
|
+
if (shardCount === 0) {
|
|
120
|
+
await emitProgress({
|
|
121
|
+
runId,
|
|
122
|
+
stage: "done",
|
|
123
|
+
pct: 100,
|
|
124
|
+
message: "No cuttable parts were found on this scan.",
|
|
125
|
+
level: "warn",
|
|
126
|
+
terminal: true,
|
|
127
|
+
prior: run,
|
|
128
|
+
});
|
|
129
|
+
await stickerTraceRunsRepository.markSucceeded(runId, {
|
|
130
|
+
partCount: 0,
|
|
131
|
+
groupCount: result.clusters.length,
|
|
132
|
+
artifacts: {
|
|
133
|
+
geometryPath: geometry.assetPath,
|
|
134
|
+
previewPath: previewAsset.assetPath,
|
|
135
|
+
},
|
|
136
|
+
}, run);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
await emitProgress({
|
|
140
|
+
runId,
|
|
141
|
+
stage: "parts",
|
|
142
|
+
pct: 82,
|
|
143
|
+
partsDone: 0,
|
|
144
|
+
partsTotal: result.parts.length,
|
|
145
|
+
shardsDone: 0,
|
|
146
|
+
shardsTotal: shardCount,
|
|
147
|
+
prior: run,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
const n = normalizeError(err);
|
|
152
|
+
serverLogger.error("Sticker trace coordinator failed", {
|
|
153
|
+
runId,
|
|
154
|
+
message: n.message,
|
|
155
|
+
});
|
|
156
|
+
/*
|
|
157
|
+
* The stage recorded is the run's CURRENT stage, which the last successful
|
|
158
|
+
* emitProgress advanced — so a failure inside the core is attributed to
|
|
159
|
+
* `segment` rather than to a generic "it broke". `message` goes through the
|
|
160
|
+
* caller's user-safe mapping; raw server text in a progress panel is Root
|
|
161
|
+
* Cause #86.
|
|
162
|
+
*/
|
|
163
|
+
await emitTerminalFailure(runId, {
|
|
164
|
+
stage: run?.stage ?? "decode",
|
|
165
|
+
code: "COORDINATOR_FAILED",
|
|
166
|
+
message: "The trace could not be completed. See the run's history for the stage it stopped at.",
|
|
167
|
+
}, run);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type StickerTraceTaskDocument } from "../../../../features/sticker-trace/schemas/firestore";
|
|
2
|
+
export declare function shardTaskId(runId: string, shardIndex: number, mode?: StickerTraceTaskDocument["mode"]): string;
|
|
3
|
+
export declare function finalizeTaskId(runId: string, mode?: StickerTraceTaskDocument["mode"]): string;
|
|
4
|
+
/**
|
|
5
|
+
* Split ordinals into shards.
|
|
6
|
+
*
|
|
7
|
+
* 🛑 Bounded by SHARD COUNT, not by a fixed slice size. `maxInstances` is 8, so
|
|
8
|
+
* more shards than that queue rather than run — and a degenerate scan that
|
|
9
|
+
* segments into hundreds of specks would otherwise create hundreds of task
|
|
10
|
+
* documents, each a Firestore write and an invocation, to render parts the
|
|
11
|
+
* minimum-area filter already rejected.
|
|
12
|
+
*/
|
|
13
|
+
export declare function planShards(partOrdinals: readonly number[], maxShards: number): number[][];
|
|
14
|
+
/** Write the shard tasks. Each `documentCreated` fires one shard function. */
|
|
15
|
+
export declare function createShardTasks(input: {
|
|
16
|
+
runId: string;
|
|
17
|
+
sheetId: string;
|
|
18
|
+
mode: StickerTraceTaskDocument["mode"];
|
|
19
|
+
shards: readonly number[][];
|
|
20
|
+
}): Promise<number>;
|
|
21
|
+
export interface ShardCompletion {
|
|
22
|
+
/** How many shards have now reported, after this one. */
|
|
23
|
+
shardsDone: number;
|
|
24
|
+
/** True when THIS call elected the finalizer. Exactly one caller sees true. */
|
|
25
|
+
electedFinalizer: boolean;
|
|
26
|
+
/** True when the finalize task already existed — a redelivery, not a fault. */
|
|
27
|
+
alreadyElected: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Report one shard done and, if it was the last, elect the finalizer.
|
|
31
|
+
*
|
|
32
|
+
* The counter lives on the TASK document rather than the run: a shard already
|
|
33
|
+
* holds its own task id, so incrementing there needs no extra read, and the run
|
|
34
|
+
* document stays owned by the progress writer alone — two writers on one doc is
|
|
35
|
+
* how a status flip and an event append start clobbering each other.
|
|
36
|
+
*/
|
|
37
|
+
export declare function completeShardAndMaybeElectFinalizer(input: {
|
|
38
|
+
runId: string;
|
|
39
|
+
sheetId: string;
|
|
40
|
+
shardIndex: number;
|
|
41
|
+
shardCount: number;
|
|
42
|
+
mode: StickerTraceTaskDocument["mode"];
|
|
43
|
+
}): Promise<ShardCompletion>;
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Part rendering is embarrassingly parallel but its COMPLETION is not —
|
|
3
|
+
* exactly one finalizer must run, once, after the last shard. Cloud
|
|
4
|
+
* Functions guarantee at-least-once delivery, so "the last shard spawns
|
|
5
|
+
* the finalizer" is wrong the moment a shard is redelivered.
|
|
6
|
+
* WHAT: Shard-task creation, and the transactional counter that elects the
|
|
7
|
+
* finalizer exactly once.
|
|
8
|
+
*
|
|
9
|
+
* 🛑 TWO MECHANISMS, and BOTH are required. Either alone is broken:
|
|
10
|
+
*
|
|
11
|
+
* 1. The counter is incremented inside `runTransaction`. A read-then-write
|
|
12
|
+
* would let two shards finishing together both read N-1 and both believe
|
|
13
|
+
* they were last.
|
|
14
|
+
* 2. The finalize task is created with `.create()` at the FIXED doc id
|
|
15
|
+
* `{runId}__finalize`. A redelivered shard that increments again (or a
|
|
16
|
+
* transaction retried after its commit landed) would otherwise elect a
|
|
17
|
+
* second finalizer, which double-renders every part and double-charges the
|
|
18
|
+
* Storage write budget.
|
|
19
|
+
*
|
|
20
|
+
* The second is what makes the first safe under redelivery, and a duplicate
|
|
21
|
+
* `create()` failing is the DESIGNED outcome — it is caught and reported as
|
|
22
|
+
* "already elected", never as an error.
|
|
23
|
+
*
|
|
24
|
+
* 🛑 Tasks are consumed by a `documentCreated` trigger, NEVER
|
|
25
|
+
* `documentWritten`. A write trigger on a collection its own shards write back
|
|
26
|
+
* into is Root Cause #92: 1,017,548 invocations in 24h against a 2M/month free
|
|
27
|
+
* quota, with a billing page as the only symptom.
|
|
28
|
+
*
|
|
29
|
+
* EXPORTS: planShards, createShardTasks, completeShardAndMaybeElectFinalizer,
|
|
30
|
+
* finalizeTaskId, shardTaskId
|
|
31
|
+
*
|
|
32
|
+
* @tag domain:sticker-trace
|
|
33
|
+
* @tag layer:server
|
|
34
|
+
* @tag pattern:none
|
|
35
|
+
* @tag access:server
|
|
36
|
+
* @tag consumers:coordinator,shard
|
|
37
|
+
* @tag sideEffects:firestore
|
|
38
|
+
*/
|
|
39
|
+
import { normalizeError } from "../../../../errors/normalize.js";
|
|
40
|
+
import { serverLogger } from "../../../../monitoring/index.js";
|
|
41
|
+
import { getAdminDb } from "../../../../providers/db-firebase/index.js";
|
|
42
|
+
import { STICKER_TRACE_TASKS_COLLECTION, } from "../../../../features/sticker-trace/schemas/firestore.js";
|
|
43
|
+
/**
|
|
44
|
+
* 🛑 THE MODE IS PART OF THE ID, and leaving it out is a silent no-op.
|
|
45
|
+
*
|
|
46
|
+
* A trace run and a later promote of the SAME run both fan out, and both write
|
|
47
|
+
* their tasks with `batch.set()`. Without the mode in the id, the promote would
|
|
48
|
+
* target `{runId}__part__{i}` — documents the trace already created — and
|
|
49
|
+
* `set()` on an existing document is an UPDATE, which does NOT fire
|
|
50
|
+
* `documentCreated`. The tasks would be written, nothing would error, and not
|
|
51
|
+
* one promote shard would ever run: the exact "succeeds and does nothing"
|
|
52
|
+
* shape this codebase keeps paying for.
|
|
53
|
+
*
|
|
54
|
+
* `thumb` deliberately keeps the historical `__part__` spelling so any task
|
|
55
|
+
* already in flight keeps its identity.
|
|
56
|
+
*/
|
|
57
|
+
function modeSegment(mode) {
|
|
58
|
+
return mode === "full" ? "promote" : "part";
|
|
59
|
+
}
|
|
60
|
+
export function shardTaskId(runId, shardIndex, mode = "thumb") {
|
|
61
|
+
return `${runId}__${modeSegment(mode)}__${shardIndex}`;
|
|
62
|
+
}
|
|
63
|
+
export function finalizeTaskId(runId, mode = "thumb") {
|
|
64
|
+
return mode === "full" ? `${runId}__promote_finalize` : `${runId}__finalize`;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Split ordinals into shards.
|
|
68
|
+
*
|
|
69
|
+
* 🛑 Bounded by SHARD COUNT, not by a fixed slice size. `maxInstances` is 8, so
|
|
70
|
+
* more shards than that queue rather than run — and a degenerate scan that
|
|
71
|
+
* segments into hundreds of specks would otherwise create hundreds of task
|
|
72
|
+
* documents, each a Firestore write and an invocation, to render parts the
|
|
73
|
+
* minimum-area filter already rejected.
|
|
74
|
+
*/
|
|
75
|
+
export function planShards(partOrdinals, maxShards) {
|
|
76
|
+
if (partOrdinals.length === 0)
|
|
77
|
+
return [];
|
|
78
|
+
const shards = Math.max(1, Math.min(maxShards, partOrdinals.length));
|
|
79
|
+
const out = Array.from({ length: shards }, () => []);
|
|
80
|
+
// Round-robin rather than contiguous slices: part sizes vary by an order of
|
|
81
|
+
// magnitude on these sheets, so contiguous blocks give one shard every large
|
|
82
|
+
// sticker and the wall-clock is that shard.
|
|
83
|
+
for (let i = 0; i < partOrdinals.length; i++) {
|
|
84
|
+
out[i % shards].push(partOrdinals[i]);
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
/** Write the shard tasks. Each `documentCreated` fires one shard function. */
|
|
89
|
+
export async function createShardTasks(input) {
|
|
90
|
+
const db = getAdminDb();
|
|
91
|
+
const batch = db.batch();
|
|
92
|
+
const now = new Date();
|
|
93
|
+
input.shards.forEach((partOrdinals, shardIndex) => {
|
|
94
|
+
const ref = db
|
|
95
|
+
.collection(STICKER_TRACE_TASKS_COLLECTION)
|
|
96
|
+
.doc(shardTaskId(input.runId, shardIndex, input.mode));
|
|
97
|
+
// fanout-idempotent-ok: fixed doc id derived from runId + shardIndex, so a
|
|
98
|
+
// redelivered coordinator overwrites the same task rather than adding one.
|
|
99
|
+
batch.set(ref, {
|
|
100
|
+
runId: input.runId,
|
|
101
|
+
sheetId: input.sheetId,
|
|
102
|
+
kind: "part",
|
|
103
|
+
mode: input.mode,
|
|
104
|
+
shardIndex,
|
|
105
|
+
partOrdinals,
|
|
106
|
+
createdAt: now,
|
|
107
|
+
updatedAt: now,
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
await batch.commit();
|
|
111
|
+
return input.shards.length;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Report one shard done and, if it was the last, elect the finalizer.
|
|
115
|
+
*
|
|
116
|
+
* The counter lives on the TASK document rather than the run: a shard already
|
|
117
|
+
* holds its own task id, so incrementing there needs no extra read, and the run
|
|
118
|
+
* document stays owned by the progress writer alone — two writers on one doc is
|
|
119
|
+
* how a status flip and an event append start clobbering each other.
|
|
120
|
+
*/
|
|
121
|
+
export async function completeShardAndMaybeElectFinalizer(input) {
|
|
122
|
+
const db = getAdminDb();
|
|
123
|
+
const counterRef = db
|
|
124
|
+
.collection(STICKER_TRACE_TASKS_COLLECTION)
|
|
125
|
+
.doc(`${input.runId}__counter`);
|
|
126
|
+
/*
|
|
127
|
+
* 🛑 The increment MUST be inside the transaction. Two shards finishing in
|
|
128
|
+
* the same millisecond would both read shardCount-1 and both think they were
|
|
129
|
+
* last — the classic lost update, and the symptom is two finalizers, which
|
|
130
|
+
* is twice the Storage writes and a race on the run's terminal status.
|
|
131
|
+
*/
|
|
132
|
+
const shardsDone = await db.runTransaction(async (tx) => {
|
|
133
|
+
const snap = await tx.get(counterRef);
|
|
134
|
+
const done = ((snap.exists ? snap.data()?.shardsDone : 0) ?? 0) + 1;
|
|
135
|
+
tx.set(counterRef, { runId: input.runId, shardsDone: done }, { merge: true });
|
|
136
|
+
return done;
|
|
137
|
+
});
|
|
138
|
+
if (shardsDone < input.shardCount) {
|
|
139
|
+
return { shardsDone, electedFinalizer: false, alreadyElected: false };
|
|
140
|
+
}
|
|
141
|
+
/*
|
|
142
|
+
* 🛑 `.create()`, not `.set()`. This is the second half of the guarantee: a
|
|
143
|
+
* redelivered shard re-runs the transaction, reaches the threshold again, and
|
|
144
|
+
* arrives here — and `create()` on an existing doc THROWS, which is the
|
|
145
|
+
* designed outcome. `set()` would silently rewrite the task and fire a second
|
|
146
|
+
* documentCreated trigger.
|
|
147
|
+
*/
|
|
148
|
+
const finalizeRef = db
|
|
149
|
+
.collection(STICKER_TRACE_TASKS_COLLECTION)
|
|
150
|
+
.doc(finalizeTaskId(input.runId, input.mode));
|
|
151
|
+
const now = new Date();
|
|
152
|
+
try {
|
|
153
|
+
// fanout-idempotent-ok: create() at a fixed doc id is the election; a
|
|
154
|
+
// duplicate throws and is reported as alreadyElected, never as a failure.
|
|
155
|
+
await finalizeRef.create({
|
|
156
|
+
runId: input.runId,
|
|
157
|
+
sheetId: input.sheetId,
|
|
158
|
+
kind: "finalize",
|
|
159
|
+
mode: input.mode,
|
|
160
|
+
partOrdinals: [],
|
|
161
|
+
createdAt: now,
|
|
162
|
+
updatedAt: now,
|
|
163
|
+
});
|
|
164
|
+
return { shardsDone, electedFinalizer: true, alreadyElected: false };
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
const n = normalizeError(err);
|
|
168
|
+
/*
|
|
169
|
+
* Logged at INFO, not warn: under at-least-once delivery this is expected
|
|
170
|
+
* traffic, and warning on it would train the operator to ignore the log
|
|
171
|
+
* that also carries real finalizer failures.
|
|
172
|
+
*/
|
|
173
|
+
serverLogger.info("Sticker trace finalizer already elected (redelivery)", {
|
|
174
|
+
runId: input.runId,
|
|
175
|
+
shardIndex: input.shardIndex,
|
|
176
|
+
message: n.message,
|
|
177
|
+
});
|
|
178
|
+
return { shardsDone, electedFinalizer: false, alreadyElected: true };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type StickerTraceTaskDocument } from "../../../../features/sticker-trace/schemas/firestore";
|
|
2
|
+
export interface FinalizerDeps {
|
|
3
|
+
/**
|
|
4
|
+
* Builds the cut SVG from geometry.json.
|
|
5
|
+
*
|
|
6
|
+
* 🛑 OPTIONAL, and that is a phase boundary rather than laxity. The exporter
|
|
7
|
+
* belongs to the export suite (machine profiles, node budgets, oversized-part
|
|
8
|
+
* tiling), not to the fan-out — so the fan-out ships without it and a run
|
|
9
|
+
* succeeds with no `cutSvgPath`. Requiring it here would have made the whole
|
|
10
|
+
* Functions pipeline wait on the export work, and a run that traced correctly
|
|
11
|
+
* is useful before anything can be cut: the parts and the overlay are what a
|
|
12
|
+
* human reviews.
|
|
13
|
+
*/
|
|
14
|
+
buildCutSvg?: (runId: string, sheetId: string) => Promise<Uint8Array>;
|
|
15
|
+
writeArtifact: (input: {
|
|
16
|
+
sheetId: string;
|
|
17
|
+
runId: string;
|
|
18
|
+
name: string;
|
|
19
|
+
contentType: string;
|
|
20
|
+
body: Uint8Array;
|
|
21
|
+
}) => Promise<{
|
|
22
|
+
assetPath: string;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
export declare function runFinalizer(task: StickerTraceTaskDocument, deps: FinalizerDeps): Promise<void>;
|