@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
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* Server-only โ all repository instances use firebase-admin.
|
|
6
6
|
*/
|
|
7
7
|
export { BaseRepository } from "../providers/db-firebase";
|
|
8
|
-
export { unitOfWork } from "../core";
|
|
9
|
-
export type { UnitOfWork } from "../core";
|
|
8
|
+
export { unitOfWork } from "../core/unit-of-work";
|
|
9
|
+
export type { UnitOfWork } from "../core/unit-of-work";
|
|
10
10
|
export { UserRepository, userRepository, EmailVerificationTokenRepository, PasswordResetTokenRepository, emailVerificationTokenRepository, passwordResetTokenRepository, tokenRepository, SessionRepository, sessionRepository, } from "../features/auth/repository";
|
|
11
11
|
export { SmsCounterRepository, smsCounterRepository, } from "../features/auth/repository/sms-counter.repository";
|
|
12
12
|
export { AddressesRepository, addressesRepository, } from "../features/addresses";
|
|
@@ -7,7 +7,12 @@
|
|
|
7
7
|
// Shared repository foundations
|
|
8
8
|
export { BaseRepository } from "../providers/db-firebase/index.js";
|
|
9
9
|
// Unit of Work - atomic multi-collection operations
|
|
10
|
-
|
|
10
|
+
/*
|
|
11
|
+
* Deep, not `../core`: that barrel pulls in every core module, several of which
|
|
12
|
+
* import repositories back out of this file. One barrel re-exporting another
|
|
13
|
+
* barrel is how component 2's cycle stayed closed.
|
|
14
|
+
*/
|
|
15
|
+
export { unitOfWork } from "../core/unit-of-work.js";
|
|
11
16
|
// Core repositories
|
|
12
17
|
export { UserRepository, userRepository, EmailVerificationTokenRepository, PasswordResetTokenRepository, emailVerificationTokenRepository, passwordResetTokenRepository, tokenRepository, SessionRepository, sessionRepository, } from "../features/auth/repository/index.js";
|
|
13
18
|
export { SmsCounterRepository, smsCounterRepository, } from "../features/auth/repository/sms-counter.repository.js";
|
|
@@ -502,15 +502,15 @@ export declare const SCHEMAS: {
|
|
|
502
502
|
}, "strip", import("zod").ZodTypeAny, {
|
|
503
503
|
title?: string | undefined;
|
|
504
504
|
description?: string | undefined;
|
|
505
|
-
textAlign?: "center" | "left" | "right" | undefined;
|
|
506
505
|
textColor?: string | undefined;
|
|
506
|
+
textAlign?: "center" | "left" | "right" | undefined;
|
|
507
507
|
subtitle?: string | undefined;
|
|
508
508
|
eyebrow?: string | undefined;
|
|
509
509
|
}, {
|
|
510
510
|
title?: string | undefined;
|
|
511
511
|
description?: string | undefined;
|
|
512
|
-
textAlign?: "center" | "left" | "right" | undefined;
|
|
513
512
|
textColor?: string | undefined;
|
|
513
|
+
textAlign?: "center" | "left" | "right" | undefined;
|
|
514
514
|
subtitle?: string | undefined;
|
|
515
515
|
eyebrow?: string | undefined;
|
|
516
516
|
}>>;
|
|
@@ -569,8 +569,8 @@ export declare const SCHEMAS: {
|
|
|
569
569
|
content?: {
|
|
570
570
|
title?: string | undefined;
|
|
571
571
|
description?: string | undefined;
|
|
572
|
-
textAlign?: "center" | "left" | "right" | undefined;
|
|
573
572
|
textColor?: string | undefined;
|
|
573
|
+
textAlign?: "center" | "left" | "right" | undefined;
|
|
574
574
|
subtitle?: string | undefined;
|
|
575
575
|
eyebrow?: string | undefined;
|
|
576
576
|
} | undefined;
|
|
@@ -610,8 +610,8 @@ export declare const SCHEMAS: {
|
|
|
610
610
|
content?: {
|
|
611
611
|
title?: string | undefined;
|
|
612
612
|
description?: string | undefined;
|
|
613
|
-
textAlign?: "center" | "left" | "right" | undefined;
|
|
614
613
|
textColor?: string | undefined;
|
|
614
|
+
textAlign?: "center" | "left" | "right" | undefined;
|
|
615
615
|
subtitle?: string | undefined;
|
|
616
616
|
eyebrow?: string | undefined;
|
|
617
617
|
} | undefined;
|
|
@@ -749,8 +749,8 @@ export declare const SCHEMAS: {
|
|
|
749
749
|
content?: {
|
|
750
750
|
title?: string | undefined;
|
|
751
751
|
description?: string | undefined;
|
|
752
|
-
textAlign?: "center" | "left" | "right" | undefined;
|
|
753
752
|
textColor?: string | undefined;
|
|
753
|
+
textAlign?: "center" | "left" | "right" | undefined;
|
|
754
754
|
subtitle?: string | undefined;
|
|
755
755
|
eyebrow?: string | undefined;
|
|
756
756
|
} | undefined;
|
|
@@ -858,8 +858,8 @@ export declare const SCHEMAS: {
|
|
|
858
858
|
content?: {
|
|
859
859
|
title?: string | undefined;
|
|
860
860
|
description?: string | undefined;
|
|
861
|
-
textAlign?: "center" | "left" | "right" | undefined;
|
|
862
861
|
textColor?: string | undefined;
|
|
862
|
+
textAlign?: "center" | "left" | "right" | undefined;
|
|
863
863
|
subtitle?: string | undefined;
|
|
864
864
|
eyebrow?: string | undefined;
|
|
865
865
|
} | undefined;
|
|
@@ -2796,10 +2796,10 @@ export declare const SCHEMAS: {
|
|
|
2796
2796
|
toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
|
|
2797
2797
|
}, import("zod").ZodTypeAny, "passthrough">;
|
|
2798
2798
|
transactionId?: string | undefined;
|
|
2799
|
+
proofUrl?: string | undefined;
|
|
2799
2800
|
paidAt?: string | Date | import("zod").objectOutputType<{
|
|
2800
2801
|
toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
|
|
2801
2802
|
}, import("zod").ZodTypeAny, "passthrough"> | undefined;
|
|
2802
|
-
proofUrl?: string | undefined;
|
|
2803
2803
|
reminderSentAt?: string | Date | import("zod").objectOutputType<{
|
|
2804
2804
|
toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
|
|
2805
2805
|
}, import("zod").ZodTypeAny, "passthrough"> | undefined;
|
|
@@ -2811,10 +2811,10 @@ export declare const SCHEMAS: {
|
|
|
2811
2811
|
toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
|
|
2812
2812
|
}, import("zod").ZodTypeAny, "passthrough">;
|
|
2813
2813
|
transactionId?: string | undefined;
|
|
2814
|
+
proofUrl?: string | undefined;
|
|
2814
2815
|
paidAt?: string | Date | import("zod").objectInputType<{
|
|
2815
2816
|
toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
|
|
2816
2817
|
}, import("zod").ZodTypeAny, "passthrough"> | undefined;
|
|
2817
|
-
proofUrl?: string | undefined;
|
|
2818
2818
|
reminderSentAt?: string | Date | import("zod").objectInputType<{
|
|
2819
2819
|
toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
|
|
2820
2820
|
}, import("zod").ZodTypeAny, "passthrough"> | undefined;
|
|
@@ -3056,10 +3056,10 @@ export declare const SCHEMAS: {
|
|
|
3056
3056
|
toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
|
|
3057
3057
|
}, import("zod").ZodTypeAny, "passthrough">;
|
|
3058
3058
|
transactionId?: string | undefined;
|
|
3059
|
+
proofUrl?: string | undefined;
|
|
3059
3060
|
paidAt?: string | Date | import("zod").objectOutputType<{
|
|
3060
3061
|
toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
|
|
3061
3062
|
}, import("zod").ZodTypeAny, "passthrough"> | undefined;
|
|
3062
|
-
proofUrl?: string | undefined;
|
|
3063
3063
|
reminderSentAt?: string | Date | import("zod").objectOutputType<{
|
|
3064
3064
|
toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
|
|
3065
3065
|
}, import("zod").ZodTypeAny, "passthrough"> | undefined;
|
|
@@ -3204,10 +3204,10 @@ export declare const SCHEMAS: {
|
|
|
3204
3204
|
toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
|
|
3205
3205
|
}, import("zod").ZodTypeAny, "passthrough">;
|
|
3206
3206
|
transactionId?: string | undefined;
|
|
3207
|
+
proofUrl?: string | undefined;
|
|
3207
3208
|
paidAt?: string | Date | import("zod").objectInputType<{
|
|
3208
3209
|
toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
|
|
3209
3210
|
}, import("zod").ZodTypeAny, "passthrough"> | undefined;
|
|
3210
|
-
proofUrl?: string | undefined;
|
|
3211
3211
|
reminderSentAt?: string | Date | import("zod").objectInputType<{
|
|
3212
3212
|
toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
|
|
3213
3213
|
}, import("zod").ZodTypeAny, "passthrough"> | undefined;
|
|
@@ -4616,14 +4616,7 @@ export declare const SCHEMAS: {
|
|
|
4616
4616
|
internalNotes?: string | undefined;
|
|
4617
4617
|
}>;
|
|
4618
4618
|
};
|
|
4619
|
-
readonly api: {
|
|
4620
|
-
readonly "POST /api/wishlist": import("./types").ApiRouteSchema<import("zod").ZodTypeAny, import("zod").ZodTypeAny, import("zod").ZodTypeAny, import("zod").ZodTypeAny>;
|
|
4621
|
-
readonly "POST /api/auth/session": import("./types").ApiRouteSchema<import("zod").ZodTypeAny, import("zod").ZodTypeAny, import("zod").ZodTypeAny, import("zod").ZodTypeAny>;
|
|
4622
|
-
readonly "POST /api/admin/products/[id]/group": import("./types").ApiRouteSchema<import("zod").ZodTypeAny, import("zod").ZodTypeAny, import("zod").ZodTypeAny, import("zod").ZodTypeAny>;
|
|
4623
|
-
readonly "POST /api/media/sign": import("./types").ApiRouteSchema<import("zod").ZodTypeAny, import("zod").ZodTypeAny, import("zod").ZodTypeAny, import("zod").ZodTypeAny>;
|
|
4624
|
-
readonly "POST /api/media/finalize": import("./types").ApiRouteSchema<import("zod").ZodTypeAny, import("zod").ZodTypeAny, import("zod").ZodTypeAny, import("zod").ZodTypeAny>;
|
|
4625
|
-
readonly "GET /api/search/suggestions": import("./types").ApiRouteSchema<import("zod").ZodTypeAny, import("zod").ZodTypeAny, import("zod").ZodTypeAny, import("zod").ZodTypeAny>;
|
|
4626
|
-
};
|
|
4619
|
+
readonly api: {};
|
|
4627
4620
|
readonly forms: {
|
|
4628
4621
|
readonly product: import("zod").ZodObject<{
|
|
4629
4622
|
title: import("zod").ZodOptional<import("zod").ZodString>;
|
|
@@ -6354,8 +6347,8 @@ export declare const SCHEMAS: {
|
|
|
6354
6347
|
kind: import("zod").ZodOptional<import("zod").ZodString>;
|
|
6355
6348
|
}, "strip", import("zod").ZodTypeAny, {
|
|
6356
6349
|
refreshToken: string;
|
|
6357
|
-
idToken: string;
|
|
6358
6350
|
localId: string;
|
|
6351
|
+
idToken: string;
|
|
6359
6352
|
expiresIn: string;
|
|
6360
6353
|
email?: string | undefined;
|
|
6361
6354
|
kind?: string | undefined;
|
|
@@ -6372,8 +6365,8 @@ export declare const SCHEMAS: {
|
|
|
6372
6365
|
rawUserInfo?: string | undefined;
|
|
6373
6366
|
}, {
|
|
6374
6367
|
refreshToken: string;
|
|
6375
|
-
idToken: string;
|
|
6376
6368
|
localId: string;
|
|
6369
|
+
idToken: string;
|
|
6377
6370
|
expiresIn: string;
|
|
6378
6371
|
email?: string | undefined;
|
|
6379
6372
|
kind?: string | undefined;
|
package/dist/schemas/registry.js
CHANGED
|
@@ -75,20 +75,37 @@ const firestore = {
|
|
|
75
75
|
// those are touched in W5/W7.
|
|
76
76
|
};
|
|
77
77
|
// ---------------------------------------------------------------------------
|
|
78
|
-
// API route schemas โ
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
78
|
+
// API route schemas โ see the `api` bucket below.
|
|
79
|
+
/*
|
|
80
|
+
* ๐ EMPTY, deliberately, as of 2026-10-17 โ and `audit-route-schema-registry`
|
|
81
|
+
* is retired with it.
|
|
82
|
+
*
|
|
83
|
+
* This bucket is an ADDRESSING convenience: it lets a route write
|
|
84
|
+
* `schema: "POST /api/wishlist"` instead of importing the schema. Measured
|
|
85
|
+
* before emptying it: 6 keys registered, **0 routes passing a key string**,
|
|
86
|
+
* and 170 route files passing a schema identifier directly. So nothing has
|
|
87
|
+
* ever read it by key.
|
|
88
|
+
*
|
|
89
|
+
* The audit that policed it reported "576 of 582 routes await registration",
|
|
90
|
+
* which reads as a migration backlog and is not one. Its own header said so:
|
|
91
|
+
* *"not a migration backlog winding down, it is a registry almost nothing
|
|
92
|
+
* uses"*. And the codebase had already chosen the other convention โ when
|
|
93
|
+
* `postApiWishlist` was found declared here while `/api/wishlist` read its
|
|
94
|
+
* body raw, the fix was to re-export the schema for DIRECT use at the route,
|
|
95
|
+
* not to adopt the key form.
|
|
96
|
+
*
|
|
97
|
+
* The safety property โ a handler that reads a body must validate it โ is
|
|
98
|
+
* owned by `audit-unvalidated-request-body`, which is strict-zero and at 0.
|
|
99
|
+
* Widening THAT rule to see `export async function POST` (it had only matched
|
|
100
|
+
* `export const POST`) found two genuinely unvalidated bodies on the session
|
|
101
|
+
* endpoints. That is what 576 registry keys would not have found.
|
|
102
|
+
*
|
|
103
|
+
* The bucket stays declared because `audit-schema-registry-completeness`
|
|
104
|
+
* requires every bucket to exist, and because the registry's own doctrine is
|
|
105
|
+
* that an empty bucket is honest while a bucket of placeholders "reads as
|
|
106
|
+
* migrated to everyone who comes after".
|
|
107
|
+
*/
|
|
108
|
+
const api = {};
|
|
92
109
|
// ---------------------------------------------------------------------------
|
|
93
110
|
// Form schemas โ keyed by form id (matches FormShell/QuickFormDrawer `formId`).
|
|
94
111
|
// `audit-form-schema` already enforces presence at FormShell sites; this
|
|
@@ -19,8 +19,8 @@ export declare const googleSignInWithIdpResponseSchema: z.ZodObject<{
|
|
|
19
19
|
kind: z.ZodOptional<z.ZodString>;
|
|
20
20
|
}, "strip", z.ZodTypeAny, {
|
|
21
21
|
refreshToken: string;
|
|
22
|
-
idToken: string;
|
|
23
22
|
localId: string;
|
|
23
|
+
idToken: string;
|
|
24
24
|
expiresIn: string;
|
|
25
25
|
email?: string | undefined;
|
|
26
26
|
kind?: string | undefined;
|
|
@@ -37,8 +37,8 @@ export declare const googleSignInWithIdpResponseSchema: z.ZodObject<{
|
|
|
37
37
|
rawUserInfo?: string | undefined;
|
|
38
38
|
}, {
|
|
39
39
|
refreshToken: string;
|
|
40
|
-
idToken: string;
|
|
41
40
|
localId: string;
|
|
41
|
+
idToken: string;
|
|
42
42
|
expiresIn: string;
|
|
43
43
|
email?: string | undefined;
|
|
44
44
|
kind?: string | undefined;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Encrypted<T>` โ the FORCING FUNCTION for ciphertext-by-default.
|
|
3
|
+
*
|
|
4
|
+
* ## The problem this exists to solve
|
|
5
|
+
*
|
|
6
|
+
* `audit-pii-coverage`'s R3 stages fourteen repositories whose `mapDoc`
|
|
7
|
+
* decrypts PII on EVERY read. The prescription โ copy `SiteSettingsRepository`:
|
|
8
|
+
* leave `mapDoc` alone and expose plaintext through a NAMED getter with a
|
|
9
|
+
* masked variant โ is right, and the migration had been staged for one reason:
|
|
10
|
+
*
|
|
11
|
+
* **`tsc` cannot find the call sites.**
|
|
12
|
+
*
|
|
13
|
+
* Measured 2026-10-17: 147 distinct files touch a staged repository. And
|
|
14
|
+
* `PayoutDocument.sellerEmail` is declared `string` whether the value in it is
|
|
15
|
+
* ciphertext or plaintext, so a call site that gets the wrong one COMPILES. It
|
|
16
|
+
* then either renders `enc:v1:โฆ` to an admin or publishes a decrypted email.
|
|
17
|
+
* There is no compile error, no runtime error, and nothing to grep for.
|
|
18
|
+
*
|
|
19
|
+
* Compare the `perPage` โ `pageSize` rename done the same day: renaming one
|
|
20
|
+
* interface member turned all 65 consumers into compile errors and `tsc`
|
|
21
|
+
* handed over the list. That is the difference between a safe sweep and a
|
|
22
|
+
* 147-file guess, and it is purely a property of the TYPE.
|
|
23
|
+
*
|
|
24
|
+
* ## How it works
|
|
25
|
+
*
|
|
26
|
+
* A branded string. `Encrypted<string>` is assignable FROM nothing but itself,
|
|
27
|
+
* so every reader that wants a plain `string` must go through one of the two
|
|
28
|
+
* named accessors below โ and until it does, it is a compile error naming the
|
|
29
|
+
* exact file and line.
|
|
30
|
+
*
|
|
31
|
+
* ```ts
|
|
32
|
+
* // payout.sellerEmail โ Encrypted<string> (what Firestore holds)
|
|
33
|
+
* // plaintext(payout.sellerEmail) โ string (opt-in, named, auditable)
|
|
34
|
+
* // maskedEmail(payout.sellerEmail) โ string (the UI default)
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* The brand is erased at runtime: `Encrypted<string>` IS a string, so nothing
|
|
38
|
+
* changes about what is stored, sent or compared. It exists only to make the
|
|
39
|
+
* compiler ask the question at every site.
|
|
40
|
+
*
|
|
41
|
+
* ## ๐ Branding a field is HALF a change, never a whole one
|
|
42
|
+
*
|
|
43
|
+
* The type must be made true in the same commit, by removing that
|
|
44
|
+
* repository's unconditional `mapDoc` decrypt. Branding a field whose value is
|
|
45
|
+
* still decrypted on read asserts something false, and the first `plaintext()`
|
|
46
|
+
* call would then double-decrypt โ `decryptValue` passes a non-`enc:v1:`
|
|
47
|
+
* string through unchanged, so it would silently "work" and hide the lie.
|
|
48
|
+
*
|
|
49
|
+
* Convert ONE repository per change, smallest consumer count first. `tsc` then
|
|
50
|
+
* enumerates only that repository's readers, which is the whole point: a
|
|
51
|
+
* reviewable list per step instead of 147 at once.
|
|
52
|
+
*/
|
|
53
|
+
declare const ENCRYPTED_BRAND: unique symbol;
|
|
54
|
+
/**
|
|
55
|
+
* A string that is CIPHERTEXT as it sits in Firestore.
|
|
56
|
+
*
|
|
57
|
+
* Erased at runtime โ the VALUE is a string, so nothing changes about what is
|
|
58
|
+
* stored, sent or compared. The TYPE is not a string, and that is the point.
|
|
59
|
+
*
|
|
60
|
+
* ## ๐ This was `T & { brand }`, and that version caught NO readers at all
|
|
61
|
+
*
|
|
62
|
+
* An intersection is a SUBTYPE of `string`, so `Encrypted<string>` was
|
|
63
|
+
* assignable to anything accepting a `string`. Measured directly: the write
|
|
64
|
+
* direction errored, while `maskName(cipher)`, `` `${cipher}` `` and
|
|
65
|
+
* `const s: string = cipher` all compiled in silence.
|
|
66
|
+
*
|
|
67
|
+
* So the fourteen-repository sweep enumerated every WRITE and not one READ โ
|
|
68
|
+
* and this file's own docstring asserted the opposite, which is why the gap
|
|
69
|
+
* went unnoticed until `/reviews/[id]` was found rendering "Anonymous" for
|
|
70
|
+
* every reviewer (`findById` returned ciphertext, an `as Review` cast erased
|
|
71
|
+
* the brand, and `maskName` refuses ciphertext by design). Nine
|
|
72
|
+
* cross-repository writes were meanwhile double-encrypting PII, including the
|
|
73
|
+
* `upiId` two scheduled jobs send money to.
|
|
74
|
+
*
|
|
75
|
+
* A nominal shape is assignable to nothing that wants a `string`, so every
|
|
76
|
+
* reader becomes a compile error naming its file and line. That is the
|
|
77
|
+
* enumeration the intersection form could never produce.
|
|
78
|
+
*
|
|
79
|
+
* `__plain` is phantom โ never read, never written, optional so no value has to
|
|
80
|
+
* carry it. It keeps `Encrypted<"a">` and `Encrypted<"b">` distinct rather than
|
|
81
|
+
* collapsing both to one opaque brand.
|
|
82
|
+
*/
|
|
83
|
+
export type Encrypted<T extends string = string> = {
|
|
84
|
+
readonly [ENCRYPTED_BRAND]: "pii";
|
|
85
|
+
readonly __plain?: T;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* A document type with its `Encrypted<string>` members as plain `string`.
|
|
89
|
+
*
|
|
90
|
+
* ONE definition of "the plaintext shape", so each feature's `<Doc>Plain`
|
|
91
|
+
* alias and `BaseRepository`'s write signature agree by construction. Thirteen
|
|
92
|
+
* hand-rolled copies of this mapped type is thirteen chances to get the
|
|
93
|
+
* `undefined` handling subtly different, and the difference only shows up as a
|
|
94
|
+
* cast somebody adds to make one call site compile (Root Cause #75).
|
|
95
|
+
*
|
|
96
|
+
* `Extract<T[K], undefined>` preserves optionality: a field declared
|
|
97
|
+
* `Encrypted<string> | undefined` stays `string | undefined`, rather than
|
|
98
|
+
* becoming required.
|
|
99
|
+
*/
|
|
100
|
+
export type Plaintext<T> = {
|
|
101
|
+
[K in keyof T]: T[K] extends Encrypted<string> | null | undefined ? Extract<T[K], null | undefined> | string : Exclude<T[K], null | undefined> extends Date | ReadonlyArray<unknown> | ((...args: never[]) => unknown) ? T[K] : T[K] extends Date | ReadonlyArray<unknown> | ((...args: never[]) => unknown) ? T[K] : T[K] extends object | undefined ? Extract<T[K], undefined> | Plaintext<Exclude<T[K], undefined>> : T[K];
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Mark a value as ciphertext. For a repository's own read path, where the value
|
|
105
|
+
* genuinely came out of Firestore encrypted.
|
|
106
|
+
*
|
|
107
|
+
* ๐ Not for widening a plaintext value to satisfy a type. If a caller has
|
|
108
|
+
* plaintext and the field wants `Encrypted`, the value needs ENCRYPTING, not
|
|
109
|
+
* re-labelling โ `encryptPii` is the function for that.
|
|
110
|
+
*/
|
|
111
|
+
export declare const asEncrypted: <T extends string>(value: T) => Encrypted<T>;
|
|
112
|
+
/**
|
|
113
|
+
* Narrow a possibly-undefined ciphertext field. Saves every call site writing
|
|
114
|
+
* the same `value === undefined ? undefined : โฆ` dance.
|
|
115
|
+
*/
|
|
116
|
+
export declare const asEncryptedMaybe: <T extends string>(value: T | undefined | null) => Encrypted<T> | undefined;
|
|
117
|
+
export {};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Encrypted<T>` โ the FORCING FUNCTION for ciphertext-by-default.
|
|
3
|
+
*
|
|
4
|
+
* ## The problem this exists to solve
|
|
5
|
+
*
|
|
6
|
+
* `audit-pii-coverage`'s R3 stages fourteen repositories whose `mapDoc`
|
|
7
|
+
* decrypts PII on EVERY read. The prescription โ copy `SiteSettingsRepository`:
|
|
8
|
+
* leave `mapDoc` alone and expose plaintext through a NAMED getter with a
|
|
9
|
+
* masked variant โ is right, and the migration had been staged for one reason:
|
|
10
|
+
*
|
|
11
|
+
* **`tsc` cannot find the call sites.**
|
|
12
|
+
*
|
|
13
|
+
* Measured 2026-10-17: 147 distinct files touch a staged repository. And
|
|
14
|
+
* `PayoutDocument.sellerEmail` is declared `string` whether the value in it is
|
|
15
|
+
* ciphertext or plaintext, so a call site that gets the wrong one COMPILES. It
|
|
16
|
+
* then either renders `enc:v1:โฆ` to an admin or publishes a decrypted email.
|
|
17
|
+
* There is no compile error, no runtime error, and nothing to grep for.
|
|
18
|
+
*
|
|
19
|
+
* Compare the `perPage` โ `pageSize` rename done the same day: renaming one
|
|
20
|
+
* interface member turned all 65 consumers into compile errors and `tsc`
|
|
21
|
+
* handed over the list. That is the difference between a safe sweep and a
|
|
22
|
+
* 147-file guess, and it is purely a property of the TYPE.
|
|
23
|
+
*
|
|
24
|
+
* ## How it works
|
|
25
|
+
*
|
|
26
|
+
* A branded string. `Encrypted<string>` is assignable FROM nothing but itself,
|
|
27
|
+
* so every reader that wants a plain `string` must go through one of the two
|
|
28
|
+
* named accessors below โ and until it does, it is a compile error naming the
|
|
29
|
+
* exact file and line.
|
|
30
|
+
*
|
|
31
|
+
* ```ts
|
|
32
|
+
* // payout.sellerEmail โ Encrypted<string> (what Firestore holds)
|
|
33
|
+
* // plaintext(payout.sellerEmail) โ string (opt-in, named, auditable)
|
|
34
|
+
* // maskedEmail(payout.sellerEmail) โ string (the UI default)
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* The brand is erased at runtime: `Encrypted<string>` IS a string, so nothing
|
|
38
|
+
* changes about what is stored, sent or compared. It exists only to make the
|
|
39
|
+
* compiler ask the question at every site.
|
|
40
|
+
*
|
|
41
|
+
* ## ๐ Branding a field is HALF a change, never a whole one
|
|
42
|
+
*
|
|
43
|
+
* The type must be made true in the same commit, by removing that
|
|
44
|
+
* repository's unconditional `mapDoc` decrypt. Branding a field whose value is
|
|
45
|
+
* still decrypted on read asserts something false, and the first `plaintext()`
|
|
46
|
+
* call would then double-decrypt โ `decryptValue` passes a non-`enc:v1:`
|
|
47
|
+
* string through unchanged, so it would silently "work" and hide the lie.
|
|
48
|
+
*
|
|
49
|
+
* Convert ONE repository per change, smallest consumer count first. `tsc` then
|
|
50
|
+
* enumerates only that repository's readers, which is the whole point: a
|
|
51
|
+
* reviewable list per step instead of 147 at once.
|
|
52
|
+
*/
|
|
53
|
+
/**
|
|
54
|
+
* Mark a value as ciphertext. For a repository's own read path, where the value
|
|
55
|
+
* genuinely came out of Firestore encrypted.
|
|
56
|
+
*
|
|
57
|
+
* ๐ Not for widening a plaintext value to satisfy a type. If a caller has
|
|
58
|
+
* plaintext and the field wants `Encrypted`, the value needs ENCRYPTING, not
|
|
59
|
+
* re-labelling โ `encryptPii` is the function for that.
|
|
60
|
+
*/
|
|
61
|
+
export const asEncrypted = (value) =>
|
|
62
|
+
/*
|
|
63
|
+
* `as unknown as` is REQUIRED here, and only here.
|
|
64
|
+
*
|
|
65
|
+
* With the nominal brand, `Encrypted<T>` is not a string type, so a direct
|
|
66
|
+
* cast is a TS2352 ("neither type sufficiently overlaps"). That error is
|
|
67
|
+
* correct and is the entire point of the nominal shape โ this one function
|
|
68
|
+
* is the sanctioned crossing, which is why the double cast is confined to it
|
|
69
|
+
* rather than appearing at call sites.
|
|
70
|
+
*
|
|
71
|
+
* Its four real callers all pass `""` to BLANK a field on a display-only
|
|
72
|
+
* read, not to relabel a secret.
|
|
73
|
+
*/
|
|
74
|
+
value;
|
|
75
|
+
/**
|
|
76
|
+
* Narrow a possibly-undefined ciphertext field. Saves every call site writing
|
|
77
|
+
* the same `value === undefined ? undefined : โฆ` dance.
|
|
78
|
+
*/
|
|
79
|
+
export const asEncryptedMaybe = (value) => value === undefined || value === null ? undefined : asEncrypted(value);
|
|
80
|
+
/*
|
|
81
|
+
* ๐ There is deliberately NO `plaintext(value)` helper in this module.
|
|
82
|
+
*
|
|
83
|
+
* The first draft had one, and it was a lie of exactly the kind this whole
|
|
84
|
+
* sweep exists to remove: it took an `Encrypted<string>` and returned
|
|
85
|
+
* `string` by casting โ so a function named `plaintext` handed back
|
|
86
|
+
* CIPHERTEXT, and every caller would have rendered `enc:v1:โฆ` while the types
|
|
87
|
+
* said everything was fine. `decryptValue` passes a non-`enc:v1:` string
|
|
88
|
+
* through unchanged, so it would even have "worked" on the rows that were
|
|
89
|
+
* never encrypted, and failed only on the ones that were.
|
|
90
|
+
*
|
|
91
|
+
* Decryption needs the key and `node:crypto`, which belong to the server; this
|
|
92
|
+
* module is types-only so it stays importable from a client bundle (Root Cause
|
|
93
|
+
* #24). So the plaintext path lives where the decryption actually happens:
|
|
94
|
+
*
|
|
95
|
+
* on the REPOSITORY, as a named method, following `SiteSettingsRepository` โ
|
|
96
|
+
* `getDecryptedCredentials()` / `getCredentialsMasked()`.
|
|
97
|
+
*
|
|
98
|
+
* Masked is the default a UI should reach for; plaintext is opt-in and named,
|
|
99
|
+
* so it shows up both in review and in a grep.
|
|
100
|
+
*/
|
package/dist/security/index.d.ts
CHANGED
|
@@ -4,7 +4,10 @@ export type { RateLimitConfig, RateLimitResult } from "./rate-limit";
|
|
|
4
4
|
export { requireAuth, requireRole, requireOwnership, requireEmailVerified, requireActiveAccount, canChangeRole, getRoleLevel, } from "./authorization";
|
|
5
5
|
export type { UserRole } from "./authorization";
|
|
6
6
|
export { redactPii, safeDisplayName, safeDisplayEmail, maskIp } from "./pii-redact";
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
7
|
+
export { asEncrypted, asEncryptedMaybe } from "./encrypted";
|
|
8
|
+
export type { Encrypted } from "./encrypted";
|
|
9
|
+
export { encryptValue, decryptValue, hmacBlindIndex, encryptPiiFields, decryptPiiFields, encryptPii, decryptPii, piiBlindIndex, piiIndicesFor, getPiiConfigError, encryptPayoutDetails, decryptPayoutDetails, encryptShippingConfig, decryptShippingConfig, } from "./pii-encrypt";
|
|
10
|
+
export { revealPii, maskPii, revealPiiAll, maskPiiAll } from "./pii-accessors";
|
|
11
|
+
export { isPiiEncrypted, maskName, maskEmail, maskPhone, maskPublicReview, maskPublicBid, maskPublicEventEntry, maskOfferForSeller, ENC_PREFIX, HMAC_PREFIX, } from "./pii-mask";
|
|
9
12
|
export { USER_PII_FIELDS, USER_PII_INDEX_MAP, ADDRESS_PII_FIELDS, ORDER_PII_FIELDS, PAYOUT_PII_FIELDS, PAYOUT_PII_INDEX_MAP, BID_PII_FIELDS, TOKEN_PII_FIELDS, TOKEN_PII_INDEX_MAP, REVIEW_PII_FIELDS, REVIEW_PII_INDEX_MAP, OFFER_PII_FIELDS, EVENT_ENTRY_PII_FIELDS, LOTTERY_ENTRY_PII_FIELDS, PAYMENT_METHOD_PII_FIELDS, CONVERSATION_PII_FIELDS, MESSAGE_PII_FIELDS, } from "./pii-schemas";
|
|
10
13
|
export { encryptSecret, decryptSecret, isSecretEncrypted, maskSecret, } from "./settings-encryption";
|
package/dist/security/index.js
CHANGED
|
@@ -2,11 +2,25 @@ export { generateNonce, buildCSP } from "./csp.js";
|
|
|
2
2
|
export { rateLimit, applyRateLimit, rateLimitByIdentifier, RateLimitPresets, clearRateLimitStore, getClientIP, hashGuestIdentity, } from "./rate-limit.js";
|
|
3
3
|
export { requireAuth, requireRole, requireOwnership, requireEmailVerified, requireActiveAccount, canChangeRole, getRoleLevel, } from "./authorization.js";
|
|
4
4
|
export { redactPii, safeDisplayName, safeDisplayEmail, maskIp } from "./pii-redact.js";
|
|
5
|
-
|
|
5
|
+
/*
|
|
6
|
+
* The ciphertext-by-default forcing function. Types + two labelling helpers
|
|
7
|
+
* only โ no crypto โ so this stays safe in the universal barrel (Root Cause
|
|
8
|
+
* #24). See `encrypted.ts` for why `tsc` has to be the thing that enumerates
|
|
9
|
+
* the 147 call sites, and why there is no `plaintext()` free function.
|
|
10
|
+
*/
|
|
11
|
+
export { asEncrypted, asEncryptedMaybe } from "./encrypted.js";
|
|
12
|
+
export { encryptValue, decryptValue, hmacBlindIndex, encryptPiiFields, decryptPiiFields, encryptPii, decryptPii, piiBlindIndex, piiIndicesFor, getPiiConfigError, encryptPayoutDetails, decryptPayoutDetails, encryptShippingConfig, decryptShippingConfig, } from "./pii-encrypt.js";
|
|
13
|
+
/*
|
|
14
|
+
* The two NAMED PII accessors that replace an unconditional `mapDoc` decrypt.
|
|
15
|
+
* Server-only โ they import `pii-encrypt`, which reaches node:crypto through a
|
|
16
|
+
* bare runtime require (Root Cause #24), so this must never be re-exported
|
|
17
|
+
* from the universal client entry.
|
|
18
|
+
*/
|
|
19
|
+
export { revealPii, maskPii, revealPiiAll, maskPiiAll } from "./pii-accessors.js";
|
|
6
20
|
// Crypto-free display-masking helpers -- sourced from pii-mask.ts (not
|
|
7
21
|
// pii-encrypt.ts) so this barrel stays safe to re-export from the
|
|
8
22
|
// universal client+server index.ts. See pii-mask.ts's header comment.
|
|
9
|
-
export { isPiiEncrypted, maskName, maskEmail, maskPublicReview, maskPublicBid, maskPublicEventEntry, maskOfferForSeller, ENC_PREFIX, HMAC_PREFIX, } from "./pii-mask.js";
|
|
23
|
+
export { isPiiEncrypted, maskName, maskEmail, maskPhone, maskPublicReview, maskPublicBid, maskPublicEventEntry, maskOfferForSeller, ENC_PREFIX, HMAC_PREFIX, } from "./pii-mask.js";
|
|
10
24
|
export { USER_PII_FIELDS, USER_PII_INDEX_MAP, ADDRESS_PII_FIELDS, ORDER_PII_FIELDS, PAYOUT_PII_FIELDS, PAYOUT_PII_INDEX_MAP, BID_PII_FIELDS, TOKEN_PII_FIELDS, TOKEN_PII_INDEX_MAP, REVIEW_PII_FIELDS, REVIEW_PII_INDEX_MAP, OFFER_PII_FIELDS, EVENT_ENTRY_PII_FIELDS, LOTTERY_ENTRY_PII_FIELDS, PAYMENT_METHOD_PII_FIELDS, CONVERSATION_PII_FIELDS, MESSAGE_PII_FIELDS, } from "./pii-schemas.js";
|
|
11
25
|
export { encryptSecret, decryptSecret, isSecretEncrypted, maskSecret, } from "./settings-encryption.js";
|
|
12
26
|
// RBAC system โ DELETED 2026-08-29.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The two NAMED accessors that replace an unconditional `mapDoc` decrypt.
|
|
3
|
+
*
|
|
4
|
+
* ## Why this module exists
|
|
5
|
+
*
|
|
6
|
+
* `audit-pii-coverage`'s R3 stages fourteen repositories whose `mapDoc`
|
|
7
|
+
* decrypted PII on every read, so ciphertext never left the database and every
|
|
8
|
+
* caller silently handled plaintext. The prescription โ copy
|
|
9
|
+
* `SiteSettingsRepository`: leave `mapDoc` alone and expose plaintext through a
|
|
10
|
+
* NAMED getter with a masked variant โ is per-repository, and writing it
|
|
11
|
+
* fourteen times would be fourteen chances for the fieldโmask mapping to
|
|
12
|
+
* drift (Root Cause #75). So the rule lives here once and each repository
|
|
13
|
+
* delegates.
|
|
14
|
+
*
|
|
15
|
+
* ```ts
|
|
16
|
+
* repo.findById(id) โ PII fields are Encrypted<string>
|
|
17
|
+
* repo.revealFor(doc) โ plaintext, opt-in and named
|
|
18
|
+
* repo.maskedFor(doc) โ masked, the UI default
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* ## ๐ Masking must DECRYPT FIRST
|
|
22
|
+
*
|
|
23
|
+
* This is the trap worth stating, because getting it wrong is silent and looks
|
|
24
|
+
* like success. `maskName`/`maskEmail` in `pii-mask.ts` both begin with
|
|
25
|
+
* `if (hasEncPrefix(value)) return "Anonymous" / "***@***.***"` โ a deliberate
|
|
26
|
+
* guard so ciphertext can never reach a UI. Once `mapDoc` stops decrypting,
|
|
27
|
+
* handing a stored field straight to `maskName` therefore returns "Anonymous"
|
|
28
|
+
* for EVERY row: no error, no ciphertext leak, and a masked column that is
|
|
29
|
+
* uniformly useless instead of showing "R*** K***". `maskPii` decrypts and
|
|
30
|
+
* then masks.
|
|
31
|
+
*
|
|
32
|
+
* ## Field โ mask is by NAME CLASS, deliberately
|
|
33
|
+
*
|
|
34
|
+
* An email masks differently from a phone from a person's name, and the field
|
|
35
|
+
* lists these repositories already declare (`*_PII_FIELDS`) carry no type
|
|
36
|
+
* information. Classifying on the field name is the only signal available, and
|
|
37
|
+
* it is the same approach `pii-redact.ts` has always used for logs โ the
|
|
38
|
+
* difference being that this module uses the USER-FACING masks from
|
|
39
|
+
* `pii-mask.ts` rather than the log-oriented ones.
|
|
40
|
+
*
|
|
41
|
+
* ๐ The fallback is `maskName`, not "return as-is". An unrecognised PII field
|
|
42
|
+
* name must degrade toward LESS disclosure; returning the plaintext would make
|
|
43
|
+
* a new field silently public the moment someone adds it to a `*_PII_FIELDS`
|
|
44
|
+
* list without touching this file.
|
|
45
|
+
*
|
|
46
|
+
* @tag domain:security
|
|
47
|
+
* @tag layer:security
|
|
48
|
+
* @tag access:server-only
|
|
49
|
+
* @tag sideEffects:none
|
|
50
|
+
*/
|
|
51
|
+
/**
|
|
52
|
+
* Decrypt the named PII fields. **Opt-in and named**: every call site is a
|
|
53
|
+
* deliberate decision that shows up in review and in a grep.
|
|
54
|
+
*
|
|
55
|
+
* The return type is the caller's plaintext-facing shape. That cast is the one
|
|
56
|
+
* place it is legitimate: this function performs the decryption that makes the
|
|
57
|
+
* `Encrypted<โฆ>` brand false, which is exactly what the brand is for.
|
|
58
|
+
*/
|
|
59
|
+
export declare function revealPii<Plain extends object>(doc: object, piiFields: readonly string[]): Plain;
|
|
60
|
+
/**
|
|
61
|
+
* Decrypt, then mask. **The default a UI should reach for.**
|
|
62
|
+
*
|
|
63
|
+
* Returns the same shape as `revealPii` because a masked value is still a
|
|
64
|
+
* displayable string โ the difference is in what it contains, which is why the
|
|
65
|
+
* two accessors must be separately named rather than one taking a boolean.
|
|
66
|
+
*/
|
|
67
|
+
export declare function maskPii<Plain extends object>(doc: object, piiFields: readonly string[]): Plain;
|
|
68
|
+
/** Array form of `revealPii`, for list reads. */
|
|
69
|
+
export declare function revealPiiAll<Plain extends object>(docs: readonly object[], piiFields: readonly string[]): Plain[];
|
|
70
|
+
/** Array form of `maskPii`, for list reads. */
|
|
71
|
+
export declare function maskPiiAll<Plain extends object>(docs: readonly object[], piiFields: readonly string[]): Plain[];
|