@mohasinac/appkit 4.13.1 → 4.15.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/_internal/client/features/layout/DashboardLayoutClient.js +14 -5
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +3 -0
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +6 -0
- package/dist/_internal/client/features/lottery/LotteryDetailView.d.ts +8 -0
- package/dist/_internal/client/features/lottery/LotteryDetailView.js +4 -1
- package/dist/_internal/client/features/lottery/LotteryListView.d.ts +7 -0
- package/dist/_internal/client/features/lottery/LotteryListView.js +1 -1
- package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.js +4 -1
- package/dist/_internal/client/features/lottery/slot-collage-items.d.ts +15 -0
- package/dist/_internal/client/features/lottery/slot-collage-items.js +13 -0
- package/dist/_internal/server/features/auctions/actions.js +8 -2
- package/dist/_internal/server/features/bundles/data.d.ts +16 -0
- package/dist/_internal/server/features/bundles/data.js +26 -0
- package/dist/_internal/server/features/bundles/index.d.ts +1 -1
- package/dist/_internal/server/features/bundles/index.js +1 -1
- package/dist/_internal/server/features/cart/service.d.ts +3 -3
- package/dist/_internal/server/features/checkout/actions.js +25 -0
- package/dist/_internal/server/features/checkout/locked-lines.d.ts +38 -0
- package/dist/_internal/server/features/checkout/locked-lines.js +171 -0
- package/dist/_internal/server/features/checkout/source-context.d.ts +5 -0
- package/dist/_internal/server/features/checkout/source-context.js +157 -0
- package/dist/_internal/server/features/homepage/index.d.ts +0 -1
- package/dist/_internal/server/features/homepage/index.js +7 -1
- package/dist/_internal/server/features/lottery/adapters.js +4 -0
- package/dist/_internal/server/features/offers/adapters.d.ts +103 -0
- package/dist/_internal/server/features/offers/adapters.js +88 -0
- package/dist/_internal/server/features/offers/index.d.ts +2 -0
- package/dist/_internal/server/features/offers/index.js +1 -0
- package/dist/_internal/server/features/orders/adapters.js +24 -0
- package/dist/_internal/server/features/products/data.js +15 -37
- package/dist/_internal/server/features/products/index.d.ts +1 -1
- package/dist/_internal/server/features/products/index.js +1 -1
- package/dist/_internal/server/features/products/list-public.d.ts +46 -20
- package/dist/_internal/server/features/products/list-public.js +266 -90
- package/dist/_internal/server/features/products/listing-tab-counts.d.ts +44 -0
- package/dist/_internal/server/features/products/listing-tab-counts.js +97 -0
- package/dist/_internal/server/features/site-settings/adapters.d.ts +51 -0
- package/dist/_internal/server/features/site-settings/adapters.js +75 -0
- package/dist/_internal/server/features/site-settings/index.d.ts +1 -0
- package/dist/_internal/server/features/site-settings/index.js +1 -0
- package/dist/_internal/server/features/stores/adapters.d.ts +56 -0
- package/dist/_internal/server/features/stores/adapters.js +91 -0
- package/dist/_internal/server/features/stores/index.d.ts +1 -0
- package/dist/_internal/server/features/stores/index.js +1 -0
- package/dist/_internal/server/jobs/core/auctionSettlement.js +56 -2
- package/dist/_internal/server/jobs/core/offerExpiry.js +55 -19
- package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.d.ts +5 -0
- package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.js +33 -1
- package/dist/_internal/server/jobs/handlers/messages.d.ts +7 -0
- package/dist/_internal/server/jobs/handlers/messages.js +10 -0
- package/dist/_internal/shared/actions/action-registry.js +17 -1
- package/dist/_internal/shared/checkout/lanes.d.ts +25 -0
- package/dist/_internal/shared/checkout/lanes.js +26 -0
- package/dist/_internal/shared/features/auctions/config.d.ts +27 -0
- package/dist/_internal/shared/features/auctions/config.js +27 -0
- package/dist/_internal/shared/features/auctions/schema.d.ts +14 -2
- package/dist/_internal/shared/features/auctions/schema.js +13 -1
- package/dist/_internal/shared/features/blog/schema.d.ts +2 -2
- package/dist/_internal/shared/features/cart/schema.d.ts +20 -15
- package/dist/_internal/shared/features/cart/schema.js +15 -0
- package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +32 -32
- package/dist/_internal/shared/features/emi/schedule.d.ts +24 -3
- package/dist/_internal/shared/features/emi/schedule.js +20 -5
- package/dist/_internal/shared/features/events/schema.d.ts +2 -2
- package/dist/_internal/shared/features/homepage/section-gate.d.ts +14 -0
- package/dist/_internal/shared/features/homepage/section-gate.js +51 -0
- package/dist/_internal/shared/features/offers/config.d.ts +30 -0
- package/dist/_internal/shared/features/offers/config.js +59 -0
- package/dist/_internal/shared/features/orders/schema.d.ts +8 -8
- package/dist/_internal/shared/features/products/schema.d.ts +30 -30
- package/dist/_internal/shared/features/products/to-product-item.js +6 -0
- package/dist/_internal/shared/features/reviews/schema.d.ts +2 -2
- package/dist/_internal/shared/features/site-settings/fees.d.ts +60 -0
- package/dist/_internal/shared/features/site-settings/fees.js +39 -0
- package/dist/_internal/shared/features/site-settings/types.d.ts +40 -0
- package/dist/_internal/shared/features/site-settings/types.js +1 -0
- package/dist/_internal/shared/history/history.d.ts +88 -0
- package/dist/_internal/shared/history/history.js +198 -0
- package/dist/_internal/shared/history/index.d.ts +4 -0
- package/dist/_internal/shared/history/index.js +2 -0
- package/dist/_internal/shared/history/types.d.ts +61 -0
- package/dist/_internal/shared/history/types.js +6 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +54 -1
- package/dist/_internal/shared/listing-types/_registry.js +67 -0
- package/dist/_internal/shared/listing-types/art/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/art/config.js +5 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +13 -0
- package/dist/_internal/shared/listing-types/auction/config.js +21 -0
- package/dist/_internal/shared/listing-types/availability.d.ts +79 -0
- package/dist/_internal/shared/listing-types/availability.js +104 -0
- package/dist/_internal/shared/listing-types/capabilities.d.ts +15 -0
- package/dist/_internal/shared/listing-types/capabilities.js +12 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/classified/config.js +5 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +11 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +22 -2
- package/dist/_internal/shared/listing-types/live/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/live/config.js +5 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +19 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +11 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +15 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/standard/config.js +5 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +3 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +5 -0
- package/dist/client.d.ts +20 -7
- package/dist/client.js +22 -4
- package/dist/constants/api-endpoints.d.ts +6 -0
- package/dist/constants/api-endpoints.js +2 -0
- package/dist/constants/field-names.d.ts +57 -8
- package/dist/constants/field-names.js +101 -8
- package/dist/constants/table-keys.d.ts +17 -0
- package/dist/constants/table-keys.js +17 -0
- package/dist/errors/error-codes.d.ts +13 -1
- package/dist/errors/error-codes.js +13 -1
- package/dist/errors/error-display-map.js +12 -3
- package/dist/errors/messages.d.ts +10 -2
- package/dist/errors/messages.js +10 -2
- package/dist/features/about/components/AboutView.d.ts +3 -0
- package/dist/features/about/components/AboutView.js +3 -2
- package/dist/features/about/components/PolicyPageView.d.ts +2 -1
- package/dist/features/about/components/PolicyPageView.js +61 -23
- package/dist/features/about/components/PublicProfileView.js +5 -0
- package/dist/features/about/schemas/firestore.d.ts +3 -0
- package/dist/features/account/components/UserBidsView.js +12 -4
- package/dist/features/account/components/UserOrdersView.js +7 -0
- package/dist/features/account/components/UserReturnsView.d.ts +3 -0
- package/dist/features/account/components/UserReturnsView.js +17 -1
- package/dist/features/account/components/index.d.ts +0 -2
- package/dist/features/account/components/index.js +0 -1
- package/dist/features/account/schemas/index.d.ts +2 -2
- package/dist/features/account/types/index.d.ts +21 -2
- package/dist/features/addresses/schemas/index.d.ts +4 -4
- package/dist/features/admin/components/AdminArtView.js +8 -3
- package/dist/features/admin/components/AdminAuditLogView.js +1 -0
- package/dist/features/admin/components/AdminBidsView.js +15 -2
- package/dist/features/admin/components/AdminBlogEditorView.js +65 -33
- package/dist/features/admin/components/AdminClassifiedView.js +8 -3
- package/dist/features/admin/components/AdminDigitalCodesView.js +8 -3
- package/dist/features/admin/components/AdminFeatureEditorView.js +35 -6
- package/dist/features/admin/components/AdminFeatureFlagsView.js +1 -0
- package/dist/features/admin/components/AdminLiveView.js +8 -3
- package/dist/features/admin/components/AdminNavEditorView.js +15 -5
- package/dist/features/admin/components/AdminNewsletterView.js +18 -2
- package/dist/features/admin/components/AdminOffersView.d.ts +4 -0
- package/dist/features/admin/components/AdminOffersView.js +230 -0
- package/dist/features/admin/components/AdminOrdersView.js +10 -1
- package/dist/features/admin/components/AdminPaymentMethodsView.js +24 -4
- package/dist/features/admin/components/AdminPrizeDrawsView.js +5 -0
- package/dist/features/admin/components/AdminProductsView.js +16 -29
- package/dist/features/admin/components/AdminScammerEditorView.d.ts +2 -1
- package/dist/features/admin/components/AdminScammerEditorView.js +3 -13
- package/dist/features/admin/components/AdminScammersView.js +3 -8
- package/dist/features/admin/components/AdminSectionsView.js +32 -23
- package/dist/features/admin/components/AdminSessionsView.js +17 -2
- package/dist/features/admin/components/AdminSiteSettingsView.js +31 -13
- package/dist/features/admin/components/AdminSiteView.js +6 -2
- package/dist/features/admin/components/AdminStickersView.js +8 -3
- package/dist/features/admin/components/ViewAuditLogEntryModal.js +1 -0
- package/dist/features/admin/components/index.d.ts +2 -0
- package/dist/features/admin/components/index.js +1 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +4 -2
- package/dist/features/admin/components/sections/adminSectionsTypes.js +45 -27
- package/dist/features/admin/constants/filter-tabs.d.ts +89 -0
- package/dist/features/admin/constants/filter-tabs.js +56 -0
- package/dist/features/admin/schemas/firestore.d.ts +122 -3
- package/dist/features/admin/schemas/firestore.js +1 -0
- package/dist/features/admin/schemas/homepage-section-form.d.ts +22 -0
- package/dist/features/admin/schemas/homepage-section-form.js +68 -0
- package/dist/features/admin/schemas/nav-item-form.d.ts +74 -0
- package/dist/features/admin/schemas/nav-item-form.js +72 -0
- package/dist/features/auctions/actions/bid-actions.d.ts +20 -5
- package/dist/features/auctions/actions/bid-actions.js +93 -20
- package/dist/features/auctions/components/AuctionBidsTable.d.ts +10 -1
- package/dist/features/auctions/components/AuctionBidsTable.js +22 -4
- package/dist/features/auctions/components/AuctionDetailPageView.js +11 -6
- package/dist/features/auctions/components/AuctionsListView.js +5 -6
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +7 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +19 -2
- package/dist/features/auctions/components/PlaceBidFormClient.d.ts +1 -2
- package/dist/features/auctions/components/PlaceBidFormClient.js +8 -4
- package/dist/features/auctions/components/bid-detail-fields.d.ts +29 -0
- package/dist/features/auctions/components/bid-detail-fields.js +103 -0
- package/dist/features/auctions/repository/bid.repository.d.ts +13 -0
- package/dist/features/auctions/repository/bid.repository.js +23 -0
- package/dist/features/auctions/schemas/firestore.d.ts +17 -0
- package/dist/features/auctions/schemas/index.d.ts +12 -12
- package/dist/features/audit-log/schemas/firestore.d.ts +14 -0
- package/dist/features/audit-log/schemas/firestore.js +7 -0
- package/dist/features/auth/permissions/constants.d.ts +1 -1
- package/dist/features/auth/permissions/constants.js +10 -1
- package/dist/features/blog/actions/blog-actions.d.ts +7 -7
- package/dist/features/blog/schemas/blog-form.d.ts +80 -0
- package/dist/features/blog/schemas/blog-form.js +100 -0
- package/dist/features/blog/schemas/index.d.ts +6 -6
- package/dist/features/cart/repository/cart.repository.js +1 -0
- package/dist/features/cart/schemas/firestore.d.ts +15 -0
- package/dist/features/catalogue/schemas/validation.d.ts +4 -4
- package/dist/features/categories/components/BrandDetailPageView.js +23 -40
- package/dist/features/categories/components/BrandDetailTabs.d.ts +7 -7
- package/dist/features/categories/components/BrandDetailTabs.js +8 -12
- package/dist/features/categories/components/BundleCollage.js +1 -1
- package/dist/features/categories/components/CategoryDetailPageView.js +53 -57
- package/dist/features/categories/components/CategoryDetailTabs.d.ts +10 -8
- package/dist/features/categories/components/CategoryDetailTabs.js +11 -16
- package/dist/features/categories/components/CategoryProductsListing.js +11 -1
- package/dist/features/categories/components/ConcernCard.js +7 -1
- package/dist/features/categories/schemas/firestore.d.ts +13 -0
- package/dist/features/categories/schemas/index.d.ts +26 -26
- package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +16 -1
- package/dist/features/classified/components/ClassifiedDetailPageView.js +23 -3
- package/dist/features/events/components/AdminEventEditorView.js +32 -54
- package/dist/features/events/components/AdminEventEntriesView.js +22 -3
- package/dist/features/events/components/AdminEventsView.js +15 -11
- package/dist/features/events/components/EventFilters.d.ts +9 -1
- package/dist/features/events/components/EventFilters.js +45 -21
- package/dist/features/events/components/EventsIndexListing.d.ts +6 -1
- package/dist/features/events/components/EventsIndexListing.js +2 -2
- package/dist/features/events/components/EventsListPageView.js +13 -4
- package/dist/features/events/repository/events.repository.d.ts +17 -0
- package/dist/features/events/repository/events.repository.js +27 -0
- package/dist/features/events/schemas/event-form.d.ts +113 -0
- package/dist/features/events/schemas/event-form.js +82 -0
- package/dist/features/events/schemas/firestore.d.ts +12 -0
- package/dist/features/events/schemas/firestore.js +12 -0
- package/dist/features/events/schemas/index.d.ts +50 -50
- package/dist/features/events/types/index.d.ts +11 -0
- package/dist/features/events/types/index.js +57 -1
- package/dist/features/faq/actions/faq-actions.d.ts +12 -12
- package/dist/features/faq/schemas/index.d.ts +8 -8
- package/dist/features/filters/FilterFacetSection.d.ts +7 -1
- package/dist/features/filters/FilterFacetSection.js +11 -3
- package/dist/features/grouped/schemas/grouped-listing-form.d.ts +101 -0
- package/dist/features/grouped/schemas/grouped-listing-form.js +89 -0
- package/dist/features/grouped/schemas/index.d.ts +4 -4
- package/dist/features/homepage/actions/homepage-section-actions.d.ts +11 -3
- package/dist/features/homepage/actions/homepage-section-actions.js +33 -1
- package/dist/features/homepage/components/AnnouncementBar.d.ts +7 -1
- package/dist/features/homepage/components/AnnouncementBar.js +3 -3
- package/dist/features/homepage/components/MarketplaceHomepageView.js +20 -6
- package/dist/features/homepage/hooks/homepage-query.d.ts +16 -0
- package/dist/features/homepage/hooks/homepage-query.js +45 -0
- package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +10 -0
- package/dist/features/homepage/hooks/useFeaturedAuctions.js +28 -8
- package/dist/features/homepage/hooks/useFeaturedPreOrders.js +17 -8
- package/dist/features/homepage/hooks/useFeaturedProducts.js +15 -8
- package/dist/features/homepage/schemas/index.d.ts +33 -2
- package/dist/features/homepage/schemas/index.js +24 -0
- package/dist/features/layout/AppLayoutShell.d.ts +11 -1
- package/dist/features/layout/AppLayoutShell.js +15 -14
- package/dist/features/layout/BackToTop.d.ts +9 -0
- package/dist/features/layout/BackToTop.js +10 -1
- package/dist/features/layout/BottomActions.js +28 -25
- package/dist/features/layout/BottomChrome.d.ts +34 -0
- package/dist/features/layout/BottomChrome.js +55 -0
- package/dist/features/layout/BottomNavLayout.d.ts +6 -0
- package/dist/features/layout/BottomNavLayout.js +7 -1
- package/dist/features/layout/BottomNavbar.js +15 -2
- package/dist/features/layout/FooterLayout.js +11 -1
- package/dist/features/layout/NavbarLayout.js +1 -1
- package/dist/features/layout/TitleBarLayout.d.ts +7 -0
- package/dist/features/layout/TitleBarLayout.js +28 -5
- package/dist/features/layout/index.d.ts +2 -0
- package/dist/features/layout/index.js +1 -0
- package/dist/features/lottery/types/index.d.ts +3 -0
- package/dist/features/media/MediaPickerModal.js +5 -1
- package/dist/features/messages/schemas/index.d.ts +2 -2
- package/dist/features/orders/components/OrderScopeTabs.d.ts +20 -0
- package/dist/features/orders/components/OrderScopeTabs.js +31 -0
- package/dist/features/orders/components/OrderStatusTimeline.d.ts +5 -1
- package/dist/features/orders/components/OrderStatusTimeline.js +39 -20
- package/dist/features/orders/constants/order-scope.d.ts +48 -0
- package/dist/features/orders/constants/order-scope.js +111 -0
- package/dist/features/orders/repository/orders.repository.d.ts +54 -7
- package/dist/features/orders/repository/orders.repository.js +121 -22
- package/dist/features/orders/schemas/firestore.d.ts +152 -0
- package/dist/features/orders/schemas/firestore.js +30 -0
- package/dist/features/orders/schemas/index.d.ts +18 -18
- package/dist/features/orders/types/index.d.ts +35 -7
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +14 -9
- package/dist/features/pre-orders/components/PreOrdersListView.js +6 -5
- package/dist/features/pre-orders/schemas/index.d.ts +1 -1
- package/dist/features/products/actions/product-actions.d.ts +14 -0
- package/dist/features/products/actions/product-actions.js +49 -11
- package/dist/features/products/api/route.d.ts +12 -0
- package/dist/features/products/api/route.js +42 -100
- package/dist/features/products/components/ArtStickersListView.js +2 -2
- package/dist/features/products/components/AuctionsIndexListing.js +13 -11
- package/dist/features/products/components/AvailabilityTabs.d.ts +11 -0
- package/dist/features/products/components/AvailabilityTabs.js +47 -0
- package/dist/features/products/components/GroupSettingsPanel.js +5 -1
- package/dist/features/products/components/MakeOfferButton.js +48 -49
- package/dist/features/products/components/PrizeDrawCollage.d.ts +20 -4
- package/dist/features/products/components/PrizeDrawCollage.js +9 -1
- package/dist/features/products/components/PrizeDrawsIndexListing.js +14 -12
- package/dist/features/products/components/PrizeDrawsListingView.js +2 -2
- package/dist/features/products/components/PrizeDrawsSection.d.ts +7 -1
- package/dist/features/products/components/PrizeDrawsSection.js +23 -18
- package/dist/features/products/components/ProductDetailPageView.d.ts +4 -1
- package/dist/features/products/components/ProductDetailPageView.js +18 -4
- package/dist/features/products/components/ProductForm.js +5 -2
- package/dist/features/products/components/ProductGrid.js +6 -1
- package/dist/features/products/components/ProductsIndexListing.js +22 -32
- package/dist/features/products/components/ProductsIndexPageView.js +6 -9
- package/dist/features/products/components/index.d.ts +2 -2
- package/dist/features/products/components/index.js +1 -1
- package/dist/features/products/config/listing-type-listing-config.d.ts +20 -0
- package/dist/features/products/config/listing-type-listing-config.js +22 -10
- package/dist/features/products/constants/action-defs.d.ts +2 -0
- package/dist/features/products/constants/action-defs.js +6 -0
- package/dist/features/products/hooks/useAvailabilityScope.d.ts +13 -0
- package/dist/features/products/hooks/useAvailabilityScope.js +19 -0
- package/dist/features/products/hooks/useProducts.d.ts +5 -0
- package/dist/features/products/hooks/useProducts.js +13 -2
- package/dist/features/products/repository/products.repository.d.ts +31 -2
- package/dist/features/products/repository/products.repository.js +53 -21
- package/dist/features/products/schemas/firestore.d.ts +17 -3
- package/dist/features/products/schemas/firestore.js +7 -2
- package/dist/features/products/schemas/index.d.ts +64 -64
- package/dist/features/products/schemas/product-features.validators.d.ts +79 -6
- package/dist/features/products/schemas/product-features.validators.js +63 -0
- package/dist/features/products/types/index.d.ts +16 -1
- package/dist/features/promotions/schemas/index.d.ts +2 -2
- package/dist/features/reviews/schemas/index.d.ts +16 -16
- package/dist/features/scams/constants/scammer-status-display.d.ts +28 -0
- package/dist/features/scams/constants/scammer-status-display.js +79 -0
- package/dist/features/search/schemas/index.d.ts +4 -4
- package/dist/features/seller/actions/offer-actions.js +57 -4
- package/dist/features/seller/components/OfferPhaseTimeline.d.ts +59 -0
- package/dist/features/seller/components/OfferPhaseTimeline.js +107 -0
- package/dist/features/seller/components/SellerArtView.js +5 -0
- package/dist/features/seller/components/SellerAuctionsView.js +13 -15
- package/dist/features/seller/components/SellerBidsView.js +11 -4
- package/dist/features/seller/components/SellerClassifiedView.js +5 -0
- package/dist/features/seller/components/SellerCouponEditorView.js +17 -17
- package/dist/features/seller/components/SellerDigitalCodesView.js +5 -0
- package/dist/features/seller/components/SellerLiveView.js +5 -0
- package/dist/features/seller/components/SellerOffersView.js +2 -1
- package/dist/features/seller/components/SellerOrdersView.js +31 -9
- package/dist/features/seller/components/SellerPayoutSettingsView.js +56 -31
- package/dist/features/seller/components/SellerPreOrdersView.js +5 -0
- package/dist/features/seller/components/SellerPrizeDrawsView.js +14 -16
- package/dist/features/seller/components/SellerProductShell.js +7 -1
- package/dist/features/seller/components/SellerProductsView.js +11 -8
- package/dist/features/seller/components/SellerStickersView.js +5 -0
- package/dist/features/seller/components/index.d.ts +0 -2
- package/dist/features/seller/components/index.js +0 -1
- package/dist/features/seller/repository/offer.repository.d.ts +142 -24
- package/dist/features/seller/repository/offer.repository.js +165 -26
- package/dist/features/seller/schemas/coupon-form.d.ts +72 -0
- package/dist/features/seller/schemas/coupon-form.js +116 -0
- package/dist/features/seller/schemas/firestore.d.ts +56 -2
- package/dist/features/seller/schemas/firestore.js +27 -0
- package/dist/features/seller/schemas/index.d.ts +2 -2
- package/dist/features/seller/schemas/offer-forms.d.ts +46 -0
- package/dist/features/seller/schemas/offer-forms.js +42 -0
- package/dist/features/seller/server.d.ts +0 -1
- package/dist/features/seller/server.js +0 -1
- package/dist/features/shell/SectionForm.d.ts +99 -0
- package/dist/features/shell/SectionForm.js +128 -0
- package/dist/features/shell/build-sections.d.ts +63 -0
- package/dist/features/shell/build-sections.js +207 -0
- package/dist/features/shell/entity-form.d.ts +109 -0
- package/dist/features/shell/entity-form.js +96 -0
- package/dist/features/shell/field-ui-meta.d.ts +115 -0
- package/dist/features/shell/field-ui-meta.js +324 -0
- package/dist/features/shell/index.d.ts +8 -0
- package/dist/features/shell/index.js +4 -0
- package/dist/features/status-history/components/StatusTimeline.d.ts +74 -0
- package/dist/features/status-history/components/StatusTimeline.js +46 -0
- package/dist/features/status-history/index.d.ts +11 -0
- package/dist/features/status-history/index.js +10 -0
- package/dist/features/store-extensions/components/ReviewDecisionModal.d.ts +27 -0
- package/dist/features/store-extensions/components/ReviewDecisionModal.js +82 -0
- package/dist/features/store-extensions/index.d.ts +12 -0
- package/dist/features/store-extensions/index.js +12 -0
- package/dist/features/store-extensions/schemas/admin-notification-form.d.ts +36 -0
- package/dist/features/store-extensions/schemas/admin-notification-form.js +114 -0
- package/dist/features/store-extensions/schemas/analytics-forms.d.ts +57 -0
- package/dist/features/store-extensions/schemas/analytics-forms.js +158 -0
- package/dist/features/store-extensions/schemas/custom-role-form.d.ts +85 -0
- package/dist/features/store-extensions/schemas/custom-role-form.js +118 -0
- package/dist/features/store-extensions/schemas/firestore.d.ts +21 -1
- package/dist/features/store-extensions/schemas/firestore.js +60 -0
- package/dist/features/store-extensions/schemas/google-config-form.d.ts +53 -0
- package/dist/features/store-extensions/schemas/google-config-form.js +105 -0
- package/dist/features/store-extensions/schemas/item-request-create-form.d.ts +28 -0
- package/dist/features/store-extensions/schemas/item-request-create-form.js +80 -0
- package/dist/features/store-extensions/schemas/listing-template-form.d.ts +78 -0
- package/dist/features/store-extensions/schemas/listing-template-form.js +87 -0
- package/dist/features/store-extensions/schemas/moderation-review-form.d.ts +49 -0
- package/dist/features/store-extensions/schemas/moderation-review-form.js +101 -0
- package/dist/features/store-extensions/schemas/payout-method-form.d.ts +153 -0
- package/dist/features/store-extensions/schemas/payout-method-form.js +155 -0
- package/dist/features/store-extensions/schemas/report-create-form.d.ts +25 -0
- package/dist/features/store-extensions/schemas/report-create-form.js +79 -0
- package/dist/features/store-extensions/schemas/report-review-form.d.ts +47 -0
- package/dist/features/store-extensions/schemas/report-review-form.js +111 -0
- package/dist/features/store-extensions/schemas/shipping-config-form.d.ts +148 -0
- package/dist/features/store-extensions/schemas/shipping-config-form.js +104 -0
- package/dist/features/store-extensions/schemas/store-category-form.d.ts +54 -0
- package/dist/features/store-extensions/schemas/store-category-form.js +73 -0
- package/dist/features/stores/api/[storeSlug]/route.js +2 -25
- package/dist/features/stores/components/StoreAuctionsListing.js +15 -1
- package/dist/features/stores/components/StoreClassifiedsListing.js +12 -2
- package/dist/features/stores/components/StoreDetailLayoutView.js +24 -71
- package/dist/features/stores/components/StoreDigitalCodesListing.js +12 -2
- package/dist/features/stores/components/StoreLiveItemsListing.js +12 -2
- package/dist/features/stores/components/StorePreOrdersListing.js +12 -1
- package/dist/features/stores/components/StoreProductsListing.js +11 -1
- package/dist/features/stores/repository/store.repository.js +6 -0
- package/dist/features/stores/schemas/index.d.ts +6 -6
- package/dist/features/support/schemas/index.d.ts +4 -4
- package/dist/features/tester/actions/checklist-item-actions.d.ts +4 -4
- package/dist/features/tester/seed-data/offers-tester-seed-data.js +119 -3
- package/dist/features/tester/seed-data/products-tester-seed-data.js +131 -1
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +431 -1
- package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
- package/dist/index.d.ts +25 -12
- package/dist/index.js +26 -11
- package/dist/next/routing/route-map.d.ts +23 -3
- package/dist/next/routing/route-map.js +14 -2
- package/dist/providers/db-firebase/base.repository.d.ts +30 -0
- package/dist/providers/db-firebase/base.repository.js +50 -1
- package/dist/providers/db-firebase/index.d.ts +1 -1
- package/dist/providers/db-firebase/index.js +1 -1
- package/dist/providers/db-firebase/sieve.d.ts +25 -0
- package/dist/providers/db-firebase/sieve.js +52 -18
- package/dist/react/hooks/useUrlTable.js +10 -1
- package/dist/schemas/firestore-value.d.ts +8 -0
- package/dist/schemas/firestore-value.js +44 -0
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/registry.d.ts +702 -69
- package/dist/schemas/registry.js +64 -1
- package/dist/seed/_helpers/category-forest.d.ts +2 -0
- package/dist/seed/_helpers/category-forest.js +309 -0
- package/dist/seed/_helpers/category-tree.d.ts +27 -0
- package/dist/seed/_helpers/category-tree.js +103 -0
- package/dist/seed/bids-seed-data.js +30 -0
- package/dist/seed/catalogue-seed-data.js +12 -12
- package/dist/seed/categories-seed-data.js +177 -162
- package/dist/seed/events-seed-data.js +61 -10
- package/dist/seed/homepage-sections-seed-data.js +5 -1
- package/dist/seed/offers-seed-data.js +244 -34
- package/dist/seed/orders-seed-data.js +336 -1
- package/dist/seed/products-art-seed-data.js +50 -12
- package/dist/seed/products-auctions-seed-data.js +138 -18
- package/dist/seed/products-classifieds-seed-data.js +80 -16
- package/dist/seed/products-digital-codes-seed-data.js +66 -18
- package/dist/seed/products-live-items-seed-data.js +64 -13
- package/dist/seed/products-preorders-seed-data.d.ts +0 -1
- package/dist/seed/products-preorders-seed-data.js +52 -13
- package/dist/seed/products-prize-draws-seed-data.js +63 -14
- package/dist/seed/products-standard-seed-data.js +99 -26
- package/dist/seed/products-stickers-seed-data.js +47 -12
- package/dist/seed/reviews-seed-data.js +6 -1
- package/dist/seed/site-settings-seed-data.d.ts +1 -38
- package/dist/seed/site-settings-seed-data.js +38 -76
- package/dist/seed/stores-seed-data.js +71 -1
- package/dist/seed/users-seed-data.js +15 -5
- package/dist/server-entry.d.ts +1 -2
- package/dist/server-entry.js +4 -3
- package/dist/server.d.ts +6 -3
- package/dist/server.js +13 -4
- package/dist/styles.css +78 -12
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Button.style.css +19 -4
- package/dist/ui/components/CollapsibleSection.d.ts +17 -1
- package/dist/ui/components/CollapsibleSection.js +6 -2
- package/dist/ui/components/FilterChipGroup.d.ts +25 -1
- package/dist/ui/components/FilterChipGroup.js +21 -4
- package/dist/ui/components/HandMode.style.css +47 -0
- package/dist/ui/components/Layout.d.ts +9 -2
- package/dist/ui/components/Layout.js +1 -1
- package/dist/ui/components/ListingLayout.js +8 -8
- package/dist/ui/components/ListingLayout.style.css +8 -7
- package/dist/ui/components/RecordDetailModal.d.ts +10 -1
- package/dist/ui/components/RecordDetailModal.js +2 -2
- package/dist/ui/components/StickyToolbar.d.ts +3 -1
- package/dist/ui/components/StickyToolbar.js +62 -20
- package/dist/ui/components/bottom-chrome-slot.d.ts +21 -0
- package/dist/ui/components/bottom-chrome-slot.js +29 -0
- package/dist/ui/components/index.style.css +3 -0
- package/dist/ui/forms/FormShell.d.ts +43 -13
- package/dist/ui/forms/FormShell.js +22 -11
- package/dist/ui/forms/index.d.ts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/package.json +2 -1
- package/scripts/node-esm-loader.mjs +65 -0
- package/scripts/seed-cli-loader.mjs +6 -49
- package/scripts/seed-cli.mjs +1 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: The only code in the repo that gated homepage sections on
|
|
3
|
+
* `siteSettings.featureFlags` lived inside `getHomepageInitial`, a
|
|
4
|
+
* function with ZERO call sites — the live homepage
|
|
5
|
+
* (`MarketplaceHomepageView`) reads `homepageSectionsRepository`
|
|
6
|
+
* directly. So turning off the `auctions` flag hid auctions everywhere
|
|
7
|
+
* except the homepage, which kept advertising them.
|
|
8
|
+
*
|
|
9
|
+
* `getHomepageInitial` itself was deleted rather than wired up: its other
|
|
10
|
+
* unique calls, `findActiveAuctions()` / `findActivePreOrders()`, are
|
|
11
|
+
* unbounded `.get()` collection scans with no `.limit()`, which Rule #6
|
|
12
|
+
* forbids. The gate is the only part worth keeping, so it moved here.
|
|
13
|
+
*
|
|
14
|
+
* EXPORTS: SECTION_FEATURE_GATE, filterSectionsByFeatureFlags
|
|
15
|
+
*
|
|
16
|
+
* @tag domain:homepage
|
|
17
|
+
* @tag layer:shared
|
|
18
|
+
* @tag pattern:none
|
|
19
|
+
* @tag access:isomorphic
|
|
20
|
+
* @tag consumers:MarketplaceHomepageView
|
|
21
|
+
* @tag sideEffects:none
|
|
22
|
+
*/
|
|
23
|
+
/** Section types that require a feature flag to be enabled to show on the homepage. */
|
|
24
|
+
export const SECTION_FEATURE_GATE = {
|
|
25
|
+
auctions: "auctions",
|
|
26
|
+
"pre-orders": "preOrders",
|
|
27
|
+
events: "events",
|
|
28
|
+
"event-raffles": "events",
|
|
29
|
+
"prize-draws": "events",
|
|
30
|
+
"blog-articles": "blog",
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Drop sections whose feature flag is off.
|
|
34
|
+
*
|
|
35
|
+
* A section type with no gate entry always passes, and a MISSING flag value
|
|
36
|
+
* counts as enabled (`!== false`) — the flags map is partial, and a section
|
|
37
|
+
* must not vanish just because an admin has never opened Site Settings.
|
|
38
|
+
*/
|
|
39
|
+
export function filterSectionsByFeatureFlags(sections,
|
|
40
|
+
// Not `Partial<Record<FeatureFlagKey, boolean>>`: two of the flag keys
|
|
41
|
+
// (`listingTypes`, `categoryTypes`) hold nested per-type objects rather than
|
|
42
|
+
// booleans. Neither is a gate key, so the `=== false` test below simply
|
|
43
|
+
// never fires for them.
|
|
44
|
+
flags) {
|
|
45
|
+
if (!flags)
|
|
46
|
+
return [...sections];
|
|
47
|
+
return sections.filter((section) => {
|
|
48
|
+
const flagKey = SECTION_FEATURE_GATE[section.type];
|
|
49
|
+
return !flagKey || flags[flagKey] !== false;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The floor, as a percentage of the listed price, below which an offer is
|
|
3
|
+
* rejected — used whenever a listing does not set its own `minOfferPercent`.
|
|
4
|
+
*
|
|
5
|
+
* 70, not 50. This resolves a real disagreement rather than picking a number:
|
|
6
|
+
* 70 is what `makeOffer` has always enforced, so a listing created through
|
|
7
|
+
* either seller editor (which seeded 50) has in practice behaved as 70 the whole
|
|
8
|
+
* time — the forms were lying to sellers. Lowering the server to 50 would
|
|
9
|
+
* silently loosen the rule on every listing that already exists; raising the
|
|
10
|
+
* forms to 70 changes only what new listings are seeded with and makes the UI
|
|
11
|
+
* honest about the rule already in force.
|
|
12
|
+
*/
|
|
13
|
+
export declare const DEFAULT_MIN_OFFER_PERCENT = 70;
|
|
14
|
+
/**
|
|
15
|
+
* The lowest amount this listing will accept as an offer.
|
|
16
|
+
*
|
|
17
|
+
* Rounded UP to the paisa, so the returned value always satisfies the
|
|
18
|
+
* percentage rule it was derived from — rounding down could return a number
|
|
19
|
+
* fractionally below the true floor, which the server would then reject while
|
|
20
|
+
* the UI displayed it as the minimum.
|
|
21
|
+
*/
|
|
22
|
+
export declare function minOfferAmount(listedPrice: number, percent?: number | null): number;
|
|
23
|
+
/**
|
|
24
|
+
* Whether `amount` is a legal offer on a listing priced at `listedPrice`.
|
|
25
|
+
*
|
|
26
|
+
* Both bounds matter and both are enforced server-side: at or above the listed
|
|
27
|
+
* price there is nothing to negotiate (the buyer should use Add to Cart), and
|
|
28
|
+
* below the floor the seller has said they don't want to hear it.
|
|
29
|
+
*/
|
|
30
|
+
export declare function isOfferAmountValid(amount: number, listedPrice: number, percent?: number | null): boolean;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: The minimum-offer rule had four independent implementations that did not
|
|
3
|
+
* agree. `makeOffer` enforced a 70% floor rounded with
|
|
4
|
+
* `Math.ceil(price * pct / 100 * 100) / 100`; `MakeOfferButton` computed
|
|
5
|
+
* its own floor with `roundRupees()` and seeded the input from it; and both
|
|
6
|
+
* seller editors wrote `minOfferPercent ?? 50` when the toggle was flipped
|
|
7
|
+
* on. So the forms advertised a 50% floor the server would reject, and even
|
|
8
|
+
* at a matching percentage the two rounding rules could differ by a rupee —
|
|
9
|
+
* the button seeding an amount its own submit then bounced.
|
|
10
|
+
* WHAT: One percentage default and one floor function, imported by every gate.
|
|
11
|
+
* Same discipline as `resolveMinBid` in the auctions config next door.
|
|
12
|
+
*
|
|
13
|
+
* EXPORTS:
|
|
14
|
+
* DEFAULT_MIN_OFFER_PERCENT, minOfferAmount, isOfferAmountValid
|
|
15
|
+
*
|
|
16
|
+
* @tag domain:offers,seller
|
|
17
|
+
* @tag layer:shared
|
|
18
|
+
* @tag pattern:none
|
|
19
|
+
* @tag access:isomorphic
|
|
20
|
+
* @tag consumers:offer-actions,MakeOfferButton,ProductDetailPageView,ProductForm,SellerProductShell
|
|
21
|
+
* @tag sideEffects:none
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* The floor, as a percentage of the listed price, below which an offer is
|
|
25
|
+
* rejected — used whenever a listing does not set its own `minOfferPercent`.
|
|
26
|
+
*
|
|
27
|
+
* 70, not 50. This resolves a real disagreement rather than picking a number:
|
|
28
|
+
* 70 is what `makeOffer` has always enforced, so a listing created through
|
|
29
|
+
* either seller editor (which seeded 50) has in practice behaved as 70 the whole
|
|
30
|
+
* time — the forms were lying to sellers. Lowering the server to 50 would
|
|
31
|
+
* silently loosen the rule on every listing that already exists; raising the
|
|
32
|
+
* forms to 70 changes only what new listings are seeded with and makes the UI
|
|
33
|
+
* honest about the rule already in force.
|
|
34
|
+
*/
|
|
35
|
+
export const DEFAULT_MIN_OFFER_PERCENT = 70;
|
|
36
|
+
/**
|
|
37
|
+
* The lowest amount this listing will accept as an offer.
|
|
38
|
+
*
|
|
39
|
+
* Rounded UP to the paisa, so the returned value always satisfies the
|
|
40
|
+
* percentage rule it was derived from — rounding down could return a number
|
|
41
|
+
* fractionally below the true floor, which the server would then reject while
|
|
42
|
+
* the UI displayed it as the minimum.
|
|
43
|
+
*/
|
|
44
|
+
export function minOfferAmount(listedPrice, percent) {
|
|
45
|
+
const pct = typeof percent === "number" && Number.isFinite(percent) && percent > 0
|
|
46
|
+
? percent
|
|
47
|
+
: DEFAULT_MIN_OFFER_PERCENT;
|
|
48
|
+
return Math.ceil(listedPrice * (pct / 100) * 100) / 100;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Whether `amount` is a legal offer on a listing priced at `listedPrice`.
|
|
52
|
+
*
|
|
53
|
+
* Both bounds matter and both are enforced server-side: at or above the listed
|
|
54
|
+
* price there is nothing to negotiate (the buyer should use Add to Cart), and
|
|
55
|
+
* below the floor the seller has said they don't want to hear it.
|
|
56
|
+
*/
|
|
57
|
+
export function isOfferAmountValid(amount, listedPrice, percent) {
|
|
58
|
+
return amount >= minOfferAmount(listedPrice, percent) && amount < listedPrice;
|
|
59
|
+
}
|
|
@@ -24,18 +24,18 @@ export declare const createOrderSchema: z.ZodObject<{
|
|
|
24
24
|
country: z.ZodDefault<z.ZodString>;
|
|
25
25
|
}, "strip", z.ZodTypeAny, {
|
|
26
26
|
country: string;
|
|
27
|
-
phone: string;
|
|
28
|
-
city: string;
|
|
29
27
|
fullName: string;
|
|
28
|
+
phone: string;
|
|
30
29
|
addressLine1: string;
|
|
30
|
+
city: string;
|
|
31
31
|
state: string;
|
|
32
32
|
pincode: string;
|
|
33
33
|
addressLine2?: string | undefined;
|
|
34
34
|
}, {
|
|
35
|
-
phone: string;
|
|
36
|
-
city: string;
|
|
37
35
|
fullName: string;
|
|
36
|
+
phone: string;
|
|
38
37
|
addressLine1: string;
|
|
38
|
+
city: string;
|
|
39
39
|
state: string;
|
|
40
40
|
pincode: string;
|
|
41
41
|
country?: string | undefined;
|
|
@@ -47,10 +47,10 @@ export declare const createOrderSchema: z.ZodObject<{
|
|
|
47
47
|
paymentMethod: "upi" | "razorpay" | "cod";
|
|
48
48
|
shippingAddress: {
|
|
49
49
|
country: string;
|
|
50
|
-
phone: string;
|
|
51
|
-
city: string;
|
|
52
50
|
fullName: string;
|
|
51
|
+
phone: string;
|
|
53
52
|
addressLine1: string;
|
|
53
|
+
city: string;
|
|
54
54
|
state: string;
|
|
55
55
|
pincode: string;
|
|
56
56
|
addressLine2?: string | undefined;
|
|
@@ -64,10 +64,10 @@ export declare const createOrderSchema: z.ZodObject<{
|
|
|
64
64
|
}, {
|
|
65
65
|
paymentMethod: "upi" | "razorpay" | "cod";
|
|
66
66
|
shippingAddress: {
|
|
67
|
-
phone: string;
|
|
68
|
-
city: string;
|
|
69
67
|
fullName: string;
|
|
68
|
+
phone: string;
|
|
70
69
|
addressLine1: string;
|
|
70
|
+
city: string;
|
|
71
71
|
state: string;
|
|
72
72
|
pincode: string;
|
|
73
73
|
country?: string | undefined;
|
|
@@ -35,9 +35,6 @@ export declare const productInputSchema: z.ZodObject<{
|
|
|
35
35
|
tags: string[];
|
|
36
36
|
features?: string[] | undefined;
|
|
37
37
|
description?: string | undefined;
|
|
38
|
-
seoTitle?: string | undefined;
|
|
39
|
-
seoDescription?: string | undefined;
|
|
40
|
-
seoKeywords?: string[] | undefined;
|
|
41
38
|
brandSlug?: string | undefined;
|
|
42
39
|
shippingInfo?: string | undefined;
|
|
43
40
|
returnPolicy?: string | undefined;
|
|
@@ -45,6 +42,9 @@ export declare const productInputSchema: z.ZodObject<{
|
|
|
45
42
|
insurance?: boolean | undefined;
|
|
46
43
|
insuranceCost?: number | undefined;
|
|
47
44
|
shippingPaidBy?: "seller" | "buyer" | undefined;
|
|
45
|
+
seoTitle?: string | undefined;
|
|
46
|
+
seoDescription?: string | undefined;
|
|
47
|
+
seoKeywords?: string[] | undefined;
|
|
48
48
|
allowOffers?: boolean | undefined;
|
|
49
49
|
minOfferPercent?: number | undefined;
|
|
50
50
|
}, {
|
|
@@ -55,9 +55,6 @@ export declare const productInputSchema: z.ZodObject<{
|
|
|
55
55
|
currency?: string | undefined;
|
|
56
56
|
features?: string[] | undefined;
|
|
57
57
|
description?: string | undefined;
|
|
58
|
-
seoTitle?: string | undefined;
|
|
59
|
-
seoDescription?: string | undefined;
|
|
60
|
-
seoKeywords?: string[] | undefined;
|
|
61
58
|
brandSlug?: string | undefined;
|
|
62
59
|
stockQuantity?: number | undefined;
|
|
63
60
|
availableQuantity?: number | undefined;
|
|
@@ -69,6 +66,9 @@ export declare const productInputSchema: z.ZodObject<{
|
|
|
69
66
|
insurance?: boolean | undefined;
|
|
70
67
|
insuranceCost?: number | undefined;
|
|
71
68
|
shippingPaidBy?: "seller" | "buyer" | undefined;
|
|
69
|
+
seoTitle?: string | undefined;
|
|
70
|
+
seoDescription?: string | undefined;
|
|
71
|
+
seoKeywords?: string[] | undefined;
|
|
72
72
|
allowOffers?: boolean | undefined;
|
|
73
73
|
minOfferPercent?: number | undefined;
|
|
74
74
|
}>;
|
|
@@ -100,11 +100,8 @@ export declare const productUpdateSchema: z.ZodObject<{
|
|
|
100
100
|
currency?: string | undefined;
|
|
101
101
|
title?: string | undefined;
|
|
102
102
|
features?: string[] | undefined;
|
|
103
|
-
category?: string | undefined;
|
|
104
103
|
description?: string | undefined;
|
|
105
|
-
|
|
106
|
-
seoDescription?: string | undefined;
|
|
107
|
-
seoKeywords?: string[] | undefined;
|
|
104
|
+
category?: string | undefined;
|
|
108
105
|
brandSlug?: string | undefined;
|
|
109
106
|
price?: number | undefined;
|
|
110
107
|
stockQuantity?: number | undefined;
|
|
@@ -118,17 +115,17 @@ export declare const productUpdateSchema: z.ZodObject<{
|
|
|
118
115
|
insurance?: boolean | undefined;
|
|
119
116
|
insuranceCost?: number | undefined;
|
|
120
117
|
shippingPaidBy?: "seller" | "buyer" | undefined;
|
|
118
|
+
seoTitle?: string | undefined;
|
|
119
|
+
seoDescription?: string | undefined;
|
|
120
|
+
seoKeywords?: string[] | undefined;
|
|
121
121
|
allowOffers?: boolean | undefined;
|
|
122
122
|
minOfferPercent?: number | undefined;
|
|
123
123
|
}, {
|
|
124
124
|
currency?: string | undefined;
|
|
125
125
|
title?: string | undefined;
|
|
126
126
|
features?: string[] | undefined;
|
|
127
|
-
category?: string | undefined;
|
|
128
127
|
description?: string | undefined;
|
|
129
|
-
|
|
130
|
-
seoDescription?: string | undefined;
|
|
131
|
-
seoKeywords?: string[] | undefined;
|
|
128
|
+
category?: string | undefined;
|
|
132
129
|
brandSlug?: string | undefined;
|
|
133
130
|
price?: number | undefined;
|
|
134
131
|
stockQuantity?: number | undefined;
|
|
@@ -142,6 +139,9 @@ export declare const productUpdateSchema: z.ZodObject<{
|
|
|
142
139
|
insurance?: boolean | undefined;
|
|
143
140
|
insuranceCost?: number | undefined;
|
|
144
141
|
shippingPaidBy?: "seller" | "buyer" | undefined;
|
|
142
|
+
seoTitle?: string | undefined;
|
|
143
|
+
seoDescription?: string | undefined;
|
|
144
|
+
seoKeywords?: string[] | undefined;
|
|
145
145
|
allowOffers?: boolean | undefined;
|
|
146
146
|
minOfferPercent?: number | undefined;
|
|
147
147
|
}>;
|
|
@@ -183,21 +183,18 @@ export declare const auctionInputSchema: z.ZodObject<{
|
|
|
183
183
|
currency: string;
|
|
184
184
|
title: string;
|
|
185
185
|
category: string;
|
|
186
|
-
listingType: "auction";
|
|
187
186
|
price: number;
|
|
188
187
|
stockQuantity: number;
|
|
189
188
|
availableQuantity: number;
|
|
190
189
|
mainImage: string;
|
|
191
190
|
images: string[];
|
|
192
191
|
tags: string[];
|
|
192
|
+
listingType: "auction";
|
|
193
193
|
auctionEndDate: string;
|
|
194
194
|
startingBid: number;
|
|
195
195
|
autoExtendable: boolean;
|
|
196
196
|
features?: string[] | undefined;
|
|
197
197
|
description?: string | undefined;
|
|
198
|
-
seoTitle?: string | undefined;
|
|
199
|
-
seoDescription?: string | undefined;
|
|
200
|
-
seoKeywords?: string[] | undefined;
|
|
201
198
|
brandSlug?: string | undefined;
|
|
202
199
|
shippingInfo?: string | undefined;
|
|
203
200
|
returnPolicy?: string | undefined;
|
|
@@ -210,22 +207,22 @@ export declare const auctionInputSchema: z.ZodObject<{
|
|
|
210
207
|
minBidIncrement?: number | undefined;
|
|
211
208
|
auctionExtensionMinutes?: number | undefined;
|
|
212
209
|
auctionShippingPaidBy?: "seller" | "winner" | undefined;
|
|
210
|
+
seoTitle?: string | undefined;
|
|
211
|
+
seoDescription?: string | undefined;
|
|
212
|
+
seoKeywords?: string[] | undefined;
|
|
213
213
|
allowOffers?: boolean | undefined;
|
|
214
214
|
minOfferPercent?: number | undefined;
|
|
215
215
|
}, {
|
|
216
216
|
title: string;
|
|
217
217
|
category: string;
|
|
218
|
-
listingType: "auction";
|
|
219
218
|
price: number;
|
|
220
219
|
mainImage: string;
|
|
220
|
+
listingType: "auction";
|
|
221
221
|
auctionEndDate: string;
|
|
222
222
|
startingBid: number;
|
|
223
223
|
currency?: string | undefined;
|
|
224
224
|
features?: string[] | undefined;
|
|
225
225
|
description?: string | undefined;
|
|
226
|
-
seoTitle?: string | undefined;
|
|
227
|
-
seoDescription?: string | undefined;
|
|
228
|
-
seoKeywords?: string[] | undefined;
|
|
229
226
|
brandSlug?: string | undefined;
|
|
230
227
|
stockQuantity?: number | undefined;
|
|
231
228
|
availableQuantity?: number | undefined;
|
|
@@ -243,6 +240,9 @@ export declare const auctionInputSchema: z.ZodObject<{
|
|
|
243
240
|
autoExtendable?: boolean | undefined;
|
|
244
241
|
auctionExtensionMinutes?: number | undefined;
|
|
245
242
|
auctionShippingPaidBy?: "seller" | "winner" | undefined;
|
|
243
|
+
seoTitle?: string | undefined;
|
|
244
|
+
seoDescription?: string | undefined;
|
|
245
|
+
seoKeywords?: string[] | undefined;
|
|
246
246
|
allowOffers?: boolean | undefined;
|
|
247
247
|
minOfferPercent?: number | undefined;
|
|
248
248
|
}>;
|
|
@@ -281,21 +281,18 @@ export declare const preOrderInputSchema: z.ZodObject<{
|
|
|
281
281
|
currency: string;
|
|
282
282
|
title: string;
|
|
283
283
|
category: string;
|
|
284
|
-
listingType: "pre-order";
|
|
285
284
|
price: number;
|
|
286
285
|
stockQuantity: number;
|
|
287
286
|
availableQuantity: number;
|
|
288
287
|
mainImage: string;
|
|
289
288
|
images: string[];
|
|
290
289
|
tags: string[];
|
|
290
|
+
listingType: "pre-order";
|
|
291
291
|
preOrderDeliveryDate: string;
|
|
292
292
|
preOrderProductionStatus: "upcoming" | "in_production" | "ready_to_ship";
|
|
293
293
|
preOrderCancellable: boolean;
|
|
294
294
|
features?: string[] | undefined;
|
|
295
295
|
description?: string | undefined;
|
|
296
|
-
seoTitle?: string | undefined;
|
|
297
|
-
seoDescription?: string | undefined;
|
|
298
|
-
seoKeywords?: string[] | undefined;
|
|
299
296
|
brandSlug?: string | undefined;
|
|
300
297
|
shippingInfo?: string | undefined;
|
|
301
298
|
returnPolicy?: string | undefined;
|
|
@@ -305,21 +302,21 @@ export declare const preOrderInputSchema: z.ZodObject<{
|
|
|
305
302
|
shippingPaidBy?: "seller" | "buyer" | undefined;
|
|
306
303
|
preOrderDepositPercent?: number | undefined;
|
|
307
304
|
preOrderMaxQuantity?: number | undefined;
|
|
305
|
+
seoTitle?: string | undefined;
|
|
306
|
+
seoDescription?: string | undefined;
|
|
307
|
+
seoKeywords?: string[] | undefined;
|
|
308
308
|
allowOffers?: boolean | undefined;
|
|
309
309
|
minOfferPercent?: number | undefined;
|
|
310
310
|
}, {
|
|
311
311
|
title: string;
|
|
312
312
|
category: string;
|
|
313
|
-
listingType: "pre-order";
|
|
314
313
|
price: number;
|
|
315
314
|
mainImage: string;
|
|
315
|
+
listingType: "pre-order";
|
|
316
316
|
preOrderDeliveryDate: string;
|
|
317
317
|
currency?: string | undefined;
|
|
318
318
|
features?: string[] | undefined;
|
|
319
319
|
description?: string | undefined;
|
|
320
|
-
seoTitle?: string | undefined;
|
|
321
|
-
seoDescription?: string | undefined;
|
|
322
|
-
seoKeywords?: string[] | undefined;
|
|
323
320
|
brandSlug?: string | undefined;
|
|
324
321
|
stockQuantity?: number | undefined;
|
|
325
322
|
availableQuantity?: number | undefined;
|
|
@@ -335,6 +332,9 @@ export declare const preOrderInputSchema: z.ZodObject<{
|
|
|
335
332
|
preOrderMaxQuantity?: number | undefined;
|
|
336
333
|
preOrderProductionStatus?: "upcoming" | "in_production" | "ready_to_ship" | undefined;
|
|
337
334
|
preOrderCancellable?: boolean | undefined;
|
|
335
|
+
seoTitle?: string | undefined;
|
|
336
|
+
seoDescription?: string | undefined;
|
|
337
|
+
seoKeywords?: string[] | undefined;
|
|
338
338
|
allowOffers?: boolean | undefined;
|
|
339
339
|
minOfferPercent?: number | undefined;
|
|
340
340
|
}>;
|
|
@@ -41,5 +41,11 @@ export function toProductItem(doc) {
|
|
|
41
41
|
// when listingType is missing) — same bug class as the Phase 1 routing
|
|
42
42
|
// fix, one hop further downstream in the related-items card link path.
|
|
43
43
|
listingType: doc.listingType ?? undefined,
|
|
44
|
+
// Same reasoning as `listingType` directly above, on the offers axis: the
|
|
45
|
+
// card grid renders a "Taking Offers" pill from this flag, so dropping it
|
|
46
|
+
// here made every related-item / grouped-listing card claim the seller
|
|
47
|
+
// doesn't negotiate — regardless of whether they do.
|
|
48
|
+
allowOffers: doc.allowOffers === true ? true : undefined,
|
|
49
|
+
minOfferPercent: typeof doc.minOfferPercent === "number" ? doc.minOfferPercent : undefined,
|
|
44
50
|
};
|
|
45
51
|
}
|
|
@@ -12,15 +12,15 @@ export declare const createReviewSchema: z.ZodObject<{
|
|
|
12
12
|
body: string;
|
|
13
13
|
storeId: string;
|
|
14
14
|
images: string[];
|
|
15
|
-
rating: number;
|
|
16
15
|
productId: string;
|
|
16
|
+
rating: number;
|
|
17
17
|
orderId?: string | undefined;
|
|
18
18
|
}, {
|
|
19
19
|
title: string;
|
|
20
20
|
body: string;
|
|
21
21
|
storeId: string;
|
|
22
|
-
rating: number;
|
|
23
22
|
productId: string;
|
|
23
|
+
rating: number;
|
|
24
24
|
orderId?: string | undefined;
|
|
25
25
|
images?: string[] | undefined;
|
|
26
26
|
}>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buyer-facing projections of `siteSettings.commissions` / `siteSettings.emi`.
|
|
3
|
+
*
|
|
4
|
+
* The commissions block holds 25 fields, most of which describe internal
|
|
5
|
+
* economics — `gatewayFeePercent`, `sellerShippingFixed`,
|
|
6
|
+
* `platformShippingPercent`, `payoutHoldDays`, `minPayoutAmount`,
|
|
7
|
+
* `autoPayoutWindowDays`, and the listing/featured/promoted slot fees. Ten of
|
|
8
|
+
* them price something the buyer actually chooses, and only those ten belong
|
|
9
|
+
* in a browser.
|
|
10
|
+
*
|
|
11
|
+
* Why a projection rather than a type: the cart and checkout client props were
|
|
12
|
+
* ALREADY typed narrowly (`StoreAddonsRates`, `CodHandlingFeeRates & …`), but
|
|
13
|
+
* the SSR pages passed `settings.commissions` whole. TypeScript's structural
|
|
14
|
+
* typing accepts a wider object without complaint, so every one of the 25
|
|
15
|
+
* fields was serialised into the page's HTML regardless of what the prop type
|
|
16
|
+
* said. A type alone cannot strip fields at runtime — this function can.
|
|
17
|
+
*
|
|
18
|
+
* Use this for BOTH the cart/checkout SSR props and any future public API that
|
|
19
|
+
* needs fee data, so there is exactly one definition of "buyer-facing fee".
|
|
20
|
+
*/
|
|
21
|
+
import type { SiteSettingsDocument } from "../../../../features/admin/schemas/firestore";
|
|
22
|
+
import type { EmiSettings } from "../emi/schedule";
|
|
23
|
+
/**
|
|
24
|
+
* = `StoreAddonsRates` ∪ `CodHandlingFeeRates` ∪ `{ codDepositPercent }` —
|
|
25
|
+
* the union of what `StoreAddonsPicker` and the checkout COD block read.
|
|
26
|
+
* Every field is optional because older `siteSettings` documents predate them
|
|
27
|
+
* and each `compute*Fee` helper carries its own default.
|
|
28
|
+
*/
|
|
29
|
+
export interface BuyerFacingFees {
|
|
30
|
+
whatsappNotifyFeeEnabled?: boolean;
|
|
31
|
+
whatsappNotifyFee?: number;
|
|
32
|
+
giftWrapFeeEnabled?: boolean;
|
|
33
|
+
giftWrapFee?: number;
|
|
34
|
+
shipmentProtectionFeeEnabled?: boolean;
|
|
35
|
+
shipmentProtectionFeePercent?: number;
|
|
36
|
+
shipmentProtectionFeeMin?: number;
|
|
37
|
+
codHandlingFeeMin?: number;
|
|
38
|
+
codHandlingFeePercent?: number;
|
|
39
|
+
codDepositPercent?: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Withheld on purpose (15 of 25): platformFeePercent, gstPercent,
|
|
43
|
+
* minimumTransactionFee, platformFeeMax, gatewayFeePercent,
|
|
44
|
+
* sellerShippingFixed, platformShippingPercent, platformShippingFixedMin,
|
|
45
|
+
* autoPayoutWindowDays, payoutHoldDays, minPayoutAmount, auctionListingFee,
|
|
46
|
+
* preOrderListingFee, featuredSlotFee, promotedSlotFee.
|
|
47
|
+
*
|
|
48
|
+
* The buyer still SEES the platform fee and GST — as computed amounts in the
|
|
49
|
+
* server pricing preview (`CartPriceBreakdownData`), never as the rates that
|
|
50
|
+
* produced them.
|
|
51
|
+
*/
|
|
52
|
+
export declare function toBuyerFacingFees(commissions: SiteSettingsDocument["commissions"] | null | undefined): BuyerFacingFees | null;
|
|
53
|
+
/**
|
|
54
|
+
* EMI settings minus `surchargeSellerSharePercent` — how the surcharge is
|
|
55
|
+
* split between platform and seller is a commercial term, not something the
|
|
56
|
+
* buyer's browser needs. Pair with `computeBuyerEmiQuote`, which is typed to
|
|
57
|
+
* accept exactly this shape.
|
|
58
|
+
*/
|
|
59
|
+
export type BuyerEmiSettings = Omit<EmiSettings, "surchargeSellerSharePercent">;
|
|
60
|
+
export declare function toBuyerEmiSettings(emi: SiteSettingsDocument["emi"] | null | undefined): BuyerEmiSettings | null;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Withheld on purpose (15 of 25): platformFeePercent, gstPercent,
|
|
3
|
+
* minimumTransactionFee, platformFeeMax, gatewayFeePercent,
|
|
4
|
+
* sellerShippingFixed, platformShippingPercent, platformShippingFixedMin,
|
|
5
|
+
* autoPayoutWindowDays, payoutHoldDays, minPayoutAmount, auctionListingFee,
|
|
6
|
+
* preOrderListingFee, featuredSlotFee, promotedSlotFee.
|
|
7
|
+
*
|
|
8
|
+
* The buyer still SEES the platform fee and GST — as computed amounts in the
|
|
9
|
+
* server pricing preview (`CartPriceBreakdownData`), never as the rates that
|
|
10
|
+
* produced them.
|
|
11
|
+
*/
|
|
12
|
+
export function toBuyerFacingFees(commissions) {
|
|
13
|
+
if (!commissions)
|
|
14
|
+
return null;
|
|
15
|
+
return {
|
|
16
|
+
whatsappNotifyFeeEnabled: commissions.whatsappNotifyFeeEnabled,
|
|
17
|
+
whatsappNotifyFee: commissions.whatsappNotifyFee,
|
|
18
|
+
giftWrapFeeEnabled: commissions.giftWrapFeeEnabled,
|
|
19
|
+
giftWrapFee: commissions.giftWrapFee,
|
|
20
|
+
shipmentProtectionFeeEnabled: commissions.shipmentProtectionFeeEnabled,
|
|
21
|
+
shipmentProtectionFeePercent: commissions.shipmentProtectionFeePercent,
|
|
22
|
+
shipmentProtectionFeeMin: commissions.shipmentProtectionFeeMin,
|
|
23
|
+
codHandlingFeeMin: commissions.codHandlingFeeMin,
|
|
24
|
+
codHandlingFeePercent: commissions.codHandlingFeePercent,
|
|
25
|
+
codDepositPercent: commissions.codDepositPercent,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function toBuyerEmiSettings(emi) {
|
|
29
|
+
if (!emi)
|
|
30
|
+
return null;
|
|
31
|
+
return {
|
|
32
|
+
enabled: emi.enabled,
|
|
33
|
+
minOrderValue: emi.minOrderValue,
|
|
34
|
+
tenureOptions: emi.tenureOptions,
|
|
35
|
+
tokenPercent: emi.tokenPercent,
|
|
36
|
+
billingDay: emi.billingDay,
|
|
37
|
+
surchargePercentPerMonth: emi.surchargePercentPerMonth,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The public shape of site settings — the ONLY fields
|
|
3
|
+
* `GET /api/site-settings` may return to an unauthenticated caller.
|
|
4
|
+
*
|
|
5
|
+
* This type lives under `_internal/shared/` rather than beside the server
|
|
6
|
+
* adapter because client code consumes it (`useSiteSettings<PublicSiteSettings>()`),
|
|
7
|
+
* and client files must not import from `_internal/server`.
|
|
8
|
+
*
|
|
9
|
+
* Additive by explicit triage only: see `PUBLIC_SITE_SETTINGS_FIELDS` /
|
|
10
|
+
* `PRIVATE_SITE_SETTINGS_FIELDS` in
|
|
11
|
+
* `../../../server/features/site-settings/adapters.ts`, enforced by
|
|
12
|
+
* `scripts/audit-public-projection-parity.mjs`. Adding a field here without a
|
|
13
|
+
* proven client reader is how the endpoint drifted in the first place.
|
|
14
|
+
*/
|
|
15
|
+
import type { NotificationChannelConfig, SiteSettingsDocument } from "../../../../features/admin/schemas/firestore";
|
|
16
|
+
import type { MediaVideoWatermark } from "../../../../features/media/MediaVideo";
|
|
17
|
+
export interface PublicSiteSettings {
|
|
18
|
+
/** Support channels shown to buyers. Deliberately NOT the full `contact` — `address` and `upiVpa` stay server-side. */
|
|
19
|
+
contact: {
|
|
20
|
+
email: string;
|
|
21
|
+
phone: string;
|
|
22
|
+
whatsappNumber: string;
|
|
23
|
+
};
|
|
24
|
+
/** Deliberately NOT the full `payment` block — only the checkout OTP threshold has a client reader. */
|
|
25
|
+
payment: {
|
|
26
|
+
otpCheckoutThreshold?: number;
|
|
27
|
+
};
|
|
28
|
+
/** Deliberately NOT the full `featureFlags` — `adminCheckoutBypass` must never be advertised publicly. */
|
|
29
|
+
featureFlags: {
|
|
30
|
+
listingTypes?: SiteSettingsDocument["featureFlags"]["listingTypes"];
|
|
31
|
+
};
|
|
32
|
+
notificationChannels?: NotificationChannelConfig;
|
|
33
|
+
announcementBar?: SiteSettingsDocument["announcementBar"];
|
|
34
|
+
navConfig?: SiteSettingsDocument["navConfig"];
|
|
35
|
+
actionConfig?: SiteSettingsDocument["actionConfig"];
|
|
36
|
+
background?: SiteSettingsDocument["background"];
|
|
37
|
+
watermark?: SiteSettingsDocument["watermark"];
|
|
38
|
+
/** Derived, not a stored field — the resolved marker → wordmark → text chain. */
|
|
39
|
+
effectiveWatermark?: MediaVideoWatermark;
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracked-field diffing and capped append for entity status history.
|
|
3
|
+
*
|
|
4
|
+
* These are deliberately plain functions rather than a `BaseRepository`
|
|
5
|
+
* override: the repository method that owns a transition already knows the
|
|
6
|
+
* actor and the trigger, and a generic hook would have to guess both. The
|
|
7
|
+
* repository calls `buildHistoryEntry` + `appendHistoryEntry` inside its own
|
|
8
|
+
* write primitive — which is the point, since that is what keeps the 32
|
|
9
|
+
* call sites above it unchanged.
|
|
10
|
+
*/
|
|
11
|
+
import type { FirestoreDocument } from "../../../schemas/types";
|
|
12
|
+
import { type AppendHistoryResult, type FieldChange, type HistoryActor, type StatusChangeEntry } from "./types";
|
|
13
|
+
/**
|
|
14
|
+
* Diff only the fields an entity declares as tracked.
|
|
15
|
+
*
|
|
16
|
+
* The tracked list is explicit per entity, never "every field": a whole-
|
|
17
|
+
* document diff would record the `updatedAt` bump on every single write and
|
|
18
|
+
* exhaust the 50-entry cap within days, burying the transitions anyone
|
|
19
|
+
* actually wants to read.
|
|
20
|
+
*
|
|
21
|
+
* A field absent from `patch` is untouched — this diffs the patch against
|
|
22
|
+
* the current document, not two full documents.
|
|
23
|
+
*/
|
|
24
|
+
export declare function diffTrackedFields(current: FirestoreDocument | undefined, patch: FirestoreDocument, tracked: readonly string[]): Record<string, FieldChange>;
|
|
25
|
+
export interface BuildHistoryEntryInput {
|
|
26
|
+
actor: HistoryActor;
|
|
27
|
+
trigger: string;
|
|
28
|
+
changes: Record<string, FieldChange>;
|
|
29
|
+
reason?: string;
|
|
30
|
+
note?: string;
|
|
31
|
+
/** Injectable for deterministic tests and seed fixtures. */
|
|
32
|
+
now?: Date;
|
|
33
|
+
}
|
|
34
|
+
export declare function buildHistoryEntry(input: BuildHistoryEntryInput): StatusChangeEntry;
|
|
35
|
+
/**
|
|
36
|
+
* Append with a FIFO cap. Returns the new array plus the running count of
|
|
37
|
+
* entries dropped over the document's lifetime, so the caller can persist it
|
|
38
|
+
* and the UI can be honest about what it is not showing.
|
|
39
|
+
*/
|
|
40
|
+
export declare function appendHistoryEntry(existing: readonly StatusChangeEntry[] | undefined, entry: StatusChangeEntry, previousTruncatedCount?: number, cap?: number): AppendHistoryResult;
|
|
41
|
+
/**
|
|
42
|
+
* The whole flow in one call: diff, and return the patch additions needed to
|
|
43
|
+
* record it. Returns `null` when no tracked field changed — the caller then
|
|
44
|
+
* writes its patch unchanged, so an untracked update never grows the array.
|
|
45
|
+
*/
|
|
46
|
+
export declare function withHistory<TPatch extends FirestoreDocument>(current: FirestoreDocument | undefined, patch: TPatch, opts: {
|
|
47
|
+
tracked: readonly string[];
|
|
48
|
+
actor: HistoryActor;
|
|
49
|
+
trigger: string;
|
|
50
|
+
reason?: string;
|
|
51
|
+
note?: string;
|
|
52
|
+
/**
|
|
53
|
+
* Changes the field diff cannot express, merged over the diffed ones.
|
|
54
|
+
*
|
|
55
|
+
* Needed for append-to-array events: a refund posted to `refunds[]`
|
|
56
|
+
* shows up in a raw diff as "an array of 1 became an array of 2", which
|
|
57
|
+
* is true and useless. The caller instead contributes
|
|
58
|
+
* `{ refund: { from: null, to: { amount, type, reason } } }` — the thing
|
|
59
|
+
* a reader actually wants on the timeline.
|
|
60
|
+
*/
|
|
61
|
+
extraChanges?: Record<string, FieldChange>;
|
|
62
|
+
/**
|
|
63
|
+
* This entity's PII field names — pass the same list the repository hands
|
|
64
|
+
* to `encryptPiiFields` (`ORDER_PII_FIELDS`, `OFFER_PII_FIELDS`, …).
|
|
65
|
+
*
|
|
66
|
+
* 🛑 Not optional in spirit. `encryptPiiFields` is a FLAT top-level loop:
|
|
67
|
+
* it reads `doc[field]`, skips anything that is not a string, and never
|
|
68
|
+
* descends into arrays or nested objects. `statusHistory` is an array of
|
|
69
|
+
* objects, so a PII value that reaches `changes` is written to Firestore
|
|
70
|
+
* **in plaintext** and `mapDoc`'s decrypt never touches it on the way
|
|
71
|
+
* back out — a leak with no error and no visible symptom.
|
|
72
|
+
*
|
|
73
|
+
* Scrubbing here rather than at each call site is deliberate: a
|
|
74
|
+
* convention that says "don't put PII in history" is one forgetful
|
|
75
|
+
* adopter away from that leak, and 9 more entities adopt this primitive.
|
|
76
|
+
*
|
|
77
|
+
* SCOPE: this scrubs `changes` structurally, at any depth — a key whose
|
|
78
|
+
* NAME is PII is dropped. It cannot scrub `note`, which is free text the
|
|
79
|
+
* user themselves authored (a seller's counter-offer note). The rule
|
|
80
|
+
* there is a call-site one: pass the author's own text, never an identity
|
|
81
|
+
* field lifted off the document.
|
|
82
|
+
*/
|
|
83
|
+
piiFields?: readonly string[];
|
|
84
|
+
historyField?: string;
|
|
85
|
+
truncatedField?: string;
|
|
86
|
+
now?: Date;
|
|
87
|
+
cap?: number;
|
|
88
|
+
}): (TPatch & FirestoreDocument) | null;
|