@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,153 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
4
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
5
|
+
*/
|
|
6
|
+
export declare const payoutMethodFormSchema: z.ZodEffects<z.ZodObject<{
|
|
7
|
+
type: z.ZodEnum<["upi", "bank", "card", "other"]>;
|
|
8
|
+
label: z.ZodString;
|
|
9
|
+
upiVpa: z.ZodOptional<z.ZodString>;
|
|
10
|
+
accountHolderName: z.ZodOptional<z.ZodString>;
|
|
11
|
+
accountNumber: z.ZodOptional<z.ZodString>;
|
|
12
|
+
ifscCode: z.ZodOptional<z.ZodString>;
|
|
13
|
+
bankName: z.ZodOptional<z.ZodString>;
|
|
14
|
+
isDefault: z.ZodBoolean;
|
|
15
|
+
isActive: z.ZodBoolean;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
type: "card" | "other" | "upi" | "bank";
|
|
18
|
+
label: string;
|
|
19
|
+
isDefault: boolean;
|
|
20
|
+
isActive: boolean;
|
|
21
|
+
accountHolderName?: string | undefined;
|
|
22
|
+
ifscCode?: string | undefined;
|
|
23
|
+
bankName?: string | undefined;
|
|
24
|
+
accountNumber?: string | undefined;
|
|
25
|
+
upiVpa?: string | undefined;
|
|
26
|
+
}, {
|
|
27
|
+
type: "card" | "other" | "upi" | "bank";
|
|
28
|
+
label: string;
|
|
29
|
+
isDefault: boolean;
|
|
30
|
+
isActive: boolean;
|
|
31
|
+
accountHolderName?: string | undefined;
|
|
32
|
+
ifscCode?: string | undefined;
|
|
33
|
+
bankName?: string | undefined;
|
|
34
|
+
accountNumber?: string | undefined;
|
|
35
|
+
upiVpa?: string | undefined;
|
|
36
|
+
}>, {
|
|
37
|
+
type: "card" | "other" | "upi" | "bank";
|
|
38
|
+
label: string;
|
|
39
|
+
isDefault: boolean;
|
|
40
|
+
isActive: boolean;
|
|
41
|
+
accountHolderName?: string | undefined;
|
|
42
|
+
ifscCode?: string | undefined;
|
|
43
|
+
bankName?: string | undefined;
|
|
44
|
+
accountNumber?: string | undefined;
|
|
45
|
+
upiVpa?: string | undefined;
|
|
46
|
+
}, {
|
|
47
|
+
type: "card" | "other" | "upi" | "bank";
|
|
48
|
+
label: string;
|
|
49
|
+
isDefault: boolean;
|
|
50
|
+
isActive: boolean;
|
|
51
|
+
accountHolderName?: string | undefined;
|
|
52
|
+
ifscCode?: string | undefined;
|
|
53
|
+
bankName?: string | undefined;
|
|
54
|
+
accountNumber?: string | undefined;
|
|
55
|
+
upiVpa?: string | undefined;
|
|
56
|
+
}>;
|
|
57
|
+
export type PayoutMethodFormValues = z.infer<typeof payoutMethodFormSchema>;
|
|
58
|
+
/**
|
|
59
|
+
* Create contract. `sellerId`/`storeId` are absent on purpose — the route sets
|
|
60
|
+
* both from the session, so a caller cannot file a payout method against
|
|
61
|
+
* another seller by adding fields to the body.
|
|
62
|
+
*/
|
|
63
|
+
export declare const payoutMethodCreateSchema: z.ZodEffects<z.ZodObject<{
|
|
64
|
+
type: z.ZodEnum<["upi", "bank", "card", "other"]>;
|
|
65
|
+
label: z.ZodString;
|
|
66
|
+
upiVpa: z.ZodOptional<z.ZodString>;
|
|
67
|
+
accountHolderName: z.ZodOptional<z.ZodString>;
|
|
68
|
+
accountNumber: z.ZodOptional<z.ZodString>;
|
|
69
|
+
ifscCode: z.ZodOptional<z.ZodString>;
|
|
70
|
+
bankName: z.ZodOptional<z.ZodString>;
|
|
71
|
+
isDefault: z.ZodBoolean;
|
|
72
|
+
isActive: z.ZodBoolean;
|
|
73
|
+
}, "strip", z.ZodTypeAny, {
|
|
74
|
+
type: "card" | "other" | "upi" | "bank";
|
|
75
|
+
label: string;
|
|
76
|
+
isDefault: boolean;
|
|
77
|
+
isActive: boolean;
|
|
78
|
+
accountHolderName?: string | undefined;
|
|
79
|
+
ifscCode?: string | undefined;
|
|
80
|
+
bankName?: string | undefined;
|
|
81
|
+
accountNumber?: string | undefined;
|
|
82
|
+
upiVpa?: string | undefined;
|
|
83
|
+
}, {
|
|
84
|
+
type: "card" | "other" | "upi" | "bank";
|
|
85
|
+
label: string;
|
|
86
|
+
isDefault: boolean;
|
|
87
|
+
isActive: boolean;
|
|
88
|
+
accountHolderName?: string | undefined;
|
|
89
|
+
ifscCode?: string | undefined;
|
|
90
|
+
bankName?: string | undefined;
|
|
91
|
+
accountNumber?: string | undefined;
|
|
92
|
+
upiVpa?: string | undefined;
|
|
93
|
+
}>, {
|
|
94
|
+
type: "card" | "other" | "upi" | "bank";
|
|
95
|
+
label: string;
|
|
96
|
+
isDefault: boolean;
|
|
97
|
+
isActive: boolean;
|
|
98
|
+
accountHolderName?: string | undefined;
|
|
99
|
+
ifscCode?: string | undefined;
|
|
100
|
+
bankName?: string | undefined;
|
|
101
|
+
accountNumber?: string | undefined;
|
|
102
|
+
upiVpa?: string | undefined;
|
|
103
|
+
}, {
|
|
104
|
+
type: "card" | "other" | "upi" | "bank";
|
|
105
|
+
label: string;
|
|
106
|
+
isDefault: boolean;
|
|
107
|
+
isActive: boolean;
|
|
108
|
+
accountHolderName?: string | undefined;
|
|
109
|
+
ifscCode?: string | undefined;
|
|
110
|
+
bankName?: string | undefined;
|
|
111
|
+
accountNumber?: string | undefined;
|
|
112
|
+
upiVpa?: string | undefined;
|
|
113
|
+
}>;
|
|
114
|
+
/**
|
|
115
|
+
* Update contract.
|
|
116
|
+
*
|
|
117
|
+
* The per-type rules deliberately do NOT apply here: a PATCH may carry a
|
|
118
|
+
* single field (`isDefault`, say) and requiring the whole bank block on every
|
|
119
|
+
* partial update would make toggling the default impossible. The bounds still
|
|
120
|
+
* apply to whatever IS sent, and the create path is where completeness is
|
|
121
|
+
* enforced.
|
|
122
|
+
*/
|
|
123
|
+
export declare const payoutMethodUpdateSchema: z.ZodObject<{
|
|
124
|
+
type: z.ZodOptional<z.ZodEnum<["upi", "bank", "card", "other"]>>;
|
|
125
|
+
label: z.ZodOptional<z.ZodString>;
|
|
126
|
+
upiVpa: z.ZodOptional<z.ZodString>;
|
|
127
|
+
accountHolderName: z.ZodOptional<z.ZodString>;
|
|
128
|
+
accountNumber: z.ZodOptional<z.ZodString>;
|
|
129
|
+
ifscCode: z.ZodOptional<z.ZodString>;
|
|
130
|
+
bankName: z.ZodOptional<z.ZodString>;
|
|
131
|
+
isDefault: z.ZodOptional<z.ZodBoolean>;
|
|
132
|
+
isActive: z.ZodOptional<z.ZodBoolean>;
|
|
133
|
+
}, "strict", z.ZodTypeAny, {
|
|
134
|
+
type?: "card" | "other" | "upi" | "bank" | undefined;
|
|
135
|
+
label?: string | undefined;
|
|
136
|
+
isDefault?: boolean | undefined;
|
|
137
|
+
accountHolderName?: string | undefined;
|
|
138
|
+
ifscCode?: string | undefined;
|
|
139
|
+
bankName?: string | undefined;
|
|
140
|
+
isActive?: boolean | undefined;
|
|
141
|
+
accountNumber?: string | undefined;
|
|
142
|
+
upiVpa?: string | undefined;
|
|
143
|
+
}, {
|
|
144
|
+
type?: "card" | "other" | "upi" | "bank" | undefined;
|
|
145
|
+
label?: string | undefined;
|
|
146
|
+
isDefault?: boolean | undefined;
|
|
147
|
+
accountHolderName?: string | undefined;
|
|
148
|
+
ifscCode?: string | undefined;
|
|
149
|
+
bankName?: string | undefined;
|
|
150
|
+
isActive?: boolean | undefined;
|
|
151
|
+
accountNumber?: string | undefined;
|
|
152
|
+
upiVpa?: string | undefined;
|
|
153
|
+
}>;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: A seller's payout method is where their money goes, and it was
|
|
3
|
+
* validated at ZERO layers. Measured 2026-08-24:
|
|
4
|
+
* · `store/payout-methods/new` — `accountNumber` and `ifscCode` are
|
|
5
|
+
* bare <Input>s with no `required` and no pattern; `onSave` has no
|
|
6
|
+
* validation at all and posts `form as Record<string, unknown>`.
|
|
7
|
+
* Both default to `""`, so an empty bank payout method saved cleanly.
|
|
8
|
+
* · `.../[id]/edit` — `onSave` has no validation either, and does not
|
|
9
|
+
* even render the account-number/IFSC inputs.
|
|
10
|
+
* · `POST /api/store/payout-methods` — `parseJsonBody` then `...body`
|
|
11
|
+
* spread into `.create()`. No Zod.
|
|
12
|
+
* · `PATCH .../[id]` — the raw body passed straight to `.update()`.
|
|
13
|
+
* No Zod, no field filtering.
|
|
14
|
+
* A payout method with a blank account number is not a validation nicety;
|
|
15
|
+
* it is a payout that cannot be made, discovered at payout time.
|
|
16
|
+
* WHAT: One schema for the pages AND the routes.
|
|
17
|
+
*
|
|
18
|
+
* ## The rules are per TYPE, which is why this needs a superRefine
|
|
19
|
+
*
|
|
20
|
+
* A UPI method needs a VPA and no bank fields; a bank method needs an account
|
|
21
|
+
* number, an IFSC and a holder name and no VPA. Per-field `.min(1)` cannot
|
|
22
|
+
* express that — it would make every field mandatory for every type.
|
|
23
|
+
*
|
|
24
|
+
* The IFSC and UPI patterns are the ones already used by
|
|
25
|
+
* `SellerPayoutSettingsView` (`^[A-Z]{4}0[A-Z0-9]{6}$` and the VPA shape), not
|
|
26
|
+
* a second pair invented here — two regexes for one format is how they come to
|
|
27
|
+
* disagree about what a valid IFSC is.
|
|
28
|
+
*
|
|
29
|
+
* EXPORTS:
|
|
30
|
+
* payoutMethodFormSchema, payoutMethodCreateSchema,
|
|
31
|
+
* payoutMethodUpdateSchema, type PayoutMethodFormValues
|
|
32
|
+
*
|
|
33
|
+
* @tag domain:store-extensions
|
|
34
|
+
* @tag layer:schema
|
|
35
|
+
* @tag pattern:none
|
|
36
|
+
* @tag access:isomorphic
|
|
37
|
+
* @tag consumers:store/payout-methods pages,/api/store/payout-methods
|
|
38
|
+
* @tag sideEffects:none
|
|
39
|
+
*/
|
|
40
|
+
import { z } from "zod";
|
|
41
|
+
import { annotate } from "../../shell/field-ui-meta";
|
|
42
|
+
/** Same pattern `SellerPayoutSettingsView` enforces. */
|
|
43
|
+
const IFSC_RE = /^[A-Z]{4}0[A-Z0-9]{6}$/;
|
|
44
|
+
/** Same pattern `SellerPayoutSettingsView` enforces. */
|
|
45
|
+
const UPI_VPA_RE = /^[\w.\-_]{2,256}@[a-zA-Z]{2,64}$/;
|
|
46
|
+
/**
|
|
47
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
48
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
49
|
+
*/
|
|
50
|
+
export const payoutMethodFormSchema = z
|
|
51
|
+
.object({
|
|
52
|
+
type: annotate(z.enum(["upi", "bank", "card", "other"]), {
|
|
53
|
+
section: "method", sectionLabel: "Payout Method", sectionRequired: true,
|
|
54
|
+
quick: true, order: 1, row: "pair",
|
|
55
|
+
}),
|
|
56
|
+
label: annotate(z.string().min(1, "Give this method a name you'll recognise.").max(80), {
|
|
57
|
+
section: "method", quick: true, order: 2, row: "pair",
|
|
58
|
+
}),
|
|
59
|
+
upiVpa: annotate(z.string().max(256).optional(), {
|
|
60
|
+
section: "method", order: 3, row: "full",
|
|
61
|
+
help: "For UPI methods, e.g. name@bank.",
|
|
62
|
+
}),
|
|
63
|
+
accountHolderName: annotate(z.string().max(120).optional(), {
|
|
64
|
+
section: "bank", sectionLabel: "Bank Account", order: 1, row: "full",
|
|
65
|
+
}),
|
|
66
|
+
accountNumber: annotate(z.string().max(34).optional(), {
|
|
67
|
+
section: "bank", order: 2, row: "pair",
|
|
68
|
+
}),
|
|
69
|
+
ifscCode: annotate(z.string().max(11).optional(), {
|
|
70
|
+
section: "bank", order: 3, row: "pair",
|
|
71
|
+
}),
|
|
72
|
+
bankName: annotate(z.string().max(120).optional(), {
|
|
73
|
+
section: "bank", order: 4, row: "pair",
|
|
74
|
+
}),
|
|
75
|
+
isDefault: annotate(z.boolean(), {
|
|
76
|
+
section: "visibility", sectionLabel: "Visibility", order: 1, row: "quarter",
|
|
77
|
+
}),
|
|
78
|
+
isActive: annotate(z.boolean(), {
|
|
79
|
+
section: "visibility", order: 2, row: "quarter",
|
|
80
|
+
}),
|
|
81
|
+
})
|
|
82
|
+
.superRefine((v, ctx) => {
|
|
83
|
+
const issue = (path, message) => ctx.addIssue({ code: z.ZodIssueCode.custom, path: [path], message });
|
|
84
|
+
/**
|
|
85
|
+
* "Required, and if present the right shape" — the same two-part check
|
|
86
|
+
* every one of these fields needs. One helper rather than a required
|
|
87
|
+
* branch plus a format branch per field, which is what turned this into
|
|
88
|
+
* an unreadable if/else chain.
|
|
89
|
+
*/
|
|
90
|
+
const require = (path, raw, missing, format) => {
|
|
91
|
+
const value = raw?.trim() ?? "";
|
|
92
|
+
if (!value)
|
|
93
|
+
return issue(path, missing);
|
|
94
|
+
if (!format)
|
|
95
|
+
return;
|
|
96
|
+
const candidate = format.normalise ? format.normalise(value) : value;
|
|
97
|
+
if (!format.re.test(candidate))
|
|
98
|
+
issue(path, format.message);
|
|
99
|
+
};
|
|
100
|
+
// Per-type rules by lookup, not by branching. A new payout type adds an
|
|
101
|
+
// entry here rather than another arm of a chain.
|
|
102
|
+
const RULES = {
|
|
103
|
+
upi: () => require("upiVpa", v.upiVpa, "A UPI ID is required for a UPI payout method.", {
|
|
104
|
+
re: UPI_VPA_RE,
|
|
105
|
+
message: "Please enter a valid UPI ID, e.g. name@bank.",
|
|
106
|
+
}),
|
|
107
|
+
// These four are what make a payout actually possible. Every one of them
|
|
108
|
+
// could previously be left blank and saved.
|
|
109
|
+
bank: () => {
|
|
110
|
+
require("accountHolderName", v.accountHolderName, "The account holder's name is required.");
|
|
111
|
+
require("accountNumber", v.accountNumber, "An account number is required.", {
|
|
112
|
+
re: /^\d{6,18}$/,
|
|
113
|
+
message: "An account number is 6–18 digits.",
|
|
114
|
+
});
|
|
115
|
+
require("ifscCode", v.ifscCode, "An IFSC code is required.", {
|
|
116
|
+
re: IFSC_RE,
|
|
117
|
+
message: "Please enter a valid IFSC code, e.g. HDFC0001234.",
|
|
118
|
+
normalise: (x) => x.toUpperCase(),
|
|
119
|
+
});
|
|
120
|
+
require("bankName", v.bankName, "The bank name is required.");
|
|
121
|
+
},
|
|
122
|
+
// `card` and `other` carry no extra requirements today — the label is
|
|
123
|
+
// enough to identify them, and inventing rules for them would reject
|
|
124
|
+
// methods sellers can legitimately record.
|
|
125
|
+
};
|
|
126
|
+
RULES[v.type]?.();
|
|
127
|
+
});
|
|
128
|
+
/**
|
|
129
|
+
* Create contract. `sellerId`/`storeId` are absent on purpose — the route sets
|
|
130
|
+
* both from the session, so a caller cannot file a payout method against
|
|
131
|
+
* another seller by adding fields to the body.
|
|
132
|
+
*/
|
|
133
|
+
export const payoutMethodCreateSchema = payoutMethodFormSchema;
|
|
134
|
+
/**
|
|
135
|
+
* Update contract.
|
|
136
|
+
*
|
|
137
|
+
* The per-type rules deliberately do NOT apply here: a PATCH may carry a
|
|
138
|
+
* single field (`isDefault`, say) and requiring the whole bank block on every
|
|
139
|
+
* partial update would make toggling the default impossible. The bounds still
|
|
140
|
+
* apply to whatever IS sent, and the create path is where completeness is
|
|
141
|
+
* enforced.
|
|
142
|
+
*/
|
|
143
|
+
export const payoutMethodUpdateSchema = z
|
|
144
|
+
.object({
|
|
145
|
+
type: z.enum(["upi", "bank", "card", "other"]).optional(),
|
|
146
|
+
label: z.string().min(1).max(80).optional(),
|
|
147
|
+
upiVpa: z.string().max(256).regex(UPI_VPA_RE, "Please enter a valid UPI ID.").optional(),
|
|
148
|
+
accountHolderName: z.string().max(120).optional(),
|
|
149
|
+
accountNumber: z.string().regex(/^\d{6,18}$/, "An account number is 6–18 digits.").optional(),
|
|
150
|
+
ifscCode: z.string().regex(IFSC_RE, "Please enter a valid IFSC code.").optional(),
|
|
151
|
+
bankName: z.string().max(120).optional(),
|
|
152
|
+
isDefault: z.boolean().optional(),
|
|
153
|
+
isActive: z.boolean().optional(),
|
|
154
|
+
})
|
|
155
|
+
.strict();
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
4
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
5
|
+
*/
|
|
6
|
+
export declare const reportCreateSchema: z.ZodObject<{
|
|
7
|
+
entityType: z.ZodEnum<[import("./firestore").ReportEntityType, ...import("./firestore").ReportEntityType[]]>;
|
|
8
|
+
entityId: z.ZodString;
|
|
9
|
+
reason: z.ZodEnum<[import("./firestore").ReportReason, ...import("./firestore").ReportReason[]]>;
|
|
10
|
+
detail: z.ZodString;
|
|
11
|
+
evidenceUrls: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
12
|
+
}, "strict", z.ZodTypeAny, {
|
|
13
|
+
reason: import("./firestore").ReportReason;
|
|
14
|
+
entityId: string;
|
|
15
|
+
entityType: import("./firestore").ReportEntityType;
|
|
16
|
+
detail: string;
|
|
17
|
+
evidenceUrls?: string[] | undefined;
|
|
18
|
+
}, {
|
|
19
|
+
reason: import("./firestore").ReportReason;
|
|
20
|
+
entityId: string;
|
|
21
|
+
entityType: import("./firestore").ReportEntityType;
|
|
22
|
+
detail: string;
|
|
23
|
+
evidenceUrls?: string[] | undefined;
|
|
24
|
+
}>;
|
|
25
|
+
export type ReportCreateValues = z.infer<typeof reportCreateSchema>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: `POST /api/reports` — the surface any signed-in user files an abuse
|
|
3
|
+
* report through — spread the raw request body into Firestore:
|
|
4
|
+
*
|
|
5
|
+
* const body = await parseJsonBody<Record<string, JsonValue>>(request);
|
|
6
|
+
* await reportsRepository.create({ ...body, reporterId, reporterEmail, status: "pending" });
|
|
7
|
+
*
|
|
8
|
+
* Nothing was checked. Two distinct consequences:
|
|
9
|
+
*
|
|
10
|
+
* 1. An EMPTY report could be filed. `entityType`, `entityId`, `reason`
|
|
11
|
+
* and `detail` are what make a report actionable and none was
|
|
12
|
+
* required, so a row could reach the moderation queue naming nothing
|
|
13
|
+
* and describing nothing.
|
|
14
|
+
* 2. A reporter could set fields that belong to the REVIEWER — a body
|
|
15
|
+
* carrying `assignedTo`, `resolution` or `resolvedAt` was written
|
|
16
|
+
* verbatim, so a user could file a report that already claimed to be
|
|
17
|
+
* resolved by a named admin.
|
|
18
|
+
*
|
|
19
|
+
* `status` was pinned server-side, which is the only reason (2) was not
|
|
20
|
+
* worse than it is.
|
|
21
|
+
*
|
|
22
|
+
* WHAT: The create contract. Four required fields, evidence optional, and
|
|
23
|
+
* nothing a reviewer owns.
|
|
24
|
+
*
|
|
25
|
+
* ## `reporterId` / `reporterEmail` / `status` are absent on purpose
|
|
26
|
+
*
|
|
27
|
+
* The route sets all three. Accepting `reporterId` would let one user file a
|
|
28
|
+
* report in another's name, which is a way to weaponise the abuse queue rather
|
|
29
|
+
* than a validation nicety.
|
|
30
|
+
*
|
|
31
|
+
* EXPORTS: reportCreateSchema, type ReportCreateValues
|
|
32
|
+
*
|
|
33
|
+
* @tag domain:store-extensions,reports
|
|
34
|
+
* @tag layer:schema
|
|
35
|
+
* @tag pattern:none
|
|
36
|
+
* @tag access:isomorphic
|
|
37
|
+
* @tag consumers:/api/reports
|
|
38
|
+
* @tag sideEffects:none
|
|
39
|
+
*/
|
|
40
|
+
import { z } from "zod";
|
|
41
|
+
import { annotate } from "../../shell/field-ui-meta";
|
|
42
|
+
import { REPORT_ENTITY_TYPES, REPORT_REASONS } from "./firestore";
|
|
43
|
+
/**
|
|
44
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
45
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
46
|
+
*/
|
|
47
|
+
export const reportCreateSchema = z
|
|
48
|
+
.object({
|
|
49
|
+
entityType: annotate(z.enum(REPORT_ENTITY_TYPES), {
|
|
50
|
+
section: "target",
|
|
51
|
+
sectionLabel: "What are you reporting?",
|
|
52
|
+
sectionRequired: true,
|
|
53
|
+
quick: true,
|
|
54
|
+
order: 1,
|
|
55
|
+
row: "pair",
|
|
56
|
+
}),
|
|
57
|
+
entityId: annotate(z.string().min(1, "Tell us which item this is about."), {
|
|
58
|
+
section: "target",
|
|
59
|
+
quick: true,
|
|
60
|
+
order: 2,
|
|
61
|
+
row: "pair",
|
|
62
|
+
}),
|
|
63
|
+
reason: annotate(z.enum(REPORT_REASONS), {
|
|
64
|
+
section: "detail",
|
|
65
|
+
sectionLabel: "Why",
|
|
66
|
+
sectionRequired: true,
|
|
67
|
+
quick: true,
|
|
68
|
+
order: 1,
|
|
69
|
+
row: "pair",
|
|
70
|
+
}),
|
|
71
|
+
detail: annotate(z
|
|
72
|
+
.string()
|
|
73
|
+
.min(10, "Please describe the problem in at least 10 characters.")
|
|
74
|
+
.max(5000, "Keep the description under 5000 characters."), { section: "detail", quick: true, order: 2, row: "full", kind: "textarea" }),
|
|
75
|
+
// Capped: an unbounded array on a user-writable document is a way to grow
|
|
76
|
+
// one row past what a list read can afford (Rule #6).
|
|
77
|
+
evidenceUrls: annotate(z.array(z.string().url("Each piece of evidence must be a URL.")).max(10).optional(), { section: "detail", order: 3, row: "full", kind: "list" }),
|
|
78
|
+
})
|
|
79
|
+
.strict();
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/** The statuses a human review can produce. `pending` is the initial state. */
|
|
3
|
+
export declare const REPORT_REVIEWER_STATUSES: readonly ["under-review", "actioned", "dismissed"];
|
|
4
|
+
/**
|
|
5
|
+
* The two that CLOSE a report — the server stamps `resolvedAt` for these and
|
|
6
|
+
* for no others. Exported so the route and any future consumer share one
|
|
7
|
+
* answer to "is this report finished", rather than each spelling out the pair.
|
|
8
|
+
*/
|
|
9
|
+
export declare const REPORT_TERMINAL_STATUSES: readonly ["actioned", "dismissed"];
|
|
10
|
+
/**
|
|
11
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
12
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
13
|
+
*/
|
|
14
|
+
export declare const reportReviewFormSchema: z.ZodEffects<z.ZodObject<{
|
|
15
|
+
status: z.ZodEnum<["under-review", "actioned", "dismissed"]>;
|
|
16
|
+
resolution: z.ZodOptional<z.ZodString>;
|
|
17
|
+
}, "strict", z.ZodTypeAny, {
|
|
18
|
+
status: "dismissed" | "under-review" | "actioned";
|
|
19
|
+
resolution?: string | undefined;
|
|
20
|
+
}, {
|
|
21
|
+
status: "dismissed" | "under-review" | "actioned";
|
|
22
|
+
resolution?: string | undefined;
|
|
23
|
+
}>, {
|
|
24
|
+
status: "dismissed" | "under-review" | "actioned";
|
|
25
|
+
resolution?: string | undefined;
|
|
26
|
+
}, {
|
|
27
|
+
status: "dismissed" | "under-review" | "actioned";
|
|
28
|
+
resolution?: string | undefined;
|
|
29
|
+
}>;
|
|
30
|
+
export type ReportReviewFormValues = z.infer<typeof reportReviewFormSchema>;
|
|
31
|
+
/** Route contract — identical; a review is one atomic decision. */
|
|
32
|
+
export declare const reportReviewUpdateSchema: z.ZodEffects<z.ZodObject<{
|
|
33
|
+
status: z.ZodEnum<["under-review", "actioned", "dismissed"]>;
|
|
34
|
+
resolution: z.ZodOptional<z.ZodString>;
|
|
35
|
+
}, "strict", z.ZodTypeAny, {
|
|
36
|
+
status: "dismissed" | "under-review" | "actioned";
|
|
37
|
+
resolution?: string | undefined;
|
|
38
|
+
}, {
|
|
39
|
+
status: "dismissed" | "under-review" | "actioned";
|
|
40
|
+
resolution?: string | undefined;
|
|
41
|
+
}>, {
|
|
42
|
+
status: "dismissed" | "under-review" | "actioned";
|
|
43
|
+
resolution?: string | undefined;
|
|
44
|
+
}, {
|
|
45
|
+
status: "dismissed" | "under-review" | "actioned";
|
|
46
|
+
resolution?: string | undefined;
|
|
47
|
+
}>;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: `PATCH /api/admin/reports/[id]` spread the raw request body straight
|
|
3
|
+
* into Firestore, exactly as the moderation route did:
|
|
4
|
+
*
|
|
5
|
+
* const body = await parseJsonBody<Record<string, JsonValue>>(request);
|
|
6
|
+
* await reportsRepository.update(id, { ...body, assignedTo: user.uid });
|
|
7
|
+
*
|
|
8
|
+
* No Zod on the route, none on either client surface. `status` was never
|
|
9
|
+
* checked against the real `ReportStatus` union, and any key at all could
|
|
10
|
+
* be written onto a report — `reporterId`, `entityId`, `evidenceUrls`,
|
|
11
|
+
* or something invented.
|
|
12
|
+
*
|
|
13
|
+
* ## 🛑 And it was actively corrupting `resolvedAt`
|
|
14
|
+
*
|
|
15
|
+
* BOTH client surfaces — the list page's inline controls and
|
|
16
|
+
* `ReportDetailActions` — sent:
|
|
17
|
+
*
|
|
18
|
+
* resolvedAt: status === "actioned" || status === "dismissed"
|
|
19
|
+
* ? new Date() : undefined
|
|
20
|
+
*
|
|
21
|
+
* `new Date()` does not survive `JSON.stringify`. It arrives at the route
|
|
22
|
+
* as an ISO **string**, and the raw spread wrote that string into a field
|
|
23
|
+
* `ReportDocument` declares as `Date`. Seeded reports hold real
|
|
24
|
+
* Timestamps, so the collection carries BOTH shapes for one field —
|
|
25
|
+
* the sort of split that later reads as "the date filter is broken" long
|
|
26
|
+
* after the cause is out of sight (Recurrent Root Cause #47).
|
|
27
|
+
*
|
|
28
|
+
* Nothing renders `resolvedAt` today, which is the only reason it was
|
|
29
|
+
* never noticed. It is a latent corruption, not a cosmetic one.
|
|
30
|
+
*
|
|
31
|
+
* WHAT: One schema shared by the route and both client surfaces — and
|
|
32
|
+
* `resolvedAt` is REMOVED from the client contract entirely. The server
|
|
33
|
+
* stamps it, the same way the moderation route already stamps
|
|
34
|
+
* `reviewedAt`. A timestamp the client cannot send is a timestamp the
|
|
35
|
+
* client cannot send in the wrong type.
|
|
36
|
+
*
|
|
37
|
+
* ## A reviewer may only set the three statuses a REVIEW produces
|
|
38
|
+
*
|
|
39
|
+
* `ReportStatus` has four values; `pending` is the state a report is born in.
|
|
40
|
+
* The settable subset is declared `satisfies readonly ReportStatus[]` rather
|
|
41
|
+
* than restated, so a value outside the real union is a COMPILE error instead
|
|
42
|
+
* of a filter that silently matches nothing (Recurrent Root Cause #33).
|
|
43
|
+
*
|
|
44
|
+
* EXPORTS:
|
|
45
|
+
* reportReviewFormSchema, reportReviewUpdateSchema,
|
|
46
|
+
* REPORT_REVIEWER_STATUSES, REPORT_TERMINAL_STATUSES,
|
|
47
|
+
* type ReportReviewFormValues
|
|
48
|
+
*
|
|
49
|
+
* @tag domain:store-extensions,reports
|
|
50
|
+
* @tag layer:schema
|
|
51
|
+
* @tag pattern:none
|
|
52
|
+
* @tag access:isomorphic
|
|
53
|
+
* @tag consumers:admin/reports pages,/api/admin/reports/[id]
|
|
54
|
+
* @tag sideEffects:none
|
|
55
|
+
*/
|
|
56
|
+
import { z } from "zod";
|
|
57
|
+
import { annotate } from "../../shell/field-ui-meta";
|
|
58
|
+
/** The statuses a human review can produce. `pending` is the initial state. */
|
|
59
|
+
export const REPORT_REVIEWER_STATUSES = [
|
|
60
|
+
"under-review",
|
|
61
|
+
"actioned",
|
|
62
|
+
"dismissed",
|
|
63
|
+
];
|
|
64
|
+
/**
|
|
65
|
+
* The two that CLOSE a report — the server stamps `resolvedAt` for these and
|
|
66
|
+
* for no others. Exported so the route and any future consumer share one
|
|
67
|
+
* answer to "is this report finished", rather than each spelling out the pair.
|
|
68
|
+
*/
|
|
69
|
+
export const REPORT_TERMINAL_STATUSES = [
|
|
70
|
+
"actioned",
|
|
71
|
+
"dismissed",
|
|
72
|
+
];
|
|
73
|
+
/**
|
|
74
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
75
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
76
|
+
*/
|
|
77
|
+
export const reportReviewFormSchema = z
|
|
78
|
+
.object({
|
|
79
|
+
status: annotate(z.enum(REPORT_REVIEWER_STATUSES), {
|
|
80
|
+
section: "review",
|
|
81
|
+
sectionLabel: "Report decision",
|
|
82
|
+
sectionRequired: true,
|
|
83
|
+
quick: true,
|
|
84
|
+
order: 1,
|
|
85
|
+
row: "pair",
|
|
86
|
+
}),
|
|
87
|
+
resolution: annotate(z.string().max(1000, "Keep the resolution under 1000 characters.").optional(), {
|
|
88
|
+
section: "review",
|
|
89
|
+
order: 2,
|
|
90
|
+
row: "full",
|
|
91
|
+
kind: "textarea",
|
|
92
|
+
help: "Required when actioning or dismissing — the reporter may see a summary.",
|
|
93
|
+
}),
|
|
94
|
+
// `resolvedAt` is deliberately NOT a field. See the header.
|
|
95
|
+
})
|
|
96
|
+
.strict()
|
|
97
|
+
.superRefine((v, ctx) => {
|
|
98
|
+
// Taking a report for review needs no note; closing one does. "Actioned"
|
|
99
|
+
// with an empty resolution tells the reporter, and the next admin, nothing
|
|
100
|
+
// about what was actually done.
|
|
101
|
+
if (REPORT_TERMINAL_STATUSES.includes(v.status) &&
|
|
102
|
+
!v.resolution?.trim()) {
|
|
103
|
+
ctx.addIssue({
|
|
104
|
+
code: z.ZodIssueCode.custom,
|
|
105
|
+
path: ["resolution"],
|
|
106
|
+
message: "Say what was done about this report before closing it.",
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
/** Route contract — identical; a review is one atomic decision. */
|
|
111
|
+
export const reportReviewUpdateSchema = reportReviewFormSchema;
|