@mohasinac/appkit 4.52.4 → 4.53.0
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/server/features/auctions/actions.js +1 -1
- package/dist/_internal/server/features/categories/data.js +23 -7
- package/dist/_internal/server/features/checkout/actions.js +10 -3
- package/dist/_internal/server/features/checkout/data.d.ts +15 -0
- package/dist/_internal/server/features/checkout/data.js +20 -3
- 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 +4 -0
- 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/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/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 +1 -1
- 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 +80 -0
- package/dist/_internal/server/features/sticker-trace/adapters.js +174 -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.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 +141 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.js +279 -0
- package/dist/_internal/server/features/sticker-trace/storage.d.ts +135 -0
- package/dist/_internal/server/features/sticker-trace/storage.js +282 -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/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/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 +11 -0
- package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/art/config.js +1 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/auction/config.js +1 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/classified/config.js +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +1 -0
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
- package/dist/_internal/shared/listing-types/feature-flags.js +9 -0
- package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/live/config.js +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/standard/config.js +1 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +1 -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 +65 -0
- package/dist/_internal/shared/search/match.js +263 -0
- package/dist/client.d.ts +8 -7
- package/dist/client.js +12 -5
- package/dist/configs/eslint.js +22 -2
- package/dist/constants/api-endpoints.d.ts +68 -0
- package/dist/constants/api-endpoints.js +32 -0
- package/dist/constants/field-names.d.ts +7 -1
- package/dist/constants/field-names.js +36 -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/account/api/[userId]/addresses/route.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/addresses/repository/addresses.repository.d.ts +17 -6
- package/dist/features/addresses/repository/addresses.repository.js +65 -9
- package/dist/features/addresses/schemas/firestore.d.ts +17 -6
- 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 +0 -1
- package/dist/features/admin/components/AdminContactView.js +1 -1
- package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
- package/dist/features/admin/components/AdminNewsletterView.js +1 -1
- package/dist/features/admin/components/AdminOrdersView.js +9 -2
- 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 +24 -37
- 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/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 +1 -1
- 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/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 +62 -1
- 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/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 +33 -7
- package/dist/features/auth/repository/user.repository.js +100 -15
- package/dist/features/auth/schemas/firestore.d.ts +63 -12
- package/dist/features/auth/schemas/firestore.js +11 -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/cart/api/route.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/route.js +10 -10
- package/dist/features/categories/components/CategoryDetailPageView.js +35 -5
- package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
- package/dist/features/categories/components/index.d.ts +0 -2
- package/dist/features/categories/components/index.js +0 -1
- package/dist/features/categories/repository/categories.repository.d.ts +1 -0
- package/dist/features/categories/repository/categories.repository.js +31 -1
- package/dist/features/categories/schemas/index.d.ts +2 -2
- package/dist/features/categories/utils/taxonomy-visual.d.ts +21 -0
- package/dist/features/categories/utils/taxonomy-visual.js +58 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
- 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/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/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/GroupedListingEditorView.js +17 -2
- 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/api/route.js +2 -2
- package/dist/features/homepage/api/sections/route.js +1 -1
- package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
- package/dist/features/homepage/components/AnnouncementBar.js +13 -19
- package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
- package/dist/features/homepage/components/index.d.ts +0 -2
- package/dist/features/homepage/components/index.js +0 -1
- package/dist/features/homepage/repository/homepage.repository.js +1 -1
- package/dist/features/homepage/schemas/firestore.d.ts +6 -0
- package/dist/features/homepage/schemas/index.d.ts +10 -10
- package/dist/features/layout/AppLayoutShell.d.ts +12 -3
- 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/BottomNavbar.d.ts +14 -0
- package/dist/features/layout/BottomNavbar.js +43 -3
- 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.d.ts +1 -3
- package/dist/features/layout/TitleBarLayout.js +3 -4
- 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/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/modals/ImageEditor.js +5 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
- package/dist/features/media/repository/media-assets.repository.d.ts +19 -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/payments/repository/payments.repository.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +23 -6
- package/dist/features/payments/repository/payout.repository.js +63 -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/repository/pre-orders.repository.d.ts +3 -3
- package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
- package/dist/features/products/api/[id]/route.js +1 -1
- package/dist/features/products/components/ListingBottomActions.js +4 -0
- package/dist/features/products/components/ProductDetailPageView.js +2 -1
- package/dist/features/products/components/ProductGalleryClient.js +2 -2
- package/dist/features/products/components/ProductGrid.js +12 -1
- 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/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.js +13 -1
- package/dist/features/products/schemas/index.d.ts +2 -2
- package/dist/features/products/types/index.d.ts +1 -1
- 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/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/search/components/SearchResultsPageView.js +2 -1
- package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
- package/dist/features/search/hooks/useSearchIndex.js +172 -0
- package/dist/features/search/repository/search.repository.js +2 -2
- 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.js +9 -1
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutSettingsView.js +0 -1
- package/dist/features/seller/components/SellerPayoutsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.js +0 -1
- package/dist/features/seller/components/SellerProductsView.js +1 -1
- package/dist/features/seller/components/SellerShippingView.js +0 -1
- package/dist/features/seller/components/SellerStorefrontView.js +0 -1
- package/dist/features/seller/components/index.d.ts +0 -4
- package/dist/features/seller/components/index.js +0 -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/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 +248 -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/StoreNavTabs.js +17 -2
- package/dist/features/stores/manifest.js +8 -4
- 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/content-discovery__authenticity-checker.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +243 -0
- 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/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/design-ux__header-controls-and-messages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +85 -0
- package/dist/features/tester/seed-data/authored/index.js +10 -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/tools__sticker-tracer.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +283 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +235 -22
- package/dist/index.d.ts +10 -23
- package/dist/index.js +27 -19
- 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 +4 -4
- package/dist/next/routing/route-map.js +25 -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 +11 -9
- package/dist/providers/db-firebase/base.repository.js +19 -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 +13 -20
- package/dist/schemas/registry.js +31 -14
- package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
- package/dist/security/encrypted.d.ts +117 -0
- package/dist/security/encrypted.js +100 -0
- package/dist/security/index.d.ts +5 -2
- package/dist/security/index.js +16 -2
- 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/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 +34 -0
- package/dist/seed/authenticity-knowledge-seed-data.js +1277 -0
- package/dist/seed/bids-seed-data.d.ts +2 -2
- package/dist/seed/bids-seed-data.js +23 -2
- 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/homepage-sections-seed-data.js +39 -23
- package/dist/seed/index.d.ts +1 -0
- package/dist/seed/index.js +1 -0
- package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
- 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/payouts-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.js +1 -1
- 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 +1 -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.js +5 -1
- package/dist/server.d.ts +18 -3
- package/dist/server.js +59 -3
- package/dist/styles.css +237 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Button.js +7 -1
- package/dist/ui/components/FilterChipGroup.d.ts +11 -0
- package/dist/ui/components/FilterChipGroup.js +1 -1
- package/dist/ui/components/ImageGallery.js +6 -1
- package/dist/ui/components/ListingLayout.js +14 -8
- 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/RecordDetailModal.js +14 -1
- package/dist/ui/components/RowActionMenu.js +5 -1
- package/dist/ui/components/SideDrawer.js +5 -1
- package/dist/ui/components/SideModal.js +9 -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 +1 -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 +6 -0
- package/dist/ui/icons/icon-registry.js +17 -1
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +1 -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/validation/schemas.d.ts +8 -8
- package/package.json +6 -2
- package/scripts/seed-cli.mjs +3 -0
- 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/components/HowItWorksInfoView.d.ts +0 -36
- package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
- 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/seller/components/SellerStoreView.d.ts +0 -8
- package/dist/features/seller/components/SellerStoreView.js +0 -8
|
@@ -29,6 +29,7 @@ export { paymentReviewAutoApproveHandler } from "./paymentReviewAutoApprove";
|
|
|
29
29
|
export { productStatsSyncHandler } from "./productStatsSync";
|
|
30
30
|
export { revenueRollupHandler } from "./revenueRollup";
|
|
31
31
|
export { priceIndexRollupHandler } from "./priceIndexRollup";
|
|
32
|
+
export { searchIndexBuildHandler } from "./searchIndexBuild";
|
|
32
33
|
export { analyticsAlertEvaluateHandler } from "./analyticsAlertEvaluate";
|
|
33
34
|
export { pageViewRollupHandler } from "./pageViewRollup";
|
|
34
35
|
export { pageViewPruneHandler } from "./pageViewPrune";
|
|
@@ -29,6 +29,7 @@ export { paymentReviewAutoApproveHandler } from "./paymentReviewAutoApprove.js";
|
|
|
29
29
|
export { productStatsSyncHandler } from "./productStatsSync.js";
|
|
30
30
|
export { revenueRollupHandler } from "./revenueRollup.js";
|
|
31
31
|
export { priceIndexRollupHandler } from "./priceIndexRollup.js";
|
|
32
|
+
export { searchIndexBuildHandler } from "./searchIndexBuild.js";
|
|
32
33
|
export { analyticsAlertEvaluateHandler } from "./analyticsAlertEvaluate.js";
|
|
33
34
|
export { pageViewRollupHandler } from "./pageViewRollup.js";
|
|
34
35
|
export { pageViewPruneHandler } from "./pageViewPrune.js";
|
|
@@ -1,8 +1,26 @@
|
|
|
1
|
+
import { markSearchIndexDirty } from "../../features/search/index-build/artifact-store.js";
|
|
1
2
|
import { handleCategoryWrite } from "../core/onCategoryWrite.js";
|
|
3
|
+
/*
|
|
4
|
+
* 🛑 Also marks the public search index stale.
|
|
5
|
+
*
|
|
6
|
+
* Added here rather than in the core so all five content triggers share one
|
|
7
|
+
* shape, and so each core keeps doing exactly the one thing it is named for.
|
|
8
|
+
*
|
|
9
|
+
* Safe under Root Cause #92 — which cost 12 MILLION invocations a day —
|
|
10
|
+
* because it writes a DIFFERENT collection (`searchIndex/manifest`) from the
|
|
11
|
+
* one this trigger watches, the same argument `priceIndexRollup` makes for
|
|
12
|
+
* writing `priceIndex/{leafId}` and never `categories`. #92's other half is
|
|
13
|
+
* handled inside `markSearchIndexDirty`: its no-op guard is a BOOLEAN read,
|
|
14
|
+
* never a deep compare, so a burst of 50 writes costs 50 reads and one write.
|
|
15
|
+
*
|
|
16
|
+
* It never throws: a missed mark delays the index by one 15-minute cadence,
|
|
17
|
+
* and failing the content write that triggered it would be far worse.
|
|
18
|
+
*/
|
|
2
19
|
export const onCategoryWriteHandler = async (event, ctx) => {
|
|
3
20
|
await handleCategoryWrite({
|
|
4
21
|
categoryId: event.params.categoryId,
|
|
5
22
|
before: event.before,
|
|
6
23
|
after: event.after,
|
|
7
24
|
}, ctx);
|
|
25
|
+
await markSearchIndexDirty(ctx.db, "onCategoryWrite");
|
|
8
26
|
};
|
|
@@ -1,8 +1,26 @@
|
|
|
1
|
+
import { markSearchIndexDirty } from "../../features/search/index-build/artifact-store.js";
|
|
1
2
|
import { handleProductWrite } from "../core/onProductWrite.js";
|
|
3
|
+
/*
|
|
4
|
+
* 🛑 Also marks the public search index stale.
|
|
5
|
+
*
|
|
6
|
+
* Added here rather than in the core so all five content triggers share one
|
|
7
|
+
* shape, and so each core keeps doing exactly the one thing it is named for.
|
|
8
|
+
*
|
|
9
|
+
* Safe under Root Cause #92 — which cost 12 MILLION invocations a day —
|
|
10
|
+
* because it writes a DIFFERENT collection (`searchIndex/manifest`) from the
|
|
11
|
+
* one this trigger watches, the same argument `priceIndexRollup` makes for
|
|
12
|
+
* writing `priceIndex/{leafId}` and never `categories`. #92's other half is
|
|
13
|
+
* handled inside `markSearchIndexDirty`: its no-op guard is a BOOLEAN read,
|
|
14
|
+
* never a deep compare, so a burst of 50 writes costs 50 reads and one write.
|
|
15
|
+
*
|
|
16
|
+
* It never throws: a missed mark delays the index by one 15-minute cadence,
|
|
17
|
+
* and failing the content write that triggered it would be far worse.
|
|
18
|
+
*/
|
|
2
19
|
export const onProductWriteHandler = async (event, ctx) => {
|
|
3
20
|
await handleProductWrite({
|
|
4
21
|
productId: event.params.productId,
|
|
5
22
|
before: event.before,
|
|
6
23
|
after: event.after,
|
|
7
24
|
}, ctx);
|
|
25
|
+
await markSearchIndexDirty(ctx.db, "onProductWrite");
|
|
8
26
|
};
|
|
@@ -1,4 +1,22 @@
|
|
|
1
|
+
import { markSearchIndexDirty } from "../../features/search/index-build/artifact-store.js";
|
|
1
2
|
import { handleReviewWrite } from "../core/onReviewWrite.js";
|
|
3
|
+
/*
|
|
4
|
+
* 🛑 Also marks the public search index stale.
|
|
5
|
+
*
|
|
6
|
+
* Added here rather than in the core so all five content triggers share one
|
|
7
|
+
* shape, and so each core keeps doing exactly the one thing it is named for.
|
|
8
|
+
*
|
|
9
|
+
* Safe under Root Cause #92 — which cost 12 MILLION invocations a day —
|
|
10
|
+
* because it writes a DIFFERENT collection (`searchIndex/manifest`) from the
|
|
11
|
+
* one this trigger watches, the same argument `priceIndexRollup` makes for
|
|
12
|
+
* writing `priceIndex/{leafId}` and never `categories`. #92's other half is
|
|
13
|
+
* handled inside `markSearchIndexDirty`: its no-op guard is a BOOLEAN read,
|
|
14
|
+
* never a deep compare, so a burst of 50 writes costs 50 reads and one write.
|
|
15
|
+
*
|
|
16
|
+
* It never throws: a missed mark delays the index by one 15-minute cadence,
|
|
17
|
+
* and failing the content write that triggered it would be far worse.
|
|
18
|
+
*/
|
|
2
19
|
export const onReviewWriteHandler = async (event, ctx) => {
|
|
3
20
|
await handleReviewWrite({ reviewId: event.params.reviewId, before: event.before, after: event.after }, ctx);
|
|
21
|
+
await markSearchIndexDirty(ctx.db, "onReviewWrite");
|
|
4
22
|
};
|
|
@@ -1,5 +1,22 @@
|
|
|
1
|
+
import { markSearchIndexDirty } from "../../features/search/index-build/artifact-store.js";
|
|
1
2
|
import { handleScamReportVerified } from "../core/onScamReportVerified.js";
|
|
2
3
|
import { handleScamReportRejected } from "../core/onScamReportRejected.js";
|
|
4
|
+
/*
|
|
5
|
+
* 🛑 Also marks the public search index stale.
|
|
6
|
+
*
|
|
7
|
+
* Added here rather than in the core so all five content triggers share one
|
|
8
|
+
* shape, and so each core keeps doing exactly the one thing it is named for.
|
|
9
|
+
*
|
|
10
|
+
* Safe under Root Cause #92 — which cost 12 MILLION invocations a day —
|
|
11
|
+
* because it writes a DIFFERENT collection (`searchIndex/manifest`) from the
|
|
12
|
+
* one this trigger watches, the same argument `priceIndexRollup` makes for
|
|
13
|
+
* writing `priceIndex/{leafId}` and never `categories`. #92's other half is
|
|
14
|
+
* handled inside `markSearchIndexDirty`: its no-op guard is a BOOLEAN read,
|
|
15
|
+
* never a deep compare, so a burst of 50 writes costs 50 reads and one write.
|
|
16
|
+
*
|
|
17
|
+
* It never throws: a missed mark delays the index by one 15-minute cadence,
|
|
18
|
+
* and failing the content write that triggered it would be far worse.
|
|
19
|
+
*/
|
|
3
20
|
export const onScamReportUpdateHandler = async (event, ctx) => {
|
|
4
21
|
const before = event.before;
|
|
5
22
|
const after = event.after;
|
|
@@ -22,4 +39,5 @@ export const onScamReportUpdateHandler = async (event, ctx) => {
|
|
|
22
39
|
else if (nextStatus === "rejected") {
|
|
23
40
|
await handleScamReportRejected(baseInput, ctx);
|
|
24
41
|
}
|
|
42
|
+
await markSearchIndexDirty(ctx.db, "onScamReportUpdate");
|
|
25
43
|
};
|
|
@@ -1,8 +1,26 @@
|
|
|
1
|
+
import { markSearchIndexDirty } from "../../features/search/index-build/artifact-store.js";
|
|
1
2
|
import { handleStoreWrite } from "../core/onStoreWrite.js";
|
|
3
|
+
/*
|
|
4
|
+
* 🛑 Also marks the public search index stale.
|
|
5
|
+
*
|
|
6
|
+
* Added here rather than in the core so all five content triggers share one
|
|
7
|
+
* shape, and so each core keeps doing exactly the one thing it is named for.
|
|
8
|
+
*
|
|
9
|
+
* Safe under Root Cause #92 — which cost 12 MILLION invocations a day —
|
|
10
|
+
* because it writes a DIFFERENT collection (`searchIndex/manifest`) from the
|
|
11
|
+
* one this trigger watches, the same argument `priceIndexRollup` makes for
|
|
12
|
+
* writing `priceIndex/{leafId}` and never `categories`. #92's other half is
|
|
13
|
+
* handled inside `markSearchIndexDirty`: its no-op guard is a BOOLEAN read,
|
|
14
|
+
* never a deep compare, so a burst of 50 writes costs 50 reads and one write.
|
|
15
|
+
*
|
|
16
|
+
* It never throws: a missed mark delays the index by one 15-minute cadence,
|
|
17
|
+
* and failing the content write that triggered it would be far worse.
|
|
18
|
+
*/
|
|
2
19
|
export const onStoreWriteHandler = async (event, ctx) => {
|
|
3
20
|
await handleStoreWrite({
|
|
4
21
|
storeId: event.params.storeId,
|
|
5
22
|
before: event.before,
|
|
6
23
|
after: event.after,
|
|
7
24
|
}, ctx);
|
|
25
|
+
await markSearchIndexDirty(ctx.db, "onStoreWrite");
|
|
8
26
|
};
|
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
import type { CallableHandler } from "../runtime/types";
|
|
2
2
|
import { type TriggerEventRaffleInput, type TriggerEventRaffleResult } from "../core/triggerEventRaffle";
|
|
3
|
+
/**
|
|
4
|
+
* Statuses come from `reasonToHttp`, shared with
|
|
5
|
+
* `POST /api/admin/events/[id]/trigger-raffle`.
|
|
6
|
+
*
|
|
7
|
+
* The hand-written chain this replaces knew two reasons (404 / 422) while the
|
|
8
|
+
* route mapped everything to 409 — so the same refusal had two different
|
|
9
|
+
* statuses depending on which door it came through (Root Cause #85).
|
|
10
|
+
*/
|
|
3
11
|
export declare const triggerEventRaffleHandler: CallableHandler<TriggerEventRaffleInput, TriggerEventRaffleResult>;
|
|
@@ -1,16 +1,25 @@
|
|
|
1
1
|
import { runTriggerEventRaffle, } from "../core/triggerEventRaffle.js";
|
|
2
|
-
|
|
2
|
+
import { reasonToHttp } from "../core/event-draw-reasons.js";
|
|
3
|
+
function httpError(message, status, code) {
|
|
3
4
|
const err = new Error(message);
|
|
4
5
|
err.httpStatus = status;
|
|
6
|
+
err.code = code;
|
|
5
7
|
return err;
|
|
6
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Statuses come from `reasonToHttp`, shared with
|
|
11
|
+
* `POST /api/admin/events/[id]/trigger-raffle`.
|
|
12
|
+
*
|
|
13
|
+
* The hand-written chain this replaces knew two reasons (404 / 422) while the
|
|
14
|
+
* route mapped everything to 409 — so the same refusal had two different
|
|
15
|
+
* statuses depending on which door it came through (Root Cause #85).
|
|
16
|
+
*/
|
|
7
17
|
export const triggerEventRaffleHandler = async (input, ctx) => {
|
|
8
18
|
const result = await runTriggerEventRaffle(input, ctx);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
throw httpError("No eligible entries for raffle", 422);
|
|
19
|
+
// Mirrors the route's own success test: a reason with no winner is a refusal.
|
|
20
|
+
if (result.reason && !result.raffleWinnerUserId) {
|
|
21
|
+
const { status, code, message } = reasonToHttp(result.reason);
|
|
22
|
+
throw httpError(message, status, code);
|
|
14
23
|
}
|
|
15
24
|
return result;
|
|
16
25
|
};
|
|
@@ -1063,6 +1063,35 @@ export const ACTIONS = {
|
|
|
1063
1063
|
confirmKind: "danger",
|
|
1064
1064
|
},
|
|
1065
1065
|
},
|
|
1066
|
+
/*
|
|
1067
|
+
* The raffle draw. Added 2026-10-19 — before this there was NO control to
|
|
1068
|
+
* draw a raffle anywhere in the product: the endpoint and its
|
|
1069
|
+
* `ADMIN_ENDPOINTS.EVENT_TRIGGER_RAFFLE` constant existed with zero
|
|
1070
|
+
* callers, and the tester case whose step 3 reads "trigger the raffle
|
|
1071
|
+
* draw" was literally unexecutable.
|
|
1072
|
+
*
|
|
1073
|
+
* `kind: "danger"` with a REQUIRED confirmation, because a draw is
|
|
1074
|
+
* genuinely irreversible: it writes the winner onto the event, and the
|
|
1075
|
+
* winner's notification cannot be recalled. The server enforces the
|
|
1076
|
+
* one-draw invariant transactionally and answers 409
|
|
1077
|
+
* `RAFFLE_ALREADY_DRAWN` on a second attempt, so this dialog is the
|
|
1078
|
+
* courtesy and that 409 is the guarantee.
|
|
1079
|
+
*/
|
|
1080
|
+
"draw-raffle-winner": {
|
|
1081
|
+
iconKey: "verify",
|
|
1082
|
+
id: "event.draw-raffle-winner",
|
|
1083
|
+
label: "Draw raffle winner",
|
|
1084
|
+
ariaLabel: "Pick a random winner from the approved entries",
|
|
1085
|
+
description: "Picks one winner at random from this event's approved entries, records them on the event, and notifies them.",
|
|
1086
|
+
kind: "danger",
|
|
1087
|
+
permissions: ["admin"],
|
|
1088
|
+
confirmation: {
|
|
1089
|
+
title: "Draw the raffle winner?",
|
|
1090
|
+
body: "One winner will be picked at random from the approved entries, announced on the event page, and notified. A raffle can only be drawn once — this action cannot be undone.",
|
|
1091
|
+
confirmLabel: "Yes, draw the winner",
|
|
1092
|
+
confirmKind: "danger",
|
|
1093
|
+
},
|
|
1094
|
+
},
|
|
1066
1095
|
},
|
|
1067
1096
|
USER: {
|
|
1068
1097
|
"cancel-order": {
|
|
@@ -31,7 +31,6 @@
|
|
|
31
31
|
* render). Under-revalidating is the failure that shows a buyer a sold-out
|
|
32
32
|
* listing as in stock, so when in doubt this returns MORE paths, not fewer.
|
|
33
33
|
*/
|
|
34
|
-
/** What the caller knows about the written document, when it knows anything. */
|
|
35
34
|
export interface RevalidateHints {
|
|
36
35
|
/** `standard` | `auction` | `pre-order` | … — picks the right detail route. */
|
|
37
36
|
listingType?: string;
|
|
@@ -31,6 +31,8 @@
|
|
|
31
31
|
* render). Under-revalidating is the failure that shows a buyer a sold-out
|
|
32
32
|
* listing as in stock, so when in doubt this returns MORE paths, not fewer.
|
|
33
33
|
*/
|
|
34
|
+
/** What the caller knows about the written document, when it knows anything. */
|
|
35
|
+
import { ROUTES } from "../../../next/routing/route-map.js";
|
|
34
36
|
/** Detail route per listing type. Mirrors `ListingTypePlugin.detailRoute`. */
|
|
35
37
|
const PRODUCT_DETAIL_BY_TYPE = {
|
|
36
38
|
standard: (id) => `/products/${id}`,
|
|
@@ -73,7 +75,7 @@ function listingTypeFromId(id) {
|
|
|
73
75
|
return undefined;
|
|
74
76
|
}
|
|
75
77
|
function productTargets(id, hints) {
|
|
76
|
-
const out = [
|
|
78
|
+
const out = [ROUTES.HOME, ROUTES.PUBLIC.PRODUCTS];
|
|
77
79
|
if (!id)
|
|
78
80
|
return out;
|
|
79
81
|
const type = hints?.listingType ?? listingTypeFromId(id);
|
|
@@ -81,7 +83,7 @@ function productTargets(id, hints) {
|
|
|
81
83
|
out.push(PRODUCT_DETAIL_BY_TYPE[type](id));
|
|
82
84
|
// The type's own browse page, when it has one distinct from /products.
|
|
83
85
|
const browse = PRODUCT_DETAIL_BY_TYPE[type](id).replace(/\/[^/]+$/, "");
|
|
84
|
-
if (browse && browse !==
|
|
86
|
+
if (browse && browse !== ROUTES.PUBLIC.PRODUCTS)
|
|
85
87
|
out.push(browse);
|
|
86
88
|
}
|
|
87
89
|
else {
|
|
@@ -119,26 +121,26 @@ export function revalidateTargetsFor(collection, id, hints) {
|
|
|
119
121
|
case "categories":
|
|
120
122
|
// Brands and pricing bundles are `categories` rows discriminated by
|
|
121
123
|
// `categoryType`, so all three detail shapes are marked.
|
|
122
|
-
paths = [
|
|
124
|
+
paths = [ROUTES.HOME, ROUTES.PUBLIC.CATEGORIES];
|
|
123
125
|
if (id)
|
|
124
126
|
paths.push(`/categories/${id}`, `/brands/${id}`, `/bundles/${id}`);
|
|
125
127
|
break;
|
|
126
128
|
case "blogPosts":
|
|
127
|
-
paths = [
|
|
129
|
+
paths = [ROUTES.HOME, ROUTES.BLOG.LIST];
|
|
128
130
|
if (id)
|
|
129
131
|
paths.push(`/blog/${id}`);
|
|
130
132
|
break;
|
|
131
133
|
case "events":
|
|
132
|
-
paths = [
|
|
134
|
+
paths = [ROUTES.HOME, ROUTES.PUBLIC.EVENTS];
|
|
133
135
|
if (id)
|
|
134
136
|
paths.push(`/events/${id}`);
|
|
135
137
|
break;
|
|
136
138
|
case "reviews":
|
|
137
139
|
// A new review changes the product's rating and the homepage stat.
|
|
138
|
-
paths = [
|
|
140
|
+
paths = [ROUTES.HOME, ROUTES.PUBLIC.REVIEWS];
|
|
139
141
|
break;
|
|
140
142
|
case "stores":
|
|
141
|
-
paths = [
|
|
143
|
+
paths = [ROUTES.HOME, ROUTES.PUBLIC.STORES];
|
|
142
144
|
if (id)
|
|
143
145
|
paths.push(`/stores/${id}`);
|
|
144
146
|
break;
|
|
@@ -148,7 +150,7 @@ export function revalidateTargetsFor(collection, id, hints) {
|
|
|
148
150
|
paths = ["/"];
|
|
149
151
|
break;
|
|
150
152
|
case "faqs":
|
|
151
|
-
paths = [
|
|
153
|
+
paths = [ROUTES.HOME, ROUTES.PUBLIC.FAQS];
|
|
152
154
|
break;
|
|
153
155
|
default:
|
|
154
156
|
paths = [];
|
|
@@ -3,3 +3,17 @@ export declare const EVENTS_UPCOMING_LIMIT = 10;
|
|
|
3
3
|
export declare const EVENT_MAX_ENTRIES_DEFAULT = 500;
|
|
4
4
|
export declare const EVENT_TITLE_MAX_LENGTH = 200;
|
|
5
5
|
export declare const EVENT_DESCRIPTION_MAX_LENGTH = 5000;
|
|
6
|
+
/**
|
|
7
|
+
* Entries one person may put into a raffle.
|
|
8
|
+
*
|
|
9
|
+
* One, because a raffle is one ticket per person and there is nothing to
|
|
10
|
+
* configure: `maxEntriesPerUser` exists on `SurveyConfig` only, and
|
|
11
|
+
* `EventDocument` has no `raffleConfig` at all.
|
|
12
|
+
*
|
|
13
|
+
* 🛑 Shared deliberately, by BOTH `enterEvent`'s server-side dedupe and the
|
|
14
|
+
* `EventRaffleEntryForm` prop that renders "you've used all N entry slots".
|
|
15
|
+
* Two mirrored literals is the shape that made this bug survive: the form
|
|
16
|
+
* already defaulted to 1 and displayed that sentence, while the server
|
|
17
|
+
* enforced nothing, so the UI claimed a limit that did not exist.
|
|
18
|
+
*/
|
|
19
|
+
export declare const RAFFLE_MAX_ENTRIES_PER_USER = 1;
|
|
@@ -3,3 +3,17 @@ export const EVENTS_UPCOMING_LIMIT = 10;
|
|
|
3
3
|
export const EVENT_MAX_ENTRIES_DEFAULT = 500;
|
|
4
4
|
export const EVENT_TITLE_MAX_LENGTH = 200;
|
|
5
5
|
export const EVENT_DESCRIPTION_MAX_LENGTH = 5000;
|
|
6
|
+
/**
|
|
7
|
+
* Entries one person may put into a raffle.
|
|
8
|
+
*
|
|
9
|
+
* One, because a raffle is one ticket per person and there is nothing to
|
|
10
|
+
* configure: `maxEntriesPerUser` exists on `SurveyConfig` only, and
|
|
11
|
+
* `EventDocument` has no `raffleConfig` at all.
|
|
12
|
+
*
|
|
13
|
+
* 🛑 Shared deliberately, by BOTH `enterEvent`'s server-side dedupe and the
|
|
14
|
+
* `EventRaffleEntryForm` prop that renders "you've used all N entry slots".
|
|
15
|
+
* Two mirrored literals is the shape that made this bug survive: the form
|
|
16
|
+
* already defaulted to 1 and displayed that sentence, while the server
|
|
17
|
+
* enforced nothing, so the UI claimed a limit that did not exist.
|
|
18
|
+
*/
|
|
19
|
+
export const RAFFLE_MAX_ENTRIES_PER_USER = 1;
|
|
@@ -97,6 +97,14 @@ export function resolveNotificationActionUrl(relatedType, relatedId, audience) {
|
|
|
97
97
|
return audience === "admin"
|
|
98
98
|
? String(ROUTES.ADMIN.STORE_DETAIL(relatedId))
|
|
99
99
|
: String(ROUTES.STORE.DASHBOARD);
|
|
100
|
+
case "event":
|
|
101
|
+
/*
|
|
102
|
+
* The public winner page — the same destination for everyone, like
|
|
103
|
+
* `product` and `review`. An admin who drew the raffle and the buyer who
|
|
104
|
+
* won it both want to see the announcement, and that announcement IS the
|
|
105
|
+
* public page; there is no admin-side winner view to send them to.
|
|
106
|
+
*/
|
|
107
|
+
return String(ROUTES.PUBLIC.EVENT_WINNER(relatedId));
|
|
100
108
|
case "conversation":
|
|
101
109
|
// D9 — one universal inbox, reachable from any portal; there is no
|
|
102
110
|
// admin-specific thread view (admins moderate via reports, not a
|
|
@@ -42,6 +42,17 @@ export interface PublicSiteSettings {
|
|
|
42
42
|
chat?: {
|
|
43
43
|
enabled: boolean;
|
|
44
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* The browser-side search index kill switch. **ON by default** — the
|
|
47
|
+
* projection emits `indexEnabled: doc.search?.indexEnabled !== false`, so
|
|
48
|
+
* an unseeded settings document and an absent group both mean "search
|
|
49
|
+
* works". The property itself is optional only because an OLD cached
|
|
50
|
+
* `/api/site-settings` response predates the field; `useSearchIndex`
|
|
51
|
+
* therefore reads it as `!== false` a second time rather than `=== true`.
|
|
52
|
+
*/
|
|
53
|
+
search?: {
|
|
54
|
+
indexEnabled: boolean;
|
|
55
|
+
};
|
|
45
56
|
notificationChannels?: NotificationChannelConfig;
|
|
46
57
|
announcementBar?: SiteSettingsDocument["announcementBar"];
|
|
47
58
|
navConfig?: SiteSettingsDocument["navConfig"];
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { DecodedRaster, EncodedImage, Rect } from "./types";
|
|
2
|
+
export interface ProbeResult {
|
|
3
|
+
readonly width: number;
|
|
4
|
+
readonly height: number;
|
|
5
|
+
/**
|
|
6
|
+
* The density the FILE declares, unvalidated. Five of the nine reference
|
|
7
|
+
* scans say 72 or 96 — an encoder default, not a measurement — so a caller
|
|
8
|
+
* must treat this as a suggestion to confirm, never as truth.
|
|
9
|
+
*/
|
|
10
|
+
readonly dpi?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface DecodeOptions {
|
|
13
|
+
/**
|
|
14
|
+
* The memory cap, enforced INSIDE the codec.
|
|
15
|
+
*
|
|
16
|
+
* This is the single most important line in the seam. sharp downscales in
|
|
17
|
+
* native code during decode and canvas does it in `drawImage`, so a 34 MP
|
|
18
|
+
* source never materialises as a JS buffer. If a codec implementation ignores
|
|
19
|
+
* this and returns full-resolution pixels, every Float32Array downstream
|
|
20
|
+
* scales with it and the Function runs out of memory — with no error that
|
|
21
|
+
* points here.
|
|
22
|
+
*/
|
|
23
|
+
readonly maxLongEdge: number;
|
|
24
|
+
}
|
|
25
|
+
export interface PreviewOptions {
|
|
26
|
+
readonly maxLongEdge: number;
|
|
27
|
+
readonly format: "png" | "webp";
|
|
28
|
+
}
|
|
29
|
+
export interface ImageCodec {
|
|
30
|
+
/** Header-only. Must not decode pixels — it runs on the full upload. */
|
|
31
|
+
probe(source: Uint8Array): Promise<ProbeResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Decode, downscale to `maxLongEdge`, apply EXIF orientation, drop ICC.
|
|
34
|
+
*
|
|
35
|
+
* The last two matter for correctness, not tidiness: both codecs must hand
|
|
36
|
+
* back the SAME pixels for the same file, or a path tuned in the browser
|
|
37
|
+
* lands somewhere else when the Function re-renders it.
|
|
38
|
+
*/
|
|
39
|
+
decode(source: Uint8Array, opts: DecodeOptions): Promise<DecodedRaster>;
|
|
40
|
+
/**
|
|
41
|
+
* Decode one tile at native resolution, for the `max` tier's tiled ridge pass.
|
|
42
|
+
*
|
|
43
|
+
* 🛑 Tiles must overlap by at least the ridge kernel radius. A cut line
|
|
44
|
+
* crossing a seam with insufficient overlap is detected on neither side and
|
|
45
|
+
* breaks silently — producing worse output than the cheaper `precise` tier,
|
|
46
|
+
* which is the one way that tier can quietly be a downgrade.
|
|
47
|
+
*/
|
|
48
|
+
decodeTile(source: Uint8Array, tile: Rect): Promise<DecodedRaster>;
|
|
49
|
+
encodePng(raster: DecodedRaster): Promise<EncodedImage>;
|
|
50
|
+
/**
|
|
51
|
+
* Crop to `region` and apply `alpha` (length === region.width * region.height),
|
|
52
|
+
* in one call.
|
|
53
|
+
*
|
|
54
|
+
* One call rather than crop-then-composite so that neither codec needs its own
|
|
55
|
+
* pixel loop, and — the real reason — so a full-resolution part render never
|
|
56
|
+
* materialises a full-resolution RGBA buffer. The caller rasterises that one
|
|
57
|
+
* part's Bézier path into `alpha` over its own bounding box, and the codec
|
|
58
|
+
* reads only that box out of the source file. Sixty parts therefore cost
|
|
59
|
+
* sixty small allocations rather than one enormous one.
|
|
60
|
+
*/
|
|
61
|
+
encodePngRegion(source: Uint8Array, region: Rect, alpha: Uint8Array): Promise<EncodedImage>;
|
|
62
|
+
/** The ≤1 MB review image the UI loads instead of the scan. */
|
|
63
|
+
encodePreview(source: Uint8Array, opts: PreviewOptions): Promise<EncodedImage>;
|
|
64
|
+
/**
|
|
65
|
+
* Pack already-encoded tiles into one sprite atlas.
|
|
66
|
+
*
|
|
67
|
+
* Exists because object COUNT is metered separately from bytes: sixty
|
|
68
|
+
* thumbnail objects per run spend the Class A/B allowance sixty times faster
|
|
69
|
+
* than one atlas of the same pixels, and the part list loads in one request
|
|
70
|
+
* rather than sixty.
|
|
71
|
+
*/
|
|
72
|
+
encodeAtlas(tiles: readonly {
|
|
73
|
+
readonly raster: DecodedRaster;
|
|
74
|
+
readonly ordinal: number;
|
|
75
|
+
}[], opts: {
|
|
76
|
+
readonly maxLongEdge: number;
|
|
77
|
+
}): Promise<{
|
|
78
|
+
readonly image: EncodedImage;
|
|
79
|
+
readonly frames: Readonly<Record<number, Rect>>;
|
|
80
|
+
}>;
|
|
81
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: The tracing algorithm must be ONE implementation, but it has to run in a
|
|
3
|
+
* browser (live threshold tuning, ~1s per tweak) and in a Firebase Function
|
|
4
|
+
* (full-resolution render on save). Two implementations drift, and the one
|
|
5
|
+
* that drifts is always the one you are not currently looking at
|
|
6
|
+
* (CLAUDE.md Root Cause #59/#73). So the algorithm is shared and only the
|
|
7
|
+
* pixel I/O differs — this file is that seam, and it is the whole of it.
|
|
8
|
+
* WHAT: The codec interface. Declaration only: no implementation, no imports, no
|
|
9
|
+
* dependency on sharp, canvas, node:* or providers/*. Keeping this tree
|
|
10
|
+
* import-free is what lets the browser bundle it at all (Root Cause #24),
|
|
11
|
+
* and `audit-sticker-trace-purity` enforces it.
|
|
12
|
+
*
|
|
13
|
+
* The division of labour is deliberate and worth stating, because getting it
|
|
14
|
+
* wrong reintroduces the memory problem the design exists to avoid:
|
|
15
|
+
*
|
|
16
|
+
* codec — owns BYTES. Decodes, downscales, crops, encodes.
|
|
17
|
+
* core — owns MATHS. Takes a DecodedRaster, returns geometry. Never resizes
|
|
18
|
+
* anything, never allocates at source resolution, never sees a file.
|
|
19
|
+
*
|
|
20
|
+
* EXPORTS:
|
|
21
|
+
* ImageCodec, DecodeOptions, PreviewOptions, ProbeResult
|
|
22
|
+
*
|
|
23
|
+
* @tag domain:sticker-trace
|
|
24
|
+
* @tag layer:shared
|
|
25
|
+
* @tag pattern:port
|
|
26
|
+
* @tag access:isomorphic
|
|
27
|
+
* @tag consumers:canvas-codec,sharp-codec,run,coordinator,shard
|
|
28
|
+
* @tag sideEffects:none
|
|
29
|
+
*/
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { PrecisionTier, TraceParams } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* The memory cap, and the reason the core never sees a 34 MP buffer.
|
|
4
|
+
*
|
|
5
|
+
* The downscale happens inside the CODEC, not here — sharp does it in native
|
|
6
|
+
* code, canvas in `drawImage` — so no Float32Array is ever allocated at source
|
|
7
|
+
* resolution. At 3000px long edge a mask is ~9 MB as Uint8 and a distance
|
|
8
|
+
* transform ~36 MB as Float32, with several live at once; that fits a 2 GiB
|
|
9
|
+
* Function with room. The `max` tier deliberately exceeds it and pays for that
|
|
10
|
+
* by tiling the ridge pass instead (see trace/tiling).
|
|
11
|
+
*/
|
|
12
|
+
export declare const WORKING_LONG_EDGE = 3000;
|
|
13
|
+
/** The review image. Must stay ≤1 MB — the UI loads it on every sheet open. */
|
|
14
|
+
export declare const PREVIEW_LONG_EDGE = 2000;
|
|
15
|
+
/** Per-part review thumbnails, packed into ONE sprite atlas rather than N objects. */
|
|
16
|
+
export declare const THUMB_LONG_EDGE = 220;
|
|
17
|
+
/**
|
|
18
|
+
* Upload ceiling. Deliberately its own constant rather than the shared
|
|
19
|
+
* MAX_IMAGE_BYTES (10 MB), which is sized for product photography and must not
|
|
20
|
+
* be raised — a 4948x6955 scan is legitimately 80 MB.
|
|
21
|
+
*/
|
|
22
|
+
export declare const STICKER_SHEET_MAX_BYTES: number;
|
|
23
|
+
/**
|
|
24
|
+
* A hard bound, not a tuning knob. A noise-dominated scan whose ridges survive
|
|
25
|
+
* hysteresis produces thousands of components, and without this the failure
|
|
26
|
+
* mode is thousands of Storage writes rather than an error message.
|
|
27
|
+
*/
|
|
28
|
+
export declare const MAX_PARTS_PER_SHEET = 400;
|
|
29
|
+
/**
|
|
30
|
+
* Gap between physical sheets in one scan. Stickers on a sheet sit a few mm
|
|
31
|
+
* apart; separate sheets land centimetres apart, so the threshold has a wide
|
|
32
|
+
* safe margin either side.
|
|
33
|
+
*/
|
|
34
|
+
export declare const SHEET_CLUSTER_GAP_MM = 12;
|
|
35
|
+
/**
|
|
36
|
+
* Cricut's documented minimum reliable detail / line spacing: 0.25 in. A part
|
|
37
|
+
* with an internal neck below this tears instead of cutting.
|
|
38
|
+
*/
|
|
39
|
+
export declare const CRICUT_MIN_FEATURE_MM = 6.35;
|
|
40
|
+
/**
|
|
41
|
+
* Design Space degrades past roughly 50,000 nodes. The exporter re-simplifies
|
|
42
|
+
* to this budget INDEPENDENTLY of the trace tolerance — tying the two together
|
|
43
|
+
* would mean a more precise trace producing a file Design Space cannot open.
|
|
44
|
+
*/
|
|
45
|
+
export declare const CRICUT_NODE_BUDGET = 45000;
|
|
46
|
+
interface TierPreset {
|
|
47
|
+
readonly workingLongEdge: number;
|
|
48
|
+
readonly prefilter: TraceParams["prefilter"];
|
|
49
|
+
readonly prefilterRadius: number;
|
|
50
|
+
readonly simplifyMm: number;
|
|
51
|
+
readonly smoothMm: number;
|
|
52
|
+
readonly subPixelContours: boolean;
|
|
53
|
+
readonly tiled: boolean;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* `draft` exists for the browser's live loop and nothing else — 1200px traces
|
|
57
|
+
* in about a second, which is what makes threshold tuning feel like a slider
|
|
58
|
+
* rather than a job submission.
|
|
59
|
+
*
|
|
60
|
+
* `max` is the only tier that tiles. Its simplify tolerance is fine enough that
|
|
61
|
+
* the Cricut exporter will almost certainly have to re-simplify; that is
|
|
62
|
+
* expected and reported, not a misconfiguration.
|
|
63
|
+
*/
|
|
64
|
+
export declare const TIER_PRESETS: Readonly<Record<PrecisionTier, TierPreset>>;
|
|
65
|
+
/**
|
|
66
|
+
* Defaults measured against the reference corpus, not guessed:
|
|
67
|
+
*
|
|
68
|
+
* - `ridgeHysteresisLow/High` — the cut line reads as a dark-trough/light-ridge
|
|
69
|
+
* doublet at 10-20x scan noise on four sampled scanlines (−40/+27 against ±2
|
|
70
|
+
* on yellow-on-yellow, +22 against ±1 on red-on-red). The low threshold sits
|
|
71
|
+
* just above the worst measured noise floor (±7, a JPEG scan) so a faint but
|
|
72
|
+
* continuous line links, while isolated speckle does not seed.
|
|
73
|
+
* - `quantiseWeight` below 1 on purpose: the colour channel REINFORCES a weak
|
|
74
|
+
* ridge but must not invent a cut where only a colour change exists, or every
|
|
75
|
+
* gradient band inside a sticker becomes an outline.
|
|
76
|
+
* - `bridgeMm` closes white channels narrower than 2x itself. It must sit
|
|
77
|
+
* between the widest intra-sticker band and the narrowest real gap between
|
|
78
|
+
* neighbours; 0.45 was measured on the Driger G sheet.
|
|
79
|
+
*/
|
|
80
|
+
export declare function paramsForTier(tier: PrecisionTier, overrides?: Partial<TraceParams>): TraceParams;
|
|
81
|
+
export {};
|