@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
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: A scan has to exist in the bucket before anything can trace it, and the
|
|
3
|
+
* upload is the one hop where a client supplies a storage path. Getting
|
|
4
|
+
* that hop wrong is not a cosmetic bug — the bucket's own rule is
|
|
5
|
+
* `allow read: if true`, so path containment is enforced here or nowhere.
|
|
6
|
+
* WHAT: Create a sheet, attach its verified scan, resolve an asset to a
|
|
7
|
+
* short-lived signed URL, and measure what it all costs.
|
|
8
|
+
*
|
|
9
|
+
* 🛑 Separate from `actions.ts` on purpose. That file is the RUN lifecycle
|
|
10
|
+
* (start, retry, list) and this one is the SHEET lifecycle; they share nothing
|
|
11
|
+
* but the repositories. One file would also have meant appending imports into
|
|
12
|
+
* the middle of an existing module, which is how an import block stops being
|
|
13
|
+
* readable.
|
|
14
|
+
*
|
|
15
|
+
* 🛑 Plain objects and thrown errors, not an `ActionResult` envelope — same
|
|
16
|
+
* reasoning as `actions.ts`, and Root Cause #98 is what it costs to get wrong.
|
|
17
|
+
*
|
|
18
|
+
* EXPORTS: STICKER_SHEET_MAX_BYTES, STICKER_ASSET_KINDS, StickerAssetKind,
|
|
19
|
+
* createStickerSheet, attachStickerSheetScan, resolveStickerAssetUrl,
|
|
20
|
+
* measureStickerStorage, SheetUsageRow
|
|
21
|
+
*
|
|
22
|
+
* @tag domain:sticker-trace
|
|
23
|
+
* @tag layer:server
|
|
24
|
+
* @tag pattern:none
|
|
25
|
+
* @tag access:server
|
|
26
|
+
* @tag consumers:api/admin/sticker-sheets
|
|
27
|
+
* @tag sideEffects:firestore,storage
|
|
28
|
+
*/
|
|
29
|
+
import { ValidationError } from "../../../../errors/validation-error.js";
|
|
30
|
+
import { stickerSheetsRepository } from "../../../../features/sticker-trace/repository/sticker-sheets.repository.js";
|
|
31
|
+
import { stickerTraceRunsRepository } from "../../../../features/sticker-trace/repository/sticker-trace-runs.repository.js";
|
|
32
|
+
import { finalizeScanUpload, measureSheetBytes, runPrefix, signScanUpload, signedReadUrl, } from "./storage.js";
|
|
33
|
+
/**
|
|
34
|
+
* The storage segment a sheet's own scan lives under.
|
|
35
|
+
*
|
|
36
|
+
* 🛑 The literal `"source"`, in the slot `runPrefix` fills with a run id. A
|
|
37
|
+
* scan is uploaded BEFORE any run exists, so there is no run id to key it on —
|
|
38
|
+
* and filing it under the first run's id would mean deleting that run deletes
|
|
39
|
+
* the scan every later run reads. Run ids carry a `stickerrun-`-shaped prefix
|
|
40
|
+
* and a random suffix, so this cannot collide with one.
|
|
41
|
+
*/
|
|
42
|
+
const SOURCE_SEGMENT = "source";
|
|
43
|
+
/**
|
|
44
|
+
* 100 MB.
|
|
45
|
+
*
|
|
46
|
+
* Measured against the reference corpus rather than picked: `@ShayBlader Scan
|
|
47
|
+
* 18` is 79 MB, the largest of the nine, and it is a legitimate scan rather
|
|
48
|
+
* than an outlier to design against. The cap exists because scans are stored
|
|
49
|
+
* AS UPLOADED — no re-encode, because compression artefacts measured ±7 on the
|
|
50
|
+
* JPEG samples and the halftone scan's cut-line signal is only ~3x noise, so
|
|
51
|
+
* transcoding would attack the exact signal the detector needs.
|
|
52
|
+
*/
|
|
53
|
+
export const STICKER_SHEET_MAX_BYTES = 100 * 1024 * 1024;
|
|
54
|
+
/** Title text is mandatory everywhere in this feature. */
|
|
55
|
+
function requireTitle(raw) {
|
|
56
|
+
const title = (raw ?? "").trim();
|
|
57
|
+
if (title.length === 0) {
|
|
58
|
+
throw new ValidationError("A name is required.", {
|
|
59
|
+
title: "Give this sheet a name you will recognise later.",
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return title.slice(0, 160);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create the sheet row and mint the write URL for its scan, in one call.
|
|
66
|
+
*
|
|
67
|
+
* 🛑 The ROW comes first and the bytes second, which is the opposite of what
|
|
68
|
+
* feels natural. The object path contains the sheet id, so an upload signed
|
|
69
|
+
* before the row exists has nowhere to go — and a bucket object with no
|
|
70
|
+
* document pointing at it is unreachable AND unmeterable: it costs storage
|
|
71
|
+
* forever with nothing in any UI to delete it from. A document whose upload
|
|
72
|
+
* never completes is the harmless direction: `traceStatus` stays `queued`,
|
|
73
|
+
* `sourceScan.bytes` is 0, and the list can say so.
|
|
74
|
+
*
|
|
75
|
+
* 🛑 `widthPx`/`heightPx` are 0 until `attachStickerSheetScan`. appkit cannot
|
|
76
|
+
* probe an image — the codec is injected, which is what Root Cause #24 is
|
|
77
|
+
* about — so the only party that already knows the dimensions is the browser
|
|
78
|
+
* that just decoded it for live tuning. Guessing them here would put two
|
|
79
|
+
* numbers on the document that nothing measured.
|
|
80
|
+
*/
|
|
81
|
+
export async function createStickerSheet(input) {
|
|
82
|
+
const title = requireTitle(input.title);
|
|
83
|
+
const sheet = await stickerSheetsRepository.create({
|
|
84
|
+
title,
|
|
85
|
+
scanType: input.scanType ?? "auto",
|
|
86
|
+
widthPx: 0,
|
|
87
|
+
heightPx: 0,
|
|
88
|
+
sourceScan: { assetPath: "", contentType: input.contentType, bytes: 0 },
|
|
89
|
+
});
|
|
90
|
+
const upload = await signScanUpload({
|
|
91
|
+
sheetId: sheet.id,
|
|
92
|
+
runId: SOURCE_SEGMENT,
|
|
93
|
+
contentType: input.contentType,
|
|
94
|
+
extension: input.extension,
|
|
95
|
+
});
|
|
96
|
+
return { sheetId: sheet.id, upload };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Verify the uploaded bytes and record them on the sheet.
|
|
100
|
+
*
|
|
101
|
+
* 🛑 The caller's `assetPath` is CONTAINED to this sheet's own prefix before
|
|
102
|
+
* anything reads it. Every other field here is merely wrong if wrong; this one
|
|
103
|
+
* is a capability — `readScanBytes` will later fetch whatever it names, and a
|
|
104
|
+
* path naming another sheet would turn this endpoint into a cross-sheet read
|
|
105
|
+
* primitive. `readScanBytes` has its own `SCAN_ROOT` check, which is the second
|
|
106
|
+
* layer, not the first: by the time it runs the path is already on a document.
|
|
107
|
+
*
|
|
108
|
+
* 🛑 `finalizeScanUpload` DELETES the object on a magic-byte mismatch, so a
|
|
109
|
+
* failure leaves nothing behind in the bucket. That is why the mismatch RETURNS
|
|
110
|
+
* rather than throwing: the sheet row survives and the operator re-uploads into
|
|
111
|
+
* it, instead of starting again with a fresh row and orphaning the first.
|
|
112
|
+
*/
|
|
113
|
+
export async function attachStickerSheetScan(input) {
|
|
114
|
+
await stickerSheetsRepository.findByIdOrFail(input.sheetId);
|
|
115
|
+
const expected = `${runPrefix(input.sheetId, SOURCE_SEGMENT)}/`;
|
|
116
|
+
if (!input.assetPath.startsWith(expected)) {
|
|
117
|
+
throw new ValidationError("That upload does not belong to this sheet.", {
|
|
118
|
+
assetPath: "Path is outside this sheet's storage prefix.",
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
const sized = Number.isInteger(input.widthPx) &&
|
|
122
|
+
input.widthPx > 0 &&
|
|
123
|
+
Number.isInteger(input.heightPx) &&
|
|
124
|
+
input.heightPx > 0;
|
|
125
|
+
if (!sized) {
|
|
126
|
+
throw new ValidationError("The scan's pixel dimensions are required.", {
|
|
127
|
+
widthPx: "Decode the image and send its real size.",
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
const result = await finalizeScanUpload(input.assetPath, STICKER_SHEET_MAX_BYTES);
|
|
131
|
+
if (!result.ok)
|
|
132
|
+
return { ok: false, code: result.code, message: result.message };
|
|
133
|
+
const patch = {
|
|
134
|
+
widthPx: input.widthPx,
|
|
135
|
+
heightPx: input.heightPx,
|
|
136
|
+
sourceScan: {
|
|
137
|
+
assetPath: input.assetPath,
|
|
138
|
+
contentType: result.contentType,
|
|
139
|
+
bytes: result.bytes,
|
|
140
|
+
...(input.sha256 ? { sha256: input.sha256 } : {}),
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
if (input.scanType)
|
|
144
|
+
patch.scanType = input.scanType;
|
|
145
|
+
/*
|
|
146
|
+
* dpi is written ONLY when one was supplied. An absent dpi is the documented
|
|
147
|
+
* signal that millimetre output must be WITHHELD (`bboxMm: null`), so
|
|
148
|
+
* defaulting it — to 72, which five of the nine reference scans falsely
|
|
149
|
+
* declare — would manufacture confident mm figures from a number the encoder
|
|
150
|
+
* wrote rather than anything about the scanner. A fabricated millimetre on a
|
|
151
|
+
* cut file is a physical production error, not a cosmetic one.
|
|
152
|
+
*/
|
|
153
|
+
if (input.dpi) {
|
|
154
|
+
patch.dpi = input.dpi;
|
|
155
|
+
patch.dpiSource = input.dpiSource ?? "embedded";
|
|
156
|
+
}
|
|
157
|
+
await stickerSheetsRepository.update(input.sheetId, patch);
|
|
158
|
+
return { ok: true, bytes: result.bytes };
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* The asset kinds a client may ask for.
|
|
162
|
+
*
|
|
163
|
+
* 🛑 A KIND, never a path, and this is the whole security shape of the asset
|
|
164
|
+
* endpoint: the client names WHAT it wants and the server looks the path up on
|
|
165
|
+
* the document. Accepting an `assetPath` instead would make the endpoint a
|
|
166
|
+
* signed-URL mint for any object in the bucket — including another admin's
|
|
167
|
+
* scans and, since the same bucket holds them, `private/digital-content/`.
|
|
168
|
+
* It is also what keeps every `*Path` field off the wire entirely, which is the
|
|
169
|
+
* property `PRIVATE_STICKER_SHEET_FIELDS` declares and
|
|
170
|
+
* audit-public-projection-parity enforces.
|
|
171
|
+
*/
|
|
172
|
+
export const STICKER_ASSET_KINDS = [
|
|
173
|
+
"scan",
|
|
174
|
+
"preview",
|
|
175
|
+
"overlay",
|
|
176
|
+
"geometry",
|
|
177
|
+
"cutSvg",
|
|
178
|
+
"thumbAtlas",
|
|
179
|
+
];
|
|
180
|
+
/**
|
|
181
|
+
* Mint a short-lived read URL for one asset of one sheet or run.
|
|
182
|
+
*
|
|
183
|
+
* `runId` absent means the sheet's currently-accepted artifacts; present means
|
|
184
|
+
* that specific run's, which is what makes two runs comparable side by side —
|
|
185
|
+
* the reason runs keep their own artifacts rather than overwriting the sheet's.
|
|
186
|
+
*
|
|
187
|
+
* Returns `null` for "there is no such asset", which the route maps to a 404.
|
|
188
|
+
* An absent artifact is the normal state of an unfinished or failed run, so it
|
|
189
|
+
* must not read as an error.
|
|
190
|
+
*/
|
|
191
|
+
export async function resolveStickerAssetUrl(input) {
|
|
192
|
+
const sheet = await stickerSheetsRepository.findByIdOrFail(input.sheetId);
|
|
193
|
+
if (input.kind === "scan") {
|
|
194
|
+
return sheet.sourceScan?.assetPath ? signedReadUrl(sheet.sourceScan.assetPath) : null;
|
|
195
|
+
}
|
|
196
|
+
let path;
|
|
197
|
+
if (input.runId) {
|
|
198
|
+
const run = await stickerTraceRunsRepository.findByIdOrFail(input.runId);
|
|
199
|
+
/*
|
|
200
|
+
* The run must belong to THIS sheet. The run id is caller-supplied and the
|
|
201
|
+
* sheet id is in the URL, so this is the only place the pairing can be
|
|
202
|
+
* checked — without it, any run id from any sheet resolves and signs.
|
|
203
|
+
*/
|
|
204
|
+
if (run.sheetId !== input.sheetId)
|
|
205
|
+
return null;
|
|
206
|
+
const a = run.artifacts ?? {};
|
|
207
|
+
path =
|
|
208
|
+
input.kind === "preview"
|
|
209
|
+
? a.previewPath
|
|
210
|
+
: input.kind === "overlay"
|
|
211
|
+
? a.overlayPath
|
|
212
|
+
: input.kind === "geometry"
|
|
213
|
+
? a.geometryPath
|
|
214
|
+
: input.kind === "cutSvg"
|
|
215
|
+
? a.cutSvgPath
|
|
216
|
+
: a.thumbAtlasPath;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
const a = sheet.artifacts ?? {};
|
|
220
|
+
/*
|
|
221
|
+
* A sheet has no `thumbAtlasPath` — the atlas is a REVIEW artifact, which
|
|
222
|
+
* only a run produces. Falling through to undefined is correct, and is why
|
|
223
|
+
* this is not the same lookup as the run branch above.
|
|
224
|
+
*/
|
|
225
|
+
path =
|
|
226
|
+
input.kind === "preview"
|
|
227
|
+
? a.previewPath
|
|
228
|
+
: input.kind === "overlay"
|
|
229
|
+
? a.overlayPath
|
|
230
|
+
: input.kind === "geometry"
|
|
231
|
+
? a.geometryPath
|
|
232
|
+
: input.kind === "cutSvg"
|
|
233
|
+
? a.cutSvgPath
|
|
234
|
+
: undefined;
|
|
235
|
+
}
|
|
236
|
+
if (!path)
|
|
237
|
+
return null;
|
|
238
|
+
/*
|
|
239
|
+
* The cut SVG is forced to `attachment`. SVG is deliberately excluded from
|
|
240
|
+
* `ALLOWED_IMAGE_MIMES` as an XSS surface, and a signed GCS URL is still our
|
|
241
|
+
* origin's data — the canvas draws cut lines from `geometry.json`, never by
|
|
242
|
+
* rendering the SVG.
|
|
243
|
+
*/
|
|
244
|
+
return signedReadUrl(path, input.kind === "cutSvg" ? { downloadAs: "cut.svg" } : undefined);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Stored bytes and object count per sheet, biggest first.
|
|
248
|
+
*
|
|
249
|
+
* 🛑 Object COUNT is reported beside bytes because GCS meters them separately
|
|
250
|
+
* (Class A writes, Class B reads). The sprite-atlas decision exists precisely
|
|
251
|
+
* because sixty thumbnails per run would spend that budget sixty times faster
|
|
252
|
+
* than the same pixels in one object — a meter showing only bytes would make
|
|
253
|
+
* undoing that look free.
|
|
254
|
+
*
|
|
255
|
+
* 🛑 Retention is manual by design: nothing auto-prunes, so any past run's
|
|
256
|
+
* overlay can still be opened and compared. That is only a safe default if the
|
|
257
|
+
* cost is VISIBLE rather than discovered, which is what this is for — Root
|
|
258
|
+
* Cause #104's first signal was a billing page.
|
|
259
|
+
*
|
|
260
|
+
* 🛑 One bucket listing per sheet, so this is deliberately NOT folded into the
|
|
261
|
+
* sheet list. Twenty sheets would be twenty `getFiles` calls on every page
|
|
262
|
+
* view; it is its own endpoint an operator opens.
|
|
263
|
+
*/
|
|
264
|
+
export async function measureStickerStorage(sheetIds) {
|
|
265
|
+
const measured = await Promise.all(sheetIds.map(async (id) => {
|
|
266
|
+
const sheet = await stickerSheetsRepository.findById(id);
|
|
267
|
+
if (!sheet)
|
|
268
|
+
return null;
|
|
269
|
+
const { bytes, objects } = await measureSheetBytes(id);
|
|
270
|
+
return { sheetId: id, title: sheet.title, bytes, objects };
|
|
271
|
+
}));
|
|
272
|
+
const rows = measured.filter((r) => r !== null);
|
|
273
|
+
rows.sort((a, b) => b.bytes - a.bytes);
|
|
274
|
+
return {
|
|
275
|
+
rows,
|
|
276
|
+
totalBytes: rows.reduce((n, r) => n + r.bytes, 0),
|
|
277
|
+
totalObjects: rows.reduce((n, r) => n + r.objects, 0),
|
|
278
|
+
};
|
|
279
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { CutPath, Rect } from "../../../shared/features/sticker-trace/types";
|
|
2
|
+
/** Nothing under here is reachable without a signed URL minted by this module. */
|
|
3
|
+
export declare const SCAN_ROOT = "private/sticker-sheets";
|
|
4
|
+
export declare function runPrefix(sheetId: string, runId: string): string;
|
|
5
|
+
export interface SignedUpload {
|
|
6
|
+
/** PUT here with the exact `contentType`, or the signature will not match. */
|
|
7
|
+
uploadUrl: string;
|
|
8
|
+
/** Hand back to `finalizeScanUpload`. Never returned to a client afterwards. */
|
|
9
|
+
assetPath: string;
|
|
10
|
+
expiresAt: Date;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Mint a one-object write URL for a scan.
|
|
14
|
+
*
|
|
15
|
+
* 🛑 `contentType` is BOUND INTO THE SIGNATURE. A client that PUTs different
|
|
16
|
+
* bytes than it declared gets a 403 from GCS rather than a stored lie — which
|
|
17
|
+
* is the cheap half of the guarantee. The expensive half is `finalizeScanUpload`
|
|
18
|
+
* below, because a matching header still proves nothing about the content.
|
|
19
|
+
*/
|
|
20
|
+
export declare function signScanUpload(input: {
|
|
21
|
+
sheetId: string;
|
|
22
|
+
runId: string;
|
|
23
|
+
contentType: string;
|
|
24
|
+
extension: string;
|
|
25
|
+
}): Promise<SignedUpload>;
|
|
26
|
+
export type FinalizeResult = {
|
|
27
|
+
ok: true;
|
|
28
|
+
contentType: string;
|
|
29
|
+
bytes: number;
|
|
30
|
+
} | {
|
|
31
|
+
ok: false;
|
|
32
|
+
code: "MISSING" | "MIME_MISMATCH" | "TOO_LARGE";
|
|
33
|
+
message: string;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Prove the uploaded object is the image it claims to be.
|
|
37
|
+
*
|
|
38
|
+
* 🛑 The DECLARED type is not evidence, and a mismatch DELETES the object.
|
|
39
|
+
* Leaving it would mean an arbitrary file sitting in our bucket at a path our
|
|
40
|
+
* own code will later hand a signed URL for. The same magic-byte discipline as
|
|
41
|
+
* `/api/media/finalize`, which emits a structured 422 for exactly this.
|
|
42
|
+
*
|
|
43
|
+
* Reads only the first 4 KB — magic bytes live in the first few, and
|
|
44
|
+
* downloading a 79 MB scan into a Vercel function to inspect its header would
|
|
45
|
+
* be the egress mistake this module exists to prevent.
|
|
46
|
+
*/
|
|
47
|
+
export declare function finalizeScanUpload(assetPath: string, maxBytes: number): Promise<FinalizeResult>;
|
|
48
|
+
/**
|
|
49
|
+
* A short-lived read URL for one private object.
|
|
50
|
+
*
|
|
51
|
+
* 🛑 The CALLER is responsible for having authorised the request. This function
|
|
52
|
+
* mints capability and checks nothing — it cannot, because it does not see the
|
|
53
|
+
* session. Every call site must sit behind `createRouteHandler`'s admin gate.
|
|
54
|
+
*
|
|
55
|
+
* SVG is forced to `attachment`: it is deliberately excluded from
|
|
56
|
+
* `ALLOWED_IMAGE_MIMES` as an XSS surface, and a signed GCS URL is still our
|
|
57
|
+
* origin's data. The canvas draws cut lines from `geometry.json`, never by
|
|
58
|
+
* rendering the SVG.
|
|
59
|
+
*/
|
|
60
|
+
export declare function signedReadUrl(assetPath: string, opts?: {
|
|
61
|
+
downloadAs?: string;
|
|
62
|
+
}): Promise<{
|
|
63
|
+
url: string;
|
|
64
|
+
expiresAt: Date;
|
|
65
|
+
}>;
|
|
66
|
+
/** Save an artifact the tracer produced. Server-side only — never a client upload. */
|
|
67
|
+
export declare function writeRunArtifact(input: {
|
|
68
|
+
sheetId: string;
|
|
69
|
+
runId: string;
|
|
70
|
+
name: string;
|
|
71
|
+
contentType: string;
|
|
72
|
+
body: Buffer | Uint8Array;
|
|
73
|
+
}): Promise<{
|
|
74
|
+
assetPath: string;
|
|
75
|
+
bytes: number;
|
|
76
|
+
}>;
|
|
77
|
+
/**
|
|
78
|
+
* Delete everything one run wrote.
|
|
79
|
+
*
|
|
80
|
+
* `deleteFiles` pages internally, so this is safe on a `max`-tier run that
|
|
81
|
+
* produced sixty parts plus exports — unlike a hand-batched delete, which is
|
|
82
|
+
* the shape that died with `Transaction too big` on `categories`.
|
|
83
|
+
*/
|
|
84
|
+
export declare function deleteRunTree(sheetId: string, runId: string): Promise<void>;
|
|
85
|
+
/** Delete a whole sheet: the scan, and every run under it. */
|
|
86
|
+
export declare function deleteSheetTree(sheetId: string): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Total stored bytes and object count under one sheet, for the usage meter.
|
|
89
|
+
*
|
|
90
|
+
* 🛑 A quota only discoverable in the GCP console is a quota nobody watches —
|
|
91
|
+
* the same failure as Root Cause #104, where the first signal was a billing
|
|
92
|
+
* page. This is what makes "keep every run" a safe default rather than a
|
|
93
|
+
* deferred surprise.
|
|
94
|
+
*/
|
|
95
|
+
export declare function measureSheetBytes(sheetId: string): Promise<{
|
|
96
|
+
bytes: number;
|
|
97
|
+
objects: number;
|
|
98
|
+
}>;
|
|
99
|
+
/**
|
|
100
|
+
* Download a stored object's bytes.
|
|
101
|
+
*
|
|
102
|
+
* 🛑 Takes a RAW assetPath, which is only ever a value this module produced —
|
|
103
|
+
* `sourceScan.assetPath` or a `runPrefix`-derived artifact path. It must never
|
|
104
|
+
* be fed a client-supplied string: the bucket's storage rule is
|
|
105
|
+
* `allow read: if true`, so path containment is enforced here or nowhere.
|
|
106
|
+
*/
|
|
107
|
+
export declare function readScanBytes(assetPath: string): Promise<Uint8Array>;
|
|
108
|
+
/**
|
|
109
|
+
* The shape the coordinator writes and the shards read back.
|
|
110
|
+
*
|
|
111
|
+
* 🛑 `path` is declared because the coordinator ALREADY writes it — the first
|
|
112
|
+
* version of this interface omitted it, which made the shard's rasterise
|
|
113
|
+
* dependency take an `ordinal` it could not turn into a mask, and the only way
|
|
114
|
+
* to implement that honestly was a second geometry read per part inside a
|
|
115
|
+
* sixty-iteration loop. The field was always in the JSON; the type just did
|
|
116
|
+
* not say so.
|
|
117
|
+
*/
|
|
118
|
+
export interface RunGeometry {
|
|
119
|
+
workingSize: Rect;
|
|
120
|
+
parts: {
|
|
121
|
+
ordinal: number;
|
|
122
|
+
bbox: Rect;
|
|
123
|
+
path: CutPath;
|
|
124
|
+
}[];
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Read and parse a run's `geometry.json`.
|
|
128
|
+
*
|
|
129
|
+
* 🛑 Parsed HERE rather than in the shard, so the one place that knows the
|
|
130
|
+
* artifact's name also owns its shape. A shard assembling the path itself
|
|
131
|
+
* would be a second definition of the layout — and the `parts` array is what
|
|
132
|
+
* every shard slices, so a disagreement renders the wrong crops rather than
|
|
133
|
+
* failing.
|
|
134
|
+
*/
|
|
135
|
+
export declare function readRunGeometry(runId: string, sheetId: string): Promise<RunGeometry>;
|