@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,36 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AdminNotificationCategory, AdminNotificationDocument } from "./rbac";
|
|
3
|
+
export declare const ADMIN_NOTIFICATION_CATEGORIES: [AdminNotificationCategory, ...AdminNotificationCategory[]];
|
|
4
|
+
type Severity = AdminNotificationDocument["severity"];
|
|
5
|
+
export declare const ADMIN_NOTIFICATION_SEVERITIES: [Severity, ...Severity[]];
|
|
6
|
+
/**
|
|
7
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
8
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
9
|
+
*/
|
|
10
|
+
export declare const adminNotificationCreateSchema: z.ZodObject<{
|
|
11
|
+
title: z.ZodString;
|
|
12
|
+
body: z.ZodString;
|
|
13
|
+
category: z.ZodEnum<[AdminNotificationCategory, ...AdminNotificationCategory[]]>;
|
|
14
|
+
severity: z.ZodEnum<["warning" | "error" | "info", ...("warning" | "error" | "info")[]]>;
|
|
15
|
+
audienceUserIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
16
|
+
entityType: z.ZodOptional<z.ZodString>;
|
|
17
|
+
entityId: z.ZodOptional<z.ZodString>;
|
|
18
|
+
}, "strict", z.ZodTypeAny, {
|
|
19
|
+
title: string;
|
|
20
|
+
body: string;
|
|
21
|
+
category: AdminNotificationCategory;
|
|
22
|
+
severity: "warning" | "error" | "info";
|
|
23
|
+
entityId?: string | undefined;
|
|
24
|
+
entityType?: string | undefined;
|
|
25
|
+
audienceUserIds?: string[] | undefined;
|
|
26
|
+
}, {
|
|
27
|
+
title: string;
|
|
28
|
+
body: string;
|
|
29
|
+
category: AdminNotificationCategory;
|
|
30
|
+
severity: "warning" | "error" | "info";
|
|
31
|
+
entityId?: string | undefined;
|
|
32
|
+
entityType?: string | undefined;
|
|
33
|
+
audienceUserIds?: string[] | undefined;
|
|
34
|
+
}>;
|
|
35
|
+
export type AdminNotificationCreateValues = z.infer<typeof adminNotificationCreateSchema>;
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: `POST /api/admin/admin-notifications` spread the raw request body into
|
|
3
|
+
* Firestore with only `isRead: false` pinned. The last unvalidated write
|
|
4
|
+
* path in `src/app/api`.
|
|
5
|
+
*
|
|
6
|
+
* `category` and `severity` are both closed unions that the admin
|
|
7
|
+
* notification bell filters and colours by, and neither was checked — so
|
|
8
|
+
* a notification could be stored with a category no filter chip matches
|
|
9
|
+
* and a severity no badge renders, which is the shape that produces a row
|
|
10
|
+
* visible in the raw collection and invisible in the UI (Recurrent Root
|
|
11
|
+
* Cause #33).
|
|
12
|
+
*
|
|
13
|
+
* `audienceUserIds` decides WHO SEES IT. Unvalidated and unbounded, it
|
|
14
|
+
* could arrive as a string rather than an array — silently narrowing or
|
|
15
|
+
* widening the audience of an admin notification.
|
|
16
|
+
*
|
|
17
|
+
* WHAT: The create contract.
|
|
18
|
+
*
|
|
19
|
+
* ## `isRead` / `readAt` are absent on purpose
|
|
20
|
+
*
|
|
21
|
+
* Both are per-admin read state, owned by the read/dismiss path. A creator
|
|
22
|
+
* marking its own notification as already read would file it straight into the
|
|
23
|
+
* history nobody looks at.
|
|
24
|
+
*
|
|
25
|
+
* EXPORTS:
|
|
26
|
+
* adminNotificationCreateSchema, ADMIN_NOTIFICATION_CATEGORIES,
|
|
27
|
+
* ADMIN_NOTIFICATION_SEVERITIES, type AdminNotificationCreateValues
|
|
28
|
+
*
|
|
29
|
+
* @tag domain:store-extensions,admin-notifications
|
|
30
|
+
* @tag layer:schema
|
|
31
|
+
* @tag pattern:none
|
|
32
|
+
* @tag access:isomorphic
|
|
33
|
+
* @tag consumers:/api/admin/admin-notifications
|
|
34
|
+
* @tag sideEffects:none
|
|
35
|
+
*/
|
|
36
|
+
import { z } from "zod";
|
|
37
|
+
import { annotate } from "../../shell/field-ui-meta";
|
|
38
|
+
/*
|
|
39
|
+
* Keyed `Record<Union, true>` so BOTH mistakes are compile errors — a member
|
|
40
|
+
* added to the union and forgotten here, and a value here that is not real.
|
|
41
|
+
*/
|
|
42
|
+
const CATEGORY_MAP = {
|
|
43
|
+
system: true,
|
|
44
|
+
security: true,
|
|
45
|
+
moderation: true,
|
|
46
|
+
payouts: true,
|
|
47
|
+
fraud: true,
|
|
48
|
+
growth: true,
|
|
49
|
+
};
|
|
50
|
+
export const ADMIN_NOTIFICATION_CATEGORIES = Object.keys(CATEGORY_MAP);
|
|
51
|
+
const SEVERITY_MAP = {
|
|
52
|
+
info: true,
|
|
53
|
+
warning: true,
|
|
54
|
+
error: true,
|
|
55
|
+
};
|
|
56
|
+
export const ADMIN_NOTIFICATION_SEVERITIES = Object.keys(SEVERITY_MAP);
|
|
57
|
+
/**
|
|
58
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
59
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
60
|
+
*/
|
|
61
|
+
export const adminNotificationCreateSchema = z
|
|
62
|
+
.object({
|
|
63
|
+
title: annotate(z.string().min(1, "Give the notification a title.").max(200), {
|
|
64
|
+
section: "message",
|
|
65
|
+
sectionLabel: "Message",
|
|
66
|
+
sectionRequired: true,
|
|
67
|
+
quick: true,
|
|
68
|
+
order: 1,
|
|
69
|
+
row: "full",
|
|
70
|
+
}),
|
|
71
|
+
body: annotate(z.string().min(1, "Say what happened.").max(2000), {
|
|
72
|
+
section: "message",
|
|
73
|
+
quick: true,
|
|
74
|
+
order: 2,
|
|
75
|
+
row: "full",
|
|
76
|
+
kind: "textarea",
|
|
77
|
+
}),
|
|
78
|
+
category: annotate(z.enum(ADMIN_NOTIFICATION_CATEGORIES), {
|
|
79
|
+
section: "routing",
|
|
80
|
+
sectionLabel: "Routing",
|
|
81
|
+
sectionRequired: true,
|
|
82
|
+
quick: true,
|
|
83
|
+
order: 1,
|
|
84
|
+
row: "pair",
|
|
85
|
+
}),
|
|
86
|
+
severity: annotate(z.enum(ADMIN_NOTIFICATION_SEVERITIES), {
|
|
87
|
+
section: "routing",
|
|
88
|
+
quick: true,
|
|
89
|
+
order: 2,
|
|
90
|
+
row: "pair",
|
|
91
|
+
}),
|
|
92
|
+
// Empty (or omitted) means every admin — that is the documented meaning of
|
|
93
|
+
// the field, so an empty array must stay expressible and is NOT `.min(1)`.
|
|
94
|
+
// Capped because this is the audience of a broadcast.
|
|
95
|
+
audienceUserIds: annotate(z.array(z.string().min(1)).max(200).optional(), {
|
|
96
|
+
section: "routing",
|
|
97
|
+
order: 3,
|
|
98
|
+
row: "full",
|
|
99
|
+
kind: "list",
|
|
100
|
+
help: "Leave empty to notify every admin.",
|
|
101
|
+
}),
|
|
102
|
+
entityType: annotate(z.string().max(80).optional(), {
|
|
103
|
+
section: "link",
|
|
104
|
+
sectionLabel: "Linked record",
|
|
105
|
+
order: 1,
|
|
106
|
+
row: "pair",
|
|
107
|
+
}),
|
|
108
|
+
entityId: annotate(z.string().max(200).optional(), {
|
|
109
|
+
section: "link",
|
|
110
|
+
order: 2,
|
|
111
|
+
row: "pair",
|
|
112
|
+
}),
|
|
113
|
+
})
|
|
114
|
+
.strict();
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AlertOperator, AnalyticsCardType } from "./firestore";
|
|
3
|
+
export declare const ANALYTICS_ALERT_OPERATORS: [AlertOperator, ...AlertOperator[]];
|
|
4
|
+
export declare const ANALYTICS_CARD_TYPES: [AnalyticsCardType, ...AnalyticsCardType[]];
|
|
5
|
+
/**
|
|
6
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
7
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
8
|
+
*/
|
|
9
|
+
export declare const analyticsAlertCreateSchema: z.ZodObject<{
|
|
10
|
+
label: z.ZodString;
|
|
11
|
+
metric: z.ZodString;
|
|
12
|
+
operator: z.ZodEnum<[AlertOperator, ...AlertOperator[]]>;
|
|
13
|
+
threshold: z.ZodNumber;
|
|
14
|
+
windowHours: z.ZodNumber;
|
|
15
|
+
isActive: z.ZodOptional<z.ZodBoolean>;
|
|
16
|
+
notifyChannels: z.ZodOptional<z.ZodArray<z.ZodEnum<["in-app", "email", "whatsapp"]>, "many">>;
|
|
17
|
+
}, "strict", z.ZodTypeAny, {
|
|
18
|
+
label: string;
|
|
19
|
+
operator: AlertOperator;
|
|
20
|
+
threshold: number;
|
|
21
|
+
metric: string;
|
|
22
|
+
windowHours: number;
|
|
23
|
+
isActive?: boolean | undefined;
|
|
24
|
+
notifyChannels?: ("email" | "whatsapp" | "in-app")[] | undefined;
|
|
25
|
+
}, {
|
|
26
|
+
label: string;
|
|
27
|
+
operator: AlertOperator;
|
|
28
|
+
threshold: number;
|
|
29
|
+
metric: string;
|
|
30
|
+
windowHours: number;
|
|
31
|
+
isActive?: boolean | undefined;
|
|
32
|
+
notifyChannels?: ("email" | "whatsapp" | "in-app")[] | undefined;
|
|
33
|
+
}>;
|
|
34
|
+
export type AnalyticsAlertCreateValues = z.infer<typeof analyticsAlertCreateSchema>;
|
|
35
|
+
export declare const analyticsCardCreateSchema: z.ZodObject<{
|
|
36
|
+
title: z.ZodString;
|
|
37
|
+
type: z.ZodEnum<[AnalyticsCardType, ...AnalyticsCardType[]]>;
|
|
38
|
+
metric: z.ZodString;
|
|
39
|
+
filters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<import("../../..").FirestoreValue, z.ZodTypeDef, import("../../..").FirestoreValue>>>;
|
|
40
|
+
position: z.ZodOptional<z.ZodNumber>;
|
|
41
|
+
isVisible: z.ZodOptional<z.ZodBoolean>;
|
|
42
|
+
}, "strict", z.ZodTypeAny, {
|
|
43
|
+
type: AnalyticsCardType;
|
|
44
|
+
title: string;
|
|
45
|
+
metric: string;
|
|
46
|
+
position?: number | undefined;
|
|
47
|
+
filters?: Record<string, import("../../..").FirestoreValue> | undefined;
|
|
48
|
+
isVisible?: boolean | undefined;
|
|
49
|
+
}, {
|
|
50
|
+
type: AnalyticsCardType;
|
|
51
|
+
title: string;
|
|
52
|
+
metric: string;
|
|
53
|
+
position?: number | undefined;
|
|
54
|
+
filters?: Record<string, import("../../..").FirestoreValue> | undefined;
|
|
55
|
+
isVisible?: boolean | undefined;
|
|
56
|
+
}>;
|
|
57
|
+
export type AnalyticsCardCreateValues = z.infer<typeof analyticsCardCreateSchema>;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: `POST /api/store/analytics/alerts` and `POST /api/store/analytics/cards`
|
|
3
|
+
* both spread the raw request body into Firestore.
|
|
4
|
+
*
|
|
5
|
+
* The alert one matters most. An analytics alert is a rule that FIRES —
|
|
6
|
+
* `metric`, `operator`, `threshold` and `windowHours` are what a scheduled
|
|
7
|
+
* job evaluates, and none of the four was checked. A `threshold` arriving
|
|
8
|
+
* as the string "50" from a number input was written as a string, so the
|
|
9
|
+
* comparison the alert exists to perform would run against a string; an
|
|
10
|
+
* `operator` outside the real six matched nothing; and `windowHours` was
|
|
11
|
+
* unbounded, so a rule could ask a job to look back a hundred years.
|
|
12
|
+
*
|
|
13
|
+
* Neither failure surfaces as an error. The alert is created, listed, and
|
|
14
|
+
* looks configured — it simply never fires, or fires wrongly.
|
|
15
|
+
*
|
|
16
|
+
* WHAT: The two create contracts.
|
|
17
|
+
*
|
|
18
|
+
* ## `scope` / `ownerId` / `isBuiltIn` are absent on purpose
|
|
19
|
+
*
|
|
20
|
+
* The routes pin all three. `scope` in particular decides whether a row is a
|
|
21
|
+
* seller's or the platform's, so accepting it from the body would let a seller
|
|
22
|
+
* file an admin-scoped card.
|
|
23
|
+
*
|
|
24
|
+
* EXPORTS:
|
|
25
|
+
* analyticsAlertCreateSchema, analyticsCardCreateSchema,
|
|
26
|
+
* ANALYTICS_ALERT_OPERATORS, ANALYTICS_CARD_TYPES,
|
|
27
|
+
* type AnalyticsAlertCreateValues, type AnalyticsCardCreateValues
|
|
28
|
+
*
|
|
29
|
+
* @tag domain:store-extensions,analytics
|
|
30
|
+
* @tag layer:schema
|
|
31
|
+
* @tag pattern:none
|
|
32
|
+
* @tag access:isomorphic
|
|
33
|
+
* @tag consumers:/api/store/analytics/alerts,/api/store/analytics/cards
|
|
34
|
+
* @tag sideEffects:none
|
|
35
|
+
*/
|
|
36
|
+
import { z } from "zod";
|
|
37
|
+
import { annotate } from "../../shell/field-ui-meta";
|
|
38
|
+
import { firestoreValueSchema } from "../../../schemas/firestore-value";
|
|
39
|
+
/*
|
|
40
|
+
* Keyed `Record<Union, true>` so BOTH mistakes are compile errors — a value
|
|
41
|
+
* added to the union and forgotten here, and a value here that is not real.
|
|
42
|
+
*/
|
|
43
|
+
const ALERT_OPERATOR_MAP = {
|
|
44
|
+
">": true,
|
|
45
|
+
"<": true,
|
|
46
|
+
">=": true,
|
|
47
|
+
"<=": true,
|
|
48
|
+
"==": true,
|
|
49
|
+
"!=": true,
|
|
50
|
+
};
|
|
51
|
+
export const ANALYTICS_ALERT_OPERATORS = Object.keys(ALERT_OPERATOR_MAP);
|
|
52
|
+
const CARD_TYPE_MAP = {
|
|
53
|
+
metric: true,
|
|
54
|
+
line: true,
|
|
55
|
+
bar: true,
|
|
56
|
+
pie: true,
|
|
57
|
+
table: true,
|
|
58
|
+
custom: true,
|
|
59
|
+
};
|
|
60
|
+
export const ANALYTICS_CARD_TYPES = Object.keys(CARD_TYPE_MAP);
|
|
61
|
+
/** One year. A window beyond this is a typo, not a reporting period. */
|
|
62
|
+
const MAX_WINDOW_HOURS = 24 * 365;
|
|
63
|
+
/**
|
|
64
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
65
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
66
|
+
*/
|
|
67
|
+
export const analyticsAlertCreateSchema = z
|
|
68
|
+
.object({
|
|
69
|
+
label: annotate(z.string().min(1, "Give the alert a name.").max(120), {
|
|
70
|
+
section: "alert",
|
|
71
|
+
sectionLabel: "Alert",
|
|
72
|
+
sectionRequired: true,
|
|
73
|
+
quick: true,
|
|
74
|
+
order: 1,
|
|
75
|
+
row: "full",
|
|
76
|
+
}),
|
|
77
|
+
metric: annotate(z.string().min(1, "Choose a metric to watch."), {
|
|
78
|
+
section: "rule",
|
|
79
|
+
sectionLabel: "When to fire",
|
|
80
|
+
sectionRequired: true,
|
|
81
|
+
quick: true,
|
|
82
|
+
order: 1,
|
|
83
|
+
row: "pair",
|
|
84
|
+
}),
|
|
85
|
+
operator: annotate(z.enum(ANALYTICS_ALERT_OPERATORS), {
|
|
86
|
+
section: "rule",
|
|
87
|
+
quick: true,
|
|
88
|
+
order: 2,
|
|
89
|
+
row: "pair",
|
|
90
|
+
}),
|
|
91
|
+
// Coerced. A number input sends a string, and an uncoerced threshold is
|
|
92
|
+
// compared as a string by whatever evaluates the rule — "9" > "10".
|
|
93
|
+
threshold: annotate(z.coerce.number({ invalid_type_error: "Set a numeric threshold." }), {
|
|
94
|
+
section: "rule",
|
|
95
|
+
quick: true,
|
|
96
|
+
order: 3,
|
|
97
|
+
row: "pair",
|
|
98
|
+
kind: "number",
|
|
99
|
+
}),
|
|
100
|
+
windowHours: annotate(z.coerce
|
|
101
|
+
.number()
|
|
102
|
+
.int("The window must be a whole number of hours.")
|
|
103
|
+
.min(1, "The window must be at least an hour.")
|
|
104
|
+
.max(MAX_WINDOW_HOURS, "That window is longer than a year."), { section: "rule", quick: true, order: 4, row: "pair", kind: "number" }),
|
|
105
|
+
isActive: annotate(z.boolean().optional(), {
|
|
106
|
+
section: "delivery",
|
|
107
|
+
sectionLabel: "Delivery",
|
|
108
|
+
order: 1,
|
|
109
|
+
row: "quarter",
|
|
110
|
+
}),
|
|
111
|
+
notifyChannels: annotate(z.array(z.enum(["in-app", "email", "whatsapp"])).min(1).optional(), { section: "delivery", order: 2, row: "full", kind: "list" }),
|
|
112
|
+
})
|
|
113
|
+
.strict();
|
|
114
|
+
export const analyticsCardCreateSchema = z
|
|
115
|
+
.object({
|
|
116
|
+
title: annotate(z.string().min(1, "Give the card a title.").max(120), {
|
|
117
|
+
section: "card",
|
|
118
|
+
sectionLabel: "Card",
|
|
119
|
+
sectionRequired: true,
|
|
120
|
+
quick: true,
|
|
121
|
+
order: 1,
|
|
122
|
+
row: "full",
|
|
123
|
+
}),
|
|
124
|
+
type: annotate(z.enum(ANALYTICS_CARD_TYPES), {
|
|
125
|
+
section: "card",
|
|
126
|
+
quick: true,
|
|
127
|
+
order: 2,
|
|
128
|
+
row: "pair",
|
|
129
|
+
}),
|
|
130
|
+
metric: annotate(z.string().min(1, "Choose a metric."), {
|
|
131
|
+
section: "card",
|
|
132
|
+
quick: true,
|
|
133
|
+
order: 3,
|
|
134
|
+
row: "pair",
|
|
135
|
+
}),
|
|
136
|
+
// Deliberately open — filter shape varies by card type, and a closed schema
|
|
137
|
+
// would silently strip whatever the builder produced for a type it did not
|
|
138
|
+
// enumerate.
|
|
139
|
+
filters: annotate(z.record(firestoreValueSchema).optional(), {
|
|
140
|
+
section: "card",
|
|
141
|
+
order: 4,
|
|
142
|
+
row: "full",
|
|
143
|
+
kind: "list",
|
|
144
|
+
}),
|
|
145
|
+
position: annotate(z.coerce.number().int().min(0).optional(), {
|
|
146
|
+
section: "layout",
|
|
147
|
+
sectionLabel: "Layout",
|
|
148
|
+
order: 1,
|
|
149
|
+
row: "pair",
|
|
150
|
+
kind: "number",
|
|
151
|
+
}),
|
|
152
|
+
isVisible: annotate(z.boolean().optional(), {
|
|
153
|
+
section: "layout",
|
|
154
|
+
order: 2,
|
|
155
|
+
row: "quarter",
|
|
156
|
+
}),
|
|
157
|
+
})
|
|
158
|
+
.strict();
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/** Whether a string is a permission this system can actually grant. */
|
|
3
|
+
export declare function isKnownPermission(value: string): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
6
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
7
|
+
*/
|
|
8
|
+
export declare const customRoleFormSchema: z.ZodObject<{
|
|
9
|
+
name: z.ZodString;
|
|
10
|
+
slug: z.ZodString;
|
|
11
|
+
description: z.ZodOptional<z.ZodString>;
|
|
12
|
+
scope: z.ZodEnum<["global", "store"]>;
|
|
13
|
+
permissions: z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">;
|
|
14
|
+
inheritsFrom: z.ZodOptional<z.ZodString>;
|
|
15
|
+
isActive: z.ZodBoolean;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
scope: "store" | "global";
|
|
18
|
+
name: string;
|
|
19
|
+
slug: string;
|
|
20
|
+
isActive: boolean;
|
|
21
|
+
permissions: string[];
|
|
22
|
+
description?: string | undefined;
|
|
23
|
+
inheritsFrom?: string | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
scope: "store" | "global";
|
|
26
|
+
name: string;
|
|
27
|
+
slug: string;
|
|
28
|
+
isActive: boolean;
|
|
29
|
+
permissions: string[];
|
|
30
|
+
description?: string | undefined;
|
|
31
|
+
inheritsFrom?: string | undefined;
|
|
32
|
+
}>;
|
|
33
|
+
export type CustomRoleFormValues = z.infer<typeof customRoleFormSchema>;
|
|
34
|
+
/** Create contract. `createdBy` is absent — the route sets it from the session. */
|
|
35
|
+
export declare const customRoleCreateSchema: z.ZodObject<{
|
|
36
|
+
name: z.ZodString;
|
|
37
|
+
slug: z.ZodString;
|
|
38
|
+
description: z.ZodOptional<z.ZodString>;
|
|
39
|
+
scope: z.ZodEnum<["global", "store"]>;
|
|
40
|
+
permissions: z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">;
|
|
41
|
+
inheritsFrom: z.ZodOptional<z.ZodString>;
|
|
42
|
+
isActive: z.ZodBoolean;
|
|
43
|
+
}, "strip", z.ZodTypeAny, {
|
|
44
|
+
scope: "store" | "global";
|
|
45
|
+
name: string;
|
|
46
|
+
slug: string;
|
|
47
|
+
isActive: boolean;
|
|
48
|
+
permissions: string[];
|
|
49
|
+
description?: string | undefined;
|
|
50
|
+
inheritsFrom?: string | undefined;
|
|
51
|
+
}, {
|
|
52
|
+
scope: "store" | "global";
|
|
53
|
+
name: string;
|
|
54
|
+
slug: string;
|
|
55
|
+
isActive: boolean;
|
|
56
|
+
permissions: string[];
|
|
57
|
+
description?: string | undefined;
|
|
58
|
+
inheritsFrom?: string | undefined;
|
|
59
|
+
}>;
|
|
60
|
+
/**
|
|
61
|
+
* Update contract — partial and `.strict()`, so an unknown key is a 400 rather
|
|
62
|
+
* than a silent write into a document the permission system reads.
|
|
63
|
+
*/
|
|
64
|
+
export declare const customRoleUpdateSchema: z.ZodObject<{
|
|
65
|
+
name: z.ZodOptional<z.ZodString>;
|
|
66
|
+
description: z.ZodOptional<z.ZodString>;
|
|
67
|
+
scope: z.ZodOptional<z.ZodEnum<["global", "store"]>>;
|
|
68
|
+
permissions: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
|
|
69
|
+
inheritsFrom: z.ZodOptional<z.ZodString>;
|
|
70
|
+
isActive: z.ZodOptional<z.ZodBoolean>;
|
|
71
|
+
}, "strict", z.ZodTypeAny, {
|
|
72
|
+
scope?: "store" | "global" | undefined;
|
|
73
|
+
name?: string | undefined;
|
|
74
|
+
description?: string | undefined;
|
|
75
|
+
isActive?: boolean | undefined;
|
|
76
|
+
permissions?: string[] | undefined;
|
|
77
|
+
inheritsFrom?: string | undefined;
|
|
78
|
+
}, {
|
|
79
|
+
scope?: "store" | "global" | undefined;
|
|
80
|
+
name?: string | undefined;
|
|
81
|
+
description?: string | undefined;
|
|
82
|
+
isActive?: boolean | undefined;
|
|
83
|
+
permissions?: string[] | undefined;
|
|
84
|
+
inheritsFrom?: string | undefined;
|
|
85
|
+
}>;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: Custom roles GRANT PERMISSIONS, and neither creating nor updating one
|
|
3
|
+
* validated anything. Measured 2026-08-24:
|
|
4
|
+
* · `POST /api/admin/roles` — `parseJsonBody` then `...body` spread
|
|
5
|
+
* into `.create()`.
|
|
6
|
+
* · `PATCH /api/admin/roles/[id]` — the raw body handed straight to
|
|
7
|
+
* `.update()`.
|
|
8
|
+
* · Both pages (`admin/roles/new`, `.../[id]/edit`) are raw controls
|
|
9
|
+
* with no Zod anywhere.
|
|
10
|
+
* So a role could be written with no name, a `permissions` array holding
|
|
11
|
+
* arbitrary strings, a `scope` outside its union, or any invented key —
|
|
12
|
+
* all persisted verbatim into the document the permission system reads.
|
|
13
|
+
* WHAT: One schema for both pages AND both routes.
|
|
14
|
+
*
|
|
15
|
+
* ## Permissions are checked against the real catalogue
|
|
16
|
+
*
|
|
17
|
+
* `Permission` is a closed union of ~85 `admin:resource:action` strings, and
|
|
18
|
+
* `PERMISSION_GROUPS` is its runtime form. A permission string that is not in
|
|
19
|
+
* it grants nothing — it silently never matches — so a role built from typos
|
|
20
|
+
* looks configured and does nothing, which is worse than being rejected.
|
|
21
|
+
*
|
|
22
|
+
* `"*"` is accepted deliberately: `security/rbac/types.ts` defines it as the
|
|
23
|
+
* wildcard, and rejecting it here would break a legitimate super-role.
|
|
24
|
+
*
|
|
25
|
+
* ## What is NOT accepted from the body
|
|
26
|
+
*
|
|
27
|
+
* `createdBy` is set from the session by the route. `id`/`createdAt`/
|
|
28
|
+
* `updatedAt` are the repository's. A caller able to set `createdBy` could
|
|
29
|
+
* attribute a privilege grant to somebody else, which is precisely the field
|
|
30
|
+
* an audit trail depends on.
|
|
31
|
+
*
|
|
32
|
+
* EXPORTS:
|
|
33
|
+
* customRoleFormSchema, customRoleCreateSchema, customRoleUpdateSchema,
|
|
34
|
+
* isKnownPermission, type CustomRoleFormValues
|
|
35
|
+
*
|
|
36
|
+
* @tag domain:store-extensions,rbac
|
|
37
|
+
* @tag layer:schema
|
|
38
|
+
* @tag pattern:none
|
|
39
|
+
* @tag access:isomorphic
|
|
40
|
+
* @tag consumers:admin/roles pages,/api/admin/roles
|
|
41
|
+
* @tag sideEffects:none
|
|
42
|
+
*/
|
|
43
|
+
import { z } from "zod";
|
|
44
|
+
import { annotate } from "../../shell/field-ui-meta";
|
|
45
|
+
import { PERMISSION_GROUPS } from "../../auth/permissions/constants";
|
|
46
|
+
/**
|
|
47
|
+
* Every permission the catalogue actually defines, plus the wildcard.
|
|
48
|
+
*
|
|
49
|
+
* Derived from `PERMISSION_GROUPS` rather than restated — a hand-written copy
|
|
50
|
+
* would be the second list of ~85 strings to keep in sync, and the first one
|
|
51
|
+
* to drift (Root Cause #61).
|
|
52
|
+
*/
|
|
53
|
+
const KNOWN_PERMISSIONS = new Set([
|
|
54
|
+
"*",
|
|
55
|
+
...Object.values(PERMISSION_GROUPS).flat(),
|
|
56
|
+
]);
|
|
57
|
+
/** Whether a string is a permission this system can actually grant. */
|
|
58
|
+
export function isKnownPermission(value) {
|
|
59
|
+
return KNOWN_PERMISSIONS.has(value);
|
|
60
|
+
}
|
|
61
|
+
const permissionSchema = z.string().refine(isKnownPermission, {
|
|
62
|
+
message: "Not a permission this system defines — it would grant nothing.",
|
|
63
|
+
});
|
|
64
|
+
/**
|
|
65
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
66
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
67
|
+
*/
|
|
68
|
+
export const customRoleFormSchema = z.object({
|
|
69
|
+
name: annotate(z.string().min(1, "A role needs a name.").max(80, "Keep the name under 80 characters."), {
|
|
70
|
+
section: "basics", sectionLabel: "Role", sectionRequired: true,
|
|
71
|
+
quick: true, order: 1, row: "pair",
|
|
72
|
+
}),
|
|
73
|
+
slug: annotate(z
|
|
74
|
+
.string()
|
|
75
|
+
.min(1, "A slug is required.")
|
|
76
|
+
.max(80)
|
|
77
|
+
.regex(/^[a-z0-9-]+$/, "Use lowercase letters, numbers and hyphens only."), {
|
|
78
|
+
section: "basics", quick: true, order: 2, row: "pair",
|
|
79
|
+
tier: "t1-derive",
|
|
80
|
+
help: "Generated from the name when left blank.",
|
|
81
|
+
}),
|
|
82
|
+
description: annotate(z.string().max(300, "Keep the description under 300 characters.").optional(), {
|
|
83
|
+
section: "basics", order: 3, row: "full",
|
|
84
|
+
}),
|
|
85
|
+
scope: annotate(z.enum(["global", "store"]), {
|
|
86
|
+
section: "basics", quick: true, order: 4, row: "pair",
|
|
87
|
+
}),
|
|
88
|
+
permissions: annotate(z.array(permissionSchema), {
|
|
89
|
+
section: "permissions", sectionLabel: "Permissions",
|
|
90
|
+
order: 1, row: "full", kind: "list",
|
|
91
|
+
}),
|
|
92
|
+
inheritsFrom: annotate(z.string().max(80).optional(), {
|
|
93
|
+
section: "permissions", order: 2, row: "pair",
|
|
94
|
+
help: "Another role whose permissions this one starts from.",
|
|
95
|
+
}),
|
|
96
|
+
isActive: annotate(z.boolean(), {
|
|
97
|
+
section: "visibility", sectionLabel: "Visibility", order: 1, row: "quarter",
|
|
98
|
+
}),
|
|
99
|
+
});
|
|
100
|
+
/** Create contract. `createdBy` is absent — the route sets it from the session. */
|
|
101
|
+
export const customRoleCreateSchema = customRoleFormSchema;
|
|
102
|
+
/**
|
|
103
|
+
* Update contract — partial and `.strict()`, so an unknown key is a 400 rather
|
|
104
|
+
* than a silent write into a document the permission system reads.
|
|
105
|
+
*/
|
|
106
|
+
export const customRoleUpdateSchema = z
|
|
107
|
+
.object({
|
|
108
|
+
name: z.string().min(1).max(80).optional(),
|
|
109
|
+
description: z.string().max(300).optional(),
|
|
110
|
+
scope: z.enum(["global", "store"]).optional(),
|
|
111
|
+
permissions: z.array(permissionSchema).optional(),
|
|
112
|
+
inheritsFrom: z.string().max(80).optional(),
|
|
113
|
+
isActive: z.boolean().optional(),
|
|
114
|
+
// `slug` is deliberately absent: it is the role's stable identifier and
|
|
115
|
+
// renaming it would orphan every user already assigned the role. Same
|
|
116
|
+
// create-only rule every other slug in this codebase follows.
|
|
117
|
+
})
|
|
118
|
+
.strict();
|
|
@@ -100,7 +100,25 @@ export interface StoreCategoryDocument extends BaseDocument {
|
|
|
100
100
|
export declare const STORE_CATEGORIES_COLLECTION: "storeCategories";
|
|
101
101
|
export declare const STORE_CATEGORY_INDEXED_FIELDS: readonly ["storeId", "slug", "isActive", "displayOrder", "createdAt"];
|
|
102
102
|
export declare const DEFAULT_STORE_CATEGORY_DATA: Partial<StoreCategoryDocument>;
|
|
103
|
-
|
|
103
|
+
/**
|
|
104
|
+
* The listing kinds a seller can save a template for.
|
|
105
|
+
*
|
|
106
|
+
* A runtime array, with the type DERIVED from it — so the Zod enum in
|
|
107
|
+
* `listing-template-form.ts` reads this rather than restating it. That was the
|
|
108
|
+
* eleventh hand-written copy of the listing-type union in this codebase, and
|
|
109
|
+
* the tenth had already drifted (Root Cause #61).
|
|
110
|
+
*
|
|
111
|
+
* Two deliberate differences from `ListingType`:
|
|
112
|
+
* - `bundle` is KEPT even though SB-UNI-D stopped it being a listingType. A
|
|
113
|
+
* seeded template stores it (`store-extensions-seed-data.ts:202`), so
|
|
114
|
+
* dropping it here would make that template fail validation and become
|
|
115
|
+
* unsaveable — the same defect as the blog `slug` regex no stored row
|
|
116
|
+
* satisfied.
|
|
117
|
+
* - `art` and `stickers` are ADDED. They are real listing types a seller can
|
|
118
|
+
* create, and their absence meant a template could never be saved for them.
|
|
119
|
+
*/
|
|
120
|
+
export declare const LISTING_TEMPLATE_TYPES: readonly ["standard", "auction", "pre-order", "prize-draw", "bundle", "classified", "digital-code", "live", "art", "stickers"];
|
|
121
|
+
export type ListingTemplateType = (typeof LISTING_TEMPLATE_TYPES)[number];
|
|
104
122
|
export interface ListingTemplateDocument extends BaseDocument {
|
|
105
123
|
storeId: string;
|
|
106
124
|
ownerId: string;
|
|
@@ -151,6 +169,8 @@ export interface ReportDocument extends BaseDocument {
|
|
|
151
169
|
resolution?: string;
|
|
152
170
|
resolvedAt?: Date;
|
|
153
171
|
}
|
|
172
|
+
export declare const REPORT_ENTITY_TYPES: [ReportEntityType, ...ReportEntityType[]];
|
|
173
|
+
export declare const REPORT_REASONS: [ReportReason, ...ReportReason[]];
|
|
154
174
|
export declare const REPORTS_COLLECTION: "reports";
|
|
155
175
|
export declare const REPORT_INDEXED_FIELDS: readonly ["entityType", "entityId", "reporterId", "reason", "status", "createdAt"];
|
|
156
176
|
export declare const DEFAULT_REPORT_DATA: Partial<ReportDocument>;
|
|
@@ -63,6 +63,36 @@ export const DEFAULT_STORE_CATEGORY_DATA = {
|
|
|
63
63
|
displayOrder: 0,
|
|
64
64
|
productIds: [],
|
|
65
65
|
};
|
|
66
|
+
// 6. ───── listingTemplates ───────────────────────────────────────────────
|
|
67
|
+
/**
|
|
68
|
+
* The listing kinds a seller can save a template for.
|
|
69
|
+
*
|
|
70
|
+
* A runtime array, with the type DERIVED from it — so the Zod enum in
|
|
71
|
+
* `listing-template-form.ts` reads this rather than restating it. That was the
|
|
72
|
+
* eleventh hand-written copy of the listing-type union in this codebase, and
|
|
73
|
+
* the tenth had already drifted (Root Cause #61).
|
|
74
|
+
*
|
|
75
|
+
* Two deliberate differences from `ListingType`:
|
|
76
|
+
* - `bundle` is KEPT even though SB-UNI-D stopped it being a listingType. A
|
|
77
|
+
* seeded template stores it (`store-extensions-seed-data.ts:202`), so
|
|
78
|
+
* dropping it here would make that template fail validation and become
|
|
79
|
+
* unsaveable — the same defect as the blog `slug` regex no stored row
|
|
80
|
+
* satisfied.
|
|
81
|
+
* - `art` and `stickers` are ADDED. They are real listing types a seller can
|
|
82
|
+
* create, and their absence meant a template could never be saved for them.
|
|
83
|
+
*/
|
|
84
|
+
export const LISTING_TEMPLATE_TYPES = [
|
|
85
|
+
"standard",
|
|
86
|
+
"auction",
|
|
87
|
+
"pre-order",
|
|
88
|
+
"prize-draw",
|
|
89
|
+
"bundle",
|
|
90
|
+
"classified",
|
|
91
|
+
"digital-code",
|
|
92
|
+
"live",
|
|
93
|
+
"art",
|
|
94
|
+
"stickers",
|
|
95
|
+
];
|
|
66
96
|
export const LISTING_TEMPLATES_COLLECTION = "listingTemplates";
|
|
67
97
|
export const LISTING_TEMPLATE_INDEXED_FIELDS = [
|
|
68
98
|
"storeId",
|
|
@@ -92,6 +122,36 @@ export const MODERATION_QUEUE_INDEXED_FIELDS = [
|
|
|
92
122
|
export const DEFAULT_MODERATION_QUEUE_DATA = {
|
|
93
123
|
status: "pending",
|
|
94
124
|
};
|
|
125
|
+
/*
|
|
126
|
+
* Runtime companions for the three report unions above.
|
|
127
|
+
*
|
|
128
|
+
* Keyed `Record<Union, true>` rather than written as arrays, because that is
|
|
129
|
+
* the only shape where BOTH mistakes are compile errors: a member added to the
|
|
130
|
+
* union and forgotten here, AND a value here that is not a real member. An
|
|
131
|
+
* array literal catches neither, which is how ten independent enumerations of
|
|
132
|
+
* `ListingType` came to disagree (Recurrent Root Cause #61).
|
|
133
|
+
*/
|
|
134
|
+
const REPORT_ENTITY_TYPE_MAP = {
|
|
135
|
+
product: true,
|
|
136
|
+
store: true,
|
|
137
|
+
review: true,
|
|
138
|
+
event: true,
|
|
139
|
+
user: true,
|
|
140
|
+
blog: true,
|
|
141
|
+
comment: true,
|
|
142
|
+
};
|
|
143
|
+
export const REPORT_ENTITY_TYPES = Object.keys(REPORT_ENTITY_TYPE_MAP);
|
|
144
|
+
const REPORT_REASON_MAP = {
|
|
145
|
+
scam: true,
|
|
146
|
+
counterfeit: true,
|
|
147
|
+
prohibited: true,
|
|
148
|
+
inappropriate: true,
|
|
149
|
+
harassment: true,
|
|
150
|
+
spam: true,
|
|
151
|
+
"ip-violation": true,
|
|
152
|
+
other: true,
|
|
153
|
+
};
|
|
154
|
+
export const REPORT_REASONS = Object.keys(REPORT_REASON_MAP);
|
|
95
155
|
export const REPORTS_COLLECTION = "reports";
|
|
96
156
|
export const REPORT_INDEXED_FIELDS = [
|
|
97
157
|
"entityType",
|