@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,53 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { StoreGoogleConfigDocument } from "./firestore";
|
|
3
|
+
/**
|
|
4
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
5
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
6
|
+
*/
|
|
7
|
+
export declare const storeGoogleConfigUpdateSchema: z.ZodObject<{
|
|
8
|
+
isConnected: z.ZodOptional<z.ZodBoolean>;
|
|
9
|
+
placeId: z.ZodOptional<z.ZodString>;
|
|
10
|
+
businessName: z.ZodOptional<z.ZodString>;
|
|
11
|
+
}, "strict", z.ZodTypeAny, {
|
|
12
|
+
placeId?: string | undefined;
|
|
13
|
+
isConnected?: boolean | undefined;
|
|
14
|
+
businessName?: string | undefined;
|
|
15
|
+
}, {
|
|
16
|
+
placeId?: string | undefined;
|
|
17
|
+
isConnected?: boolean | undefined;
|
|
18
|
+
businessName?: string | undefined;
|
|
19
|
+
}>;
|
|
20
|
+
export type StoreGoogleConfigFormValues = z.infer<typeof storeGoogleConfigUpdateSchema>;
|
|
21
|
+
/**
|
|
22
|
+
* What the seller's own settings page may see.
|
|
23
|
+
*
|
|
24
|
+
* An ALLOW-list, built as a new object — never the document with keys deleted.
|
|
25
|
+
* A deny-list publishes every field nobody thought to remove, including ones
|
|
26
|
+
* the interface does not declare, which is exactly how a decrypted API token
|
|
27
|
+
* and an unmasked ad-credentials blob reached anonymous callers before
|
|
28
|
+
* (Recurrent Root Cause #70).
|
|
29
|
+
*
|
|
30
|
+
* PUBLIC (to the store owner):
|
|
31
|
+
* storeId, isConnected — what the page renders
|
|
32
|
+
* placeId, businessName — what the page lets them edit
|
|
33
|
+
* averageRating, totalReviews, lastSyncedAt — sync output they need to see
|
|
34
|
+
* id, createdAt, updatedAt — ordinary record metadata
|
|
35
|
+
*
|
|
36
|
+
* PRIVATE:
|
|
37
|
+
* oauthRefreshToken — a long-lived Google credential with no reader and no
|
|
38
|
+
* writer anywhere in either tree. It was being sent to the browser on every
|
|
39
|
+
* load simply because the route returned the document whole.
|
|
40
|
+
*/
|
|
41
|
+
export declare function toSellerGoogleConfig(doc: StoreGoogleConfigDocument): {
|
|
42
|
+
id: string;
|
|
43
|
+
storeId: string;
|
|
44
|
+
isConnected: boolean;
|
|
45
|
+
placeId: string | undefined;
|
|
46
|
+
businessName: string | undefined;
|
|
47
|
+
averageRating: number | undefined;
|
|
48
|
+
totalReviews: number | undefined;
|
|
49
|
+
lastSyncedAt: Date | undefined;
|
|
50
|
+
createdAt: Date;
|
|
51
|
+
updatedAt: Date;
|
|
52
|
+
};
|
|
53
|
+
export type SellerGoogleConfig = ReturnType<typeof toSellerGoogleConfig>;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: `PUT /api/store/google-reviews` spread the raw request body into
|
|
3
|
+
* Firestore on both the create and the update branch, with `storeId`
|
|
4
|
+
* pinned and nothing else checked.
|
|
5
|
+
*
|
|
6
|
+
* ## 🛑 The field that makes this worth doing carefully
|
|
7
|
+
*
|
|
8
|
+
* `StoreGoogleConfigDocument` declares `oauthRefreshToken` — a long-lived
|
|
9
|
+
* Google credential. The raw spread meant a request body could set it, and the
|
|
10
|
+
* sibling `GET` returns the document WHOLE, so it was also being sent to the
|
|
11
|
+
* browser on every load of the seller's Google Reviews settings page.
|
|
12
|
+
*
|
|
13
|
+
* It is scoped to the caller's own store, so this is not a cross-tenant leak.
|
|
14
|
+
* It is still a secret in a page payload for no reason: a repo-wide grep finds
|
|
15
|
+
* **no reader and no writer** for that field anywhere — nothing sets it and
|
|
16
|
+
* nothing consumes it. Per the public-projection rule, a field nobody can name
|
|
17
|
+
* a reader for is private by default.
|
|
18
|
+
*
|
|
19
|
+
* So this schema deliberately does NOT declare it, and the route projects it
|
|
20
|
+
* out of the response. The field itself is left on the document rather than
|
|
21
|
+
* deleted — removing a schema field is a data-model change and deserves its
|
|
22
|
+
* own decision, not a drive-by inside a validation fix.
|
|
23
|
+
*
|
|
24
|
+
* ## `averageRating` / `totalReviews` / `lastSyncedAt` are absent too
|
|
25
|
+
*
|
|
26
|
+
* Those are SYNC OUTPUT — what Google last told us. A seller typing their own
|
|
27
|
+
* review count in is not configuration, it is fabricating the number the
|
|
28
|
+
* storefront displays.
|
|
29
|
+
*
|
|
30
|
+
* EXPORTS:
|
|
31
|
+
* storeGoogleConfigUpdateSchema, toSellerGoogleConfig,
|
|
32
|
+
* type StoreGoogleConfigFormValues, type SellerGoogleConfig
|
|
33
|
+
*
|
|
34
|
+
* @tag domain:store-extensions,google-reviews
|
|
35
|
+
* @tag layer:schema
|
|
36
|
+
* @tag pattern:none
|
|
37
|
+
* @tag access:isomorphic
|
|
38
|
+
* @tag consumers:/api/store/google-reviews
|
|
39
|
+
* @tag sideEffects:none
|
|
40
|
+
*/
|
|
41
|
+
import { z } from "zod";
|
|
42
|
+
import { annotate } from "../../shell/field-ui-meta";
|
|
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 storeGoogleConfigUpdateSchema = z
|
|
48
|
+
.object({
|
|
49
|
+
isConnected: annotate(z.boolean().optional(), {
|
|
50
|
+
section: "google",
|
|
51
|
+
sectionLabel: "Google Reviews",
|
|
52
|
+
sectionRequired: true,
|
|
53
|
+
quick: true,
|
|
54
|
+
order: 1,
|
|
55
|
+
row: "quarter",
|
|
56
|
+
}),
|
|
57
|
+
placeId: annotate(z.string().max(256).optional(), {
|
|
58
|
+
section: "google",
|
|
59
|
+
quick: true,
|
|
60
|
+
order: 2,
|
|
61
|
+
row: "pair",
|
|
62
|
+
help: "The Google Place ID for this store's listing.",
|
|
63
|
+
}),
|
|
64
|
+
businessName: annotate(z.string().max(200).optional(), {
|
|
65
|
+
section: "google",
|
|
66
|
+
quick: true,
|
|
67
|
+
order: 3,
|
|
68
|
+
row: "pair",
|
|
69
|
+
}),
|
|
70
|
+
})
|
|
71
|
+
.strict();
|
|
72
|
+
/**
|
|
73
|
+
* What the seller's own settings page may see.
|
|
74
|
+
*
|
|
75
|
+
* An ALLOW-list, built as a new object — never the document with keys deleted.
|
|
76
|
+
* A deny-list publishes every field nobody thought to remove, including ones
|
|
77
|
+
* the interface does not declare, which is exactly how a decrypted API token
|
|
78
|
+
* and an unmasked ad-credentials blob reached anonymous callers before
|
|
79
|
+
* (Recurrent Root Cause #70).
|
|
80
|
+
*
|
|
81
|
+
* PUBLIC (to the store owner):
|
|
82
|
+
* storeId, isConnected — what the page renders
|
|
83
|
+
* placeId, businessName — what the page lets them edit
|
|
84
|
+
* averageRating, totalReviews, lastSyncedAt — sync output they need to see
|
|
85
|
+
* id, createdAt, updatedAt — ordinary record metadata
|
|
86
|
+
*
|
|
87
|
+
* PRIVATE:
|
|
88
|
+
* oauthRefreshToken — a long-lived Google credential with no reader and no
|
|
89
|
+
* writer anywhere in either tree. It was being sent to the browser on every
|
|
90
|
+
* load simply because the route returned the document whole.
|
|
91
|
+
*/
|
|
92
|
+
export function toSellerGoogleConfig(doc) {
|
|
93
|
+
return {
|
|
94
|
+
id: doc.id,
|
|
95
|
+
storeId: doc.storeId,
|
|
96
|
+
isConnected: doc.isConnected,
|
|
97
|
+
placeId: doc.placeId,
|
|
98
|
+
businessName: doc.businessName,
|
|
99
|
+
averageRating: doc.averageRating,
|
|
100
|
+
totalReviews: doc.totalReviews,
|
|
101
|
+
lastSyncedAt: doc.lastSyncedAt,
|
|
102
|
+
createdAt: doc.createdAt,
|
|
103
|
+
updatedAt: doc.updatedAt,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
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 itemRequestCreateSchema: z.ZodObject<{
|
|
7
|
+
title: z.ZodString;
|
|
8
|
+
description: z.ZodString;
|
|
9
|
+
category: z.ZodOptional<z.ZodString>;
|
|
10
|
+
brand: z.ZodOptional<z.ZodString>;
|
|
11
|
+
maxBudget: z.ZodOptional<z.ZodNumber>;
|
|
12
|
+
imageUrls: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
13
|
+
}, "strict", z.ZodTypeAny, {
|
|
14
|
+
title: string;
|
|
15
|
+
description: string;
|
|
16
|
+
brand?: string | undefined;
|
|
17
|
+
category?: string | undefined;
|
|
18
|
+
imageUrls?: string[] | undefined;
|
|
19
|
+
maxBudget?: number | undefined;
|
|
20
|
+
}, {
|
|
21
|
+
title: string;
|
|
22
|
+
description: string;
|
|
23
|
+
brand?: string | undefined;
|
|
24
|
+
category?: string | undefined;
|
|
25
|
+
imageUrls?: string[] | undefined;
|
|
26
|
+
maxBudget?: number | undefined;
|
|
27
|
+
}>;
|
|
28
|
+
export type ItemRequestCreateValues = z.infer<typeof itemRequestCreateSchema>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: `POST /api/item-requests` spread the raw body into Firestore, and this
|
|
3
|
+
* one is READ BY THE PUBLIC — `GET /api/item-requests` is `auth: false`
|
|
4
|
+
* and returns the open list to anyone.
|
|
5
|
+
*
|
|
6
|
+
* const body = await parseJsonBody<FirestoreDocument>(request);
|
|
7
|
+
* await itemRequestsRepository.create({ ...body, opUserId, ..., replies: [], replyCount: 0 });
|
|
8
|
+
*
|
|
9
|
+
* So an unvalidated write here is an unvalidated PUBLISH. A request could
|
|
10
|
+
* be created with no title and no description, and a caller could set
|
|
11
|
+
* `approvedAt` / `approvedBy` — the fields that record a moderator having
|
|
12
|
+
* cleared it.
|
|
13
|
+
*
|
|
14
|
+
* `status`, `replies` and `replyCount` were pinned server-side, so the
|
|
15
|
+
* approval GATE itself held; what a caller could forge was the RECORD of
|
|
16
|
+
* approval, which is the part a human reads when deciding whether it has
|
|
17
|
+
* already been looked at.
|
|
18
|
+
*
|
|
19
|
+
* WHAT: The create contract — title and description required, budget bounded,
|
|
20
|
+
* and nothing a moderator owns.
|
|
21
|
+
*
|
|
22
|
+
* ## `maxBudget` is coerced and bounded
|
|
23
|
+
*
|
|
24
|
+
* It arrives from a number input as a string. Uncoerced it was written to
|
|
25
|
+
* Firestore as a string, and a later numeric comparison against it would sort
|
|
26
|
+
* lexically — the quiet half of the same class as the `resolvedAt` string that
|
|
27
|
+
* was being written into a Date field on the reports route.
|
|
28
|
+
*
|
|
29
|
+
* EXPORTS: itemRequestCreateSchema, type ItemRequestCreateValues
|
|
30
|
+
*
|
|
31
|
+
* @tag domain:store-extensions,item-requests
|
|
32
|
+
* @tag layer:schema
|
|
33
|
+
* @tag pattern:none
|
|
34
|
+
* @tag access:isomorphic
|
|
35
|
+
* @tag consumers:/api/item-requests
|
|
36
|
+
* @tag sideEffects:none
|
|
37
|
+
*/
|
|
38
|
+
import { z } from "zod";
|
|
39
|
+
import { annotate } from "../../shell/field-ui-meta";
|
|
40
|
+
/**
|
|
41
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
42
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
43
|
+
*/
|
|
44
|
+
export const itemRequestCreateSchema = z
|
|
45
|
+
.object({
|
|
46
|
+
title: annotate(z
|
|
47
|
+
.string()
|
|
48
|
+
.min(3, "Give the request a title of at least 3 characters.")
|
|
49
|
+
.max(200, "Keep the title under 200 characters."), {
|
|
50
|
+
section: "basics",
|
|
51
|
+
sectionLabel: "What are you looking for?",
|
|
52
|
+
sectionRequired: true,
|
|
53
|
+
quick: true,
|
|
54
|
+
order: 1,
|
|
55
|
+
row: "full",
|
|
56
|
+
}),
|
|
57
|
+
description: annotate(z
|
|
58
|
+
.string()
|
|
59
|
+
.min(10, "Describe what you're after in at least 10 characters.")
|
|
60
|
+
.max(5000, "Keep the description under 5000 characters."), { section: "basics", quick: true, order: 2, row: "full", kind: "textarea" }),
|
|
61
|
+
category: annotate(z.string().max(120).optional(), {
|
|
62
|
+
section: "basics",
|
|
63
|
+
order: 3,
|
|
64
|
+
row: "pair",
|
|
65
|
+
}),
|
|
66
|
+
brand: annotate(z.string().max(120).optional(), {
|
|
67
|
+
section: "basics",
|
|
68
|
+
order: 4,
|
|
69
|
+
row: "pair",
|
|
70
|
+
}),
|
|
71
|
+
// Coerced — see the header. Bounded so a typo cannot record a budget that
|
|
72
|
+
// reads as real money.
|
|
73
|
+
maxBudget: annotate(z.coerce
|
|
74
|
+
.number()
|
|
75
|
+
.min(0, "A budget cannot be negative.")
|
|
76
|
+
.max(10000000, "That budget looks like a typo.")
|
|
77
|
+
.optional(), { section: "basics", order: 5, row: "pair", kind: "number" }),
|
|
78
|
+
imageUrls: annotate(z.array(z.string().url("Each image must be a URL.")).max(10).optional(), { section: "media", sectionLabel: "Photos", order: 1, row: "full", kind: "media" }),
|
|
79
|
+
})
|
|
80
|
+
.strict();
|
|
@@ -0,0 +1,78 @@
|
|
|
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 listingTemplateFormSchema: z.ZodObject<{
|
|
7
|
+
name: z.ZodString;
|
|
8
|
+
description: z.ZodOptional<z.ZodString>;
|
|
9
|
+
listingType: z.ZodEnum<["standard", "auction", "pre-order", "prize-draw", "bundle", "classified", "digital-code", "live", "art", "stickers"]>;
|
|
10
|
+
defaults: z.ZodRecord<z.ZodString, z.ZodType<import("../../..").FirestoreValue, z.ZodTypeDef, import("../../..").FirestoreValue>>;
|
|
11
|
+
isShared: z.ZodBoolean;
|
|
12
|
+
isActive: z.ZodBoolean;
|
|
13
|
+
}, "strip", z.ZodTypeAny, {
|
|
14
|
+
name: string;
|
|
15
|
+
listingType: "art" | "stickers" | "classified" | "standard" | "auction" | "pre-order" | "prize-draw" | "digital-code" | "live" | "bundle";
|
|
16
|
+
isActive: boolean;
|
|
17
|
+
isShared: boolean;
|
|
18
|
+
defaults: Record<string, import("../../..").FirestoreValue>;
|
|
19
|
+
description?: string | undefined;
|
|
20
|
+
}, {
|
|
21
|
+
name: string;
|
|
22
|
+
listingType: "art" | "stickers" | "classified" | "standard" | "auction" | "pre-order" | "prize-draw" | "digital-code" | "live" | "bundle";
|
|
23
|
+
isActive: boolean;
|
|
24
|
+
isShared: boolean;
|
|
25
|
+
defaults: Record<string, import("../../..").FirestoreValue>;
|
|
26
|
+
description?: string | undefined;
|
|
27
|
+
}>;
|
|
28
|
+
export type ListingTemplateFormValues = z.infer<typeof listingTemplateFormSchema>;
|
|
29
|
+
/**
|
|
30
|
+
* Create contract. `storeId`/`ownerId` are deliberately absent: the route sets
|
|
31
|
+
* both from the session, so a caller cannot create a template inside someone
|
|
32
|
+
* else's store by adding a field to the body.
|
|
33
|
+
*/
|
|
34
|
+
export declare const listingTemplateCreateSchema: z.ZodObject<{
|
|
35
|
+
name: z.ZodString;
|
|
36
|
+
description: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
37
|
+
listingType: z.ZodEnum<["standard", "auction", "pre-order", "prize-draw", "bundle", "classified", "digital-code", "live", "art", "stickers"]>;
|
|
38
|
+
isActive: z.ZodOptional<z.ZodBoolean>;
|
|
39
|
+
isShared: z.ZodOptional<z.ZodBoolean>;
|
|
40
|
+
defaults: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<import("../../..").FirestoreValue, z.ZodTypeDef, import("../../..").FirestoreValue>>>;
|
|
41
|
+
}, "strip", z.ZodTypeAny, {
|
|
42
|
+
name: string;
|
|
43
|
+
listingType: "art" | "stickers" | "classified" | "standard" | "auction" | "pre-order" | "prize-draw" | "digital-code" | "live" | "bundle";
|
|
44
|
+
description?: string | undefined;
|
|
45
|
+
isActive?: boolean | undefined;
|
|
46
|
+
isShared?: boolean | undefined;
|
|
47
|
+
defaults?: Record<string, import("../../..").FirestoreValue> | undefined;
|
|
48
|
+
}, {
|
|
49
|
+
name: string;
|
|
50
|
+
listingType: "art" | "stickers" | "classified" | "standard" | "auction" | "pre-order" | "prize-draw" | "digital-code" | "live" | "bundle";
|
|
51
|
+
description?: string | undefined;
|
|
52
|
+
isActive?: boolean | undefined;
|
|
53
|
+
isShared?: boolean | undefined;
|
|
54
|
+
defaults?: Record<string, import("../../..").FirestoreValue> | undefined;
|
|
55
|
+
}>;
|
|
56
|
+
/** Update contract — every field optional, and the same ownership fields absent. */
|
|
57
|
+
export declare const listingTemplateUpdateSchema: z.ZodObject<{
|
|
58
|
+
name: z.ZodOptional<z.ZodString>;
|
|
59
|
+
description: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
60
|
+
listingType: z.ZodOptional<z.ZodEnum<["standard", "auction", "pre-order", "prize-draw", "bundle", "classified", "digital-code", "live", "art", "stickers"]>>;
|
|
61
|
+
defaults: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<import("../../..").FirestoreValue, z.ZodTypeDef, import("../../..").FirestoreValue>>>;
|
|
62
|
+
isShared: z.ZodOptional<z.ZodBoolean>;
|
|
63
|
+
isActive: z.ZodOptional<z.ZodBoolean>;
|
|
64
|
+
}, "strip", z.ZodTypeAny, {
|
|
65
|
+
name?: string | undefined;
|
|
66
|
+
description?: string | undefined;
|
|
67
|
+
listingType?: "art" | "stickers" | "classified" | "standard" | "auction" | "pre-order" | "prize-draw" | "digital-code" | "live" | "bundle" | undefined;
|
|
68
|
+
isActive?: boolean | undefined;
|
|
69
|
+
isShared?: boolean | undefined;
|
|
70
|
+
defaults?: Record<string, import("../../..").FirestoreValue> | undefined;
|
|
71
|
+
}, {
|
|
72
|
+
name?: string | undefined;
|
|
73
|
+
description?: string | undefined;
|
|
74
|
+
listingType?: "art" | "stickers" | "classified" | "standard" | "auction" | "pre-order" | "prize-draw" | "digital-code" | "live" | "bundle" | undefined;
|
|
75
|
+
isActive?: boolean | undefined;
|
|
76
|
+
isShared?: boolean | undefined;
|
|
77
|
+
defaults?: Record<string, import("../../..").FirestoreValue> | undefined;
|
|
78
|
+
}>;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: `/store/listing-templates/[id]/edit` was a wholly broken page. The route
|
|
3
|
+
* it calls — `/api/store/listing-templates/[id]` — did not exist, while
|
|
4
|
+
* `src/constants/api.ts` defined the endpoint, the edit page called it
|
|
5
|
+
* three times (GET on load, PATCH on save, DELETE), and the list page
|
|
6
|
+
* rendered an Edit button pointing straight at it. A seller clicking Edit
|
|
7
|
+
* got a page that 404'd on load, on save and on delete.
|
|
8
|
+
* Root Cause #37's dead-route shape, with a real page and a real button
|
|
9
|
+
* in front of it.
|
|
10
|
+
* WHAT: One schema for the listing-template form AND the route that receives
|
|
11
|
+
* it, so the two cannot drift.
|
|
12
|
+
*
|
|
13
|
+
* ## `defaults` stays open on purpose
|
|
14
|
+
*
|
|
15
|
+
* It is a JSON blob of per-listing-type field defaults — the whole point is
|
|
16
|
+
* that it holds whatever fields the target listing type has. `z.record()`
|
|
17
|
+
* rather than a named shape: modelling it would mean restating every listing
|
|
18
|
+
* type's field set here, and getting that wrong strips a seller's saved
|
|
19
|
+
* defaults on the next save (`z.object()` drops unknown keys). The page
|
|
20
|
+
* already `JSON.parse`s it and reports malformed JSON.
|
|
21
|
+
*
|
|
22
|
+
* EXPORTS:
|
|
23
|
+
* listingTemplateFormSchema, listingTemplateCreateSchema,
|
|
24
|
+
* listingTemplateUpdateSchema, type ListingTemplateFormValues
|
|
25
|
+
*
|
|
26
|
+
* @tag domain:store-extensions
|
|
27
|
+
* @tag layer:schema
|
|
28
|
+
* @tag pattern:none
|
|
29
|
+
* @tag access:isomorphic
|
|
30
|
+
* @tag consumers:store/listing-templates pages,/api/store/listing-templates
|
|
31
|
+
* @tag sideEffects:none
|
|
32
|
+
*/
|
|
33
|
+
import { z } from "zod";
|
|
34
|
+
import { annotate } from "../../shell/field-ui-meta";
|
|
35
|
+
import { LISTING_TEMPLATE_TYPES } from "./firestore";
|
|
36
|
+
import { firestoreValueSchema } from "../../../schemas/firestore-value";
|
|
37
|
+
/**
|
|
38
|
+
* Derived from the runtime array, never restated. A hand-written copy here
|
|
39
|
+
* would be the eleventh independent enumeration of this union — and the tenth
|
|
40
|
+
* had already drifted, which is how `art`/`stickers` came to be unsaveable as
|
|
41
|
+
* templates while `bundle` lingered.
|
|
42
|
+
*/
|
|
43
|
+
const listingTemplateTypeSchema = z.enum(LISTING_TEMPLATE_TYPES);
|
|
44
|
+
/**
|
|
45
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
46
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
47
|
+
*/
|
|
48
|
+
export const listingTemplateFormSchema = z.object({
|
|
49
|
+
name: annotate(z.string().min(1, "Name is required").max(120, "Keep the name under 120 characters."), {
|
|
50
|
+
section: "basics", sectionLabel: "Template", sectionRequired: true,
|
|
51
|
+
quick: true, order: 1, row: "full",
|
|
52
|
+
}),
|
|
53
|
+
description: annotate(z.string().max(500, "Keep the description under 500 characters.").optional(), {
|
|
54
|
+
section: "basics", order: 2, row: "full",
|
|
55
|
+
}),
|
|
56
|
+
listingType: annotate(listingTemplateTypeSchema, {
|
|
57
|
+
section: "basics", quick: true, order: 3, row: "pair",
|
|
58
|
+
}),
|
|
59
|
+
// Typed as a Firestore value tree, not `unknown`: `unknown` does not satisfy
|
|
60
|
+
// `ListingTemplateDocument.defaults` (a `FirestoreDocument`), and casting at
|
|
61
|
+
// the repository call to paper over that would defeat the only type-level
|
|
62
|
+
// signal that the shapes agree.
|
|
63
|
+
defaults: annotate(z.record(firestoreValueSchema), {
|
|
64
|
+
section: "defaults", sectionLabel: "Default field values",
|
|
65
|
+
order: 1, row: "full", kind: "list",
|
|
66
|
+
help: "JSON applied to a new listing when this template is chosen.",
|
|
67
|
+
}),
|
|
68
|
+
isShared: annotate(z.boolean(), {
|
|
69
|
+
section: "visibility", sectionLabel: "Visibility", order: 1, row: "quarter",
|
|
70
|
+
}),
|
|
71
|
+
isActive: annotate(z.boolean(), {
|
|
72
|
+
section: "visibility", order: 2, row: "quarter",
|
|
73
|
+
}),
|
|
74
|
+
});
|
|
75
|
+
/**
|
|
76
|
+
* Create contract. `storeId`/`ownerId` are deliberately absent: the route sets
|
|
77
|
+
* both from the session, so a caller cannot create a template inside someone
|
|
78
|
+
* else's store by adding a field to the body.
|
|
79
|
+
*/
|
|
80
|
+
export const listingTemplateCreateSchema = listingTemplateFormSchema.partial({
|
|
81
|
+
description: true,
|
|
82
|
+
isShared: true,
|
|
83
|
+
isActive: true,
|
|
84
|
+
defaults: true,
|
|
85
|
+
});
|
|
86
|
+
/** Update contract — every field optional, and the same ownership fields absent. */
|
|
87
|
+
export const listingTemplateUpdateSchema = listingTemplateFormSchema.partial();
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* The statuses a human review can produce.
|
|
4
|
+
*
|
|
5
|
+
* `satisfies readonly ModerationStatus[]` is load-bearing: it is what stops
|
|
6
|
+
* this becoming an independent, drifting copy of the union.
|
|
7
|
+
*/
|
|
8
|
+
export declare const MODERATION_REVIEWER_STATUSES: readonly ["approved", "rejected"];
|
|
9
|
+
/**
|
|
10
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
11
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
12
|
+
*/
|
|
13
|
+
export declare const moderationReviewFormSchema: z.ZodEffects<z.ZodObject<{
|
|
14
|
+
status: z.ZodEnum<["approved", "rejected"]>;
|
|
15
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
16
|
+
}, "strict", z.ZodTypeAny, {
|
|
17
|
+
status: "approved" | "rejected";
|
|
18
|
+
reason?: string | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
status: "approved" | "rejected";
|
|
21
|
+
reason?: string | undefined;
|
|
22
|
+
}>, {
|
|
23
|
+
status: "approved" | "rejected";
|
|
24
|
+
reason?: string | undefined;
|
|
25
|
+
}, {
|
|
26
|
+
status: "approved" | "rejected";
|
|
27
|
+
reason?: string | undefined;
|
|
28
|
+
}>;
|
|
29
|
+
export type ModerationReviewFormValues = z.infer<typeof moderationReviewFormSchema>;
|
|
30
|
+
/**
|
|
31
|
+
* Route contract. Identical to the form contract — a review is a single
|
|
32
|
+
* atomic decision, so there is no partial variant.
|
|
33
|
+
*/
|
|
34
|
+
export declare const moderationReviewUpdateSchema: z.ZodEffects<z.ZodObject<{
|
|
35
|
+
status: z.ZodEnum<["approved", "rejected"]>;
|
|
36
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
37
|
+
}, "strict", z.ZodTypeAny, {
|
|
38
|
+
status: "approved" | "rejected";
|
|
39
|
+
reason?: string | undefined;
|
|
40
|
+
}, {
|
|
41
|
+
status: "approved" | "rejected";
|
|
42
|
+
reason?: string | undefined;
|
|
43
|
+
}>, {
|
|
44
|
+
status: "approved" | "rejected";
|
|
45
|
+
reason?: string | undefined;
|
|
46
|
+
}, {
|
|
47
|
+
status: "approved" | "rejected";
|
|
48
|
+
reason?: string | undefined;
|
|
49
|
+
}>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: `PATCH /api/admin/moderation/[id]` spread the raw request body straight
|
|
3
|
+
* into Firestore:
|
|
4
|
+
*
|
|
5
|
+
* const body = await parseJsonBody<Record<string, JsonValue>>(request);
|
|
6
|
+
* await moderationQueueRepository.update(id, { ...body, reviewerId, reviewedAt });
|
|
7
|
+
*
|
|
8
|
+
* There was no Zod anywhere on this path — not on the route, not on
|
|
9
|
+
* either of the two client surfaces that call it. Under `ROLES_ADMIN_MOD`
|
|
10
|
+
* a caller could write ANY key onto a moderation record, including
|
|
11
|
+
* `entityId`, `ownerId`, `submittedAt` or an invented one, and could set
|
|
12
|
+
* `status` to any string at all — the real `ModerationStatus` union was
|
|
13
|
+
* never consulted.
|
|
14
|
+
*
|
|
15
|
+
* Two client surfaces call it and neither validated: the queue page's
|
|
16
|
+
* inline Approve/Reject controls and `ModerationDetailActions`. Both let
|
|
17
|
+
* a rejection be submitted with an EMPTY reason, so content could be
|
|
18
|
+
* blocked with no record of why.
|
|
19
|
+
* WHAT: One schema shared by the route and both client surfaces.
|
|
20
|
+
*
|
|
21
|
+
* ## A reviewer may only set the two statuses a REVIEW produces
|
|
22
|
+
*
|
|
23
|
+
* `ModerationStatus` has four values, but `pending` is the initial state and
|
|
24
|
+
* `auto-approved` is what the system writes when nothing needed a human. A
|
|
25
|
+
* reviewer setting either by hand would be falsifying the record — so the
|
|
26
|
+
* settable set is the subset below, declared `satisfies readonly
|
|
27
|
+
* ModerationStatus[]` rather than restated, which makes a value outside the
|
|
28
|
+
* real union a COMPILE error instead of a filter that matches nothing
|
|
29
|
+
* (Recurrent Root Cause #33).
|
|
30
|
+
*
|
|
31
|
+
* ## `reviewerId` / `reviewedAt` are absent on purpose
|
|
32
|
+
*
|
|
33
|
+
* The route sets both from the session and the server clock. Accepting them
|
|
34
|
+
* here would let a caller attribute a review to somebody else, or backdate it.
|
|
35
|
+
*
|
|
36
|
+
* EXPORTS:
|
|
37
|
+
* moderationReviewFormSchema, moderationReviewUpdateSchema,
|
|
38
|
+
* MODERATION_REVIEWER_STATUSES, type ModerationReviewFormValues
|
|
39
|
+
*
|
|
40
|
+
* @tag domain:store-extensions,moderation
|
|
41
|
+
* @tag layer:schema
|
|
42
|
+
* @tag pattern:none
|
|
43
|
+
* @tag access:isomorphic
|
|
44
|
+
* @tag consumers:admin/moderation pages,/api/admin/moderation/[id]
|
|
45
|
+
* @tag sideEffects:none
|
|
46
|
+
*/
|
|
47
|
+
import { z } from "zod";
|
|
48
|
+
import { annotate } from "../../shell/field-ui-meta";
|
|
49
|
+
/**
|
|
50
|
+
* The statuses a human review can produce.
|
|
51
|
+
*
|
|
52
|
+
* `satisfies readonly ModerationStatus[]` is load-bearing: it is what stops
|
|
53
|
+
* this becoming an independent, drifting copy of the union.
|
|
54
|
+
*/
|
|
55
|
+
export const MODERATION_REVIEWER_STATUSES = [
|
|
56
|
+
"approved",
|
|
57
|
+
"rejected",
|
|
58
|
+
];
|
|
59
|
+
/**
|
|
60
|
+
* 🛑 `annotate()` must be the OUTERMOST call on each field — it keys a WeakMap
|
|
61
|
+
* by schema instance and every zod wrapper returns a new one.
|
|
62
|
+
*/
|
|
63
|
+
export const moderationReviewFormSchema = z
|
|
64
|
+
.object({
|
|
65
|
+
status: annotate(z.enum(MODERATION_REVIEWER_STATUSES), {
|
|
66
|
+
section: "review",
|
|
67
|
+
sectionLabel: "Review decision",
|
|
68
|
+
sectionRequired: true,
|
|
69
|
+
quick: true,
|
|
70
|
+
order: 1,
|
|
71
|
+
row: "pair",
|
|
72
|
+
}),
|
|
73
|
+
reason: annotate(z.string().max(500, "Keep the reason under 500 characters.").optional(), {
|
|
74
|
+
section: "review",
|
|
75
|
+
order: 2,
|
|
76
|
+
row: "full",
|
|
77
|
+
kind: "textarea",
|
|
78
|
+
help: "Required when rejecting — this is the record of why the media was blocked.",
|
|
79
|
+
}),
|
|
80
|
+
})
|
|
81
|
+
// Unknown keys are a 400, not a silent drop. A plain `z.object()` would
|
|
82
|
+
// STRIP them, which is the quieter half of the same bug: the caller is told
|
|
83
|
+
// the write succeeded and the key it sent simply vanished.
|
|
84
|
+
.strict()
|
|
85
|
+
.superRefine((v, ctx) => {
|
|
86
|
+
// An approval needs no justification; a rejection does. Blocking someone's
|
|
87
|
+
// media with an empty `reason` leaves the owner, and the next reviewer,
|
|
88
|
+
// with no way to know what was wrong with it.
|
|
89
|
+
if (v.status === "rejected" && !v.reason?.trim()) {
|
|
90
|
+
ctx.addIssue({
|
|
91
|
+
code: z.ZodIssueCode.custom,
|
|
92
|
+
path: ["reason"],
|
|
93
|
+
message: "Give a reason for the rejection.",
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
/**
|
|
98
|
+
* Route contract. Identical to the form contract — a review is a single
|
|
99
|
+
* atomic decision, so there is no partial variant.
|
|
100
|
+
*/
|
|
101
|
+
export const moderationReviewUpdateSchema = moderationReviewFormSchema;
|