@mohasinac/appkit 4.30.18 → 4.31.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/digital-code/CodeRevealPanel.js +5 -2
- package/dist/_internal/client/features/layout/DashboardLayoutClient.js +3 -3
- package/dist/_internal/client/features/layout/useSidebarSearch.d.ts +21 -5
- package/dist/_internal/client/features/layout/useSidebarSearch.js +27 -6
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +23 -3
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +106 -86
- package/dist/_internal/client/features/lottery/LotteryPullForm.d.ts +16 -5
- package/dist/_internal/client/features/lottery/LotteryPullForm.js +65 -40
- package/dist/_internal/client/features/maintenance/views/AnalysisRunnerView.js +5 -2
- package/dist/_internal/client/features/maintenance/views/CloudLogsListView.js +11 -3
- package/dist/_internal/client/hand-mode/HandModeProvider.js +2 -0
- package/dist/_internal/server/features/auctions/actions.js +14 -3
- package/dist/_internal/server/features/auctions/service.js +1 -1
- package/dist/_internal/server/features/auth/permissions.d.ts +2 -0
- package/dist/_internal/server/features/auth/permissions.js +3 -2
- package/dist/_internal/server/features/blog/data.js +2 -2
- package/dist/_internal/server/features/blog/service.js +3 -3
- package/dist/_internal/server/features/brands/data.js +1 -1
- package/dist/_internal/server/features/brands/service.js +3 -3
- package/dist/_internal/server/features/bundles/actions.js +6 -1
- package/dist/_internal/server/features/bundles/data.js +21 -4
- package/dist/_internal/server/features/cart/data.js +3 -1
- package/dist/_internal/server/features/cart/service.js +13 -2
- package/dist/_internal/server/features/categories/data.js +26 -6
- package/dist/_internal/server/features/classified/index.d.ts +0 -1
- package/dist/_internal/server/features/classified/index.js +0 -1
- package/dist/_internal/server/features/digital-code/index.d.ts +0 -1
- package/dist/_internal/server/features/digital-code/index.js +0 -1
- package/dist/_internal/server/features/events/actions.js +17 -4
- package/dist/_internal/server/features/events/data.js +1 -1
- package/dist/_internal/server/features/events/service.js +1 -1
- package/dist/_internal/server/features/grouped/data.js +7 -2
- package/dist/_internal/server/features/item-requests/data.js +1 -1
- package/dist/_internal/server/features/live/index.d.ts +0 -1
- package/dist/_internal/server/features/live/index.js +0 -1
- package/dist/_internal/server/features/lottery/actions.js +2 -2
- package/dist/_internal/server/features/lottery/data.js +1 -1
- package/dist/_internal/server/features/orders/actions.js +7 -7
- package/dist/_internal/server/features/orders/data.d.ts +1 -1
- package/dist/_internal/server/features/orders/data.js +14 -2
- package/dist/_internal/server/features/orders/service.js +1 -1
- package/dist/_internal/server/features/pre-orders/service.js +1 -1
- package/dist/_internal/server/features/prize-draws/actions.js +1 -1
- package/dist/_internal/server/features/products/data.js +21 -6
- package/dist/_internal/server/features/products/list-public.d.ts +9 -0
- package/dist/_internal/server/features/products/list-public.js +95 -7
- package/dist/_internal/server/features/products/service.js +1 -1
- package/dist/_internal/server/features/promotions/actions.js +1 -1
- package/dist/_internal/server/features/promotions/data.js +1 -1
- package/dist/_internal/server/features/promotions/service.js +1 -1
- package/dist/_internal/server/features/reviews/data.d.ts +1 -1
- package/dist/_internal/server/features/reviews/data.js +6 -1
- package/dist/_internal/server/features/reviews/og-data.js +1 -1
- package/dist/_internal/server/features/shared/listing-data-factory.js +7 -2
- package/dist/_internal/server/features/site-settings/adapters.d.ts +2 -2
- package/dist/_internal/server/features/site-settings/adapters.js +8 -5
- package/dist/_internal/server/features/stores/data.js +1 -1
- package/dist/_internal/server/features/sublisting-categories/data.js +1 -1
- package/dist/_internal/server/features/tester/visibility.d.ts +2 -1
- package/dist/_internal/server/features/tester/visibility.js +2 -2
- package/dist/_internal/server/functions/scheduled.d.ts +3 -1
- package/dist/_internal/server/functions/scheduled.js +27 -1
- package/dist/_internal/server/jobs/core/auctionSettlement.js +6 -1
- package/dist/_internal/server/jobs/core/hardBanCascade.js +4 -0
- package/dist/_internal/server/jobs/core/index.d.ts +2 -0
- package/dist/_internal/server/jobs/core/index.js +2 -0
- package/dist/_internal/server/jobs/core/onOrderStatusChange.js +7 -15
- package/dist/_internal/server/jobs/core/pageViewPrune.d.ts +10 -0
- package/dist/_internal/server/jobs/core/pageViewPrune.js +44 -0
- package/dist/_internal/server/jobs/core/pageViewRollup.d.ts +2 -0
- package/dist/_internal/server/jobs/core/pageViewRollup.js +87 -0
- package/dist/_internal/server/jobs/core/revenueRollup.js +7 -1
- package/dist/_internal/server/jobs/handlers/index.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/index.js +2 -0
- package/dist/_internal/server/jobs/handlers/pageViewPrune.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/pageViewPrune.js +2 -0
- package/dist/_internal/server/jobs/handlers/pageViewRollup.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/pageViewRollup.js +2 -0
- package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
- package/dist/_internal/shared/actions/action-registry.js +69 -22
- package/dist/_internal/shared/checkout/rules/classified.rule.d.ts +9 -4
- package/dist/_internal/shared/checkout/rules/classified.rule.js +7 -2
- package/dist/_internal/shared/features/layout/matchesNavQuery.d.ts +14 -0
- package/dist/_internal/shared/features/layout/matchesNavQuery.js +72 -0
- package/dist/_internal/shared/features/layout/types.d.ts +37 -1
- package/dist/_internal/shared/features/layout/types.js +19 -1
- package/dist/_internal/shared/features/notifications/action-url.d.ts +9 -1
- package/dist/_internal/shared/features/notifications/action-url.js +47 -0
- package/dist/_internal/shared/features/offers/config.d.ts +65 -0
- package/dist/_internal/shared/features/offers/config.js +73 -2
- package/dist/_internal/shared/features/orders/schema.d.ts +19 -1
- package/dist/_internal/shared/features/orders/schema.js +22 -2
- package/dist/_internal/shared/features/site-settings/types.d.ts +12 -3
- package/dist/_internal/shared/listing-types/capabilities.d.ts +8 -2
- package/dist/_internal/shared/listing-types/capabilities.js +6 -1
- package/dist/_internal/shared/listing-types/classified/ctas.js +6 -1
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +10 -5
- package/dist/_internal/shared/listing-types/feature-flags.js +11 -6
- package/dist/client/api/useApiQuery.js +17 -6
- package/dist/client.d.ts +38 -20
- package/dist/client.js +39 -14
- package/dist/configs/next.js +10 -2
- package/dist/constants/api-endpoints.d.ts +18 -54
- package/dist/constants/api-endpoints.js +6 -26
- package/dist/constants/field-names.d.ts +6 -24
- package/dist/constants/field-names.js +10 -27
- package/dist/constants/geo/countries.d.ts +50 -0
- package/dist/constants/geo/countries.js +129 -0
- package/dist/constants/geo/subdivisions.d.ts +13 -0
- package/dist/constants/geo/subdivisions.js +104 -0
- package/dist/constants/index.d.ts +2 -2
- package/dist/constants/index.js +2 -2
- package/dist/constants/table-keys.d.ts +24 -0
- package/dist/constants/table-keys.js +28 -0
- package/dist/contracts/client-realtime.d.ts +6 -0
- package/dist/contracts/extend.d.ts +0 -9
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/realtime-session.d.ts +12 -12
- package/dist/contracts/realtime-session.js +79 -77
- package/dist/core/browser.d.ts +1 -1
- package/dist/core/browser.js +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/site-config.d.ts +0 -3
- package/dist/core/site-config.js +0 -3
- package/dist/errors/index.d.ts +1 -1
- package/dist/errors/index.js +1 -1
- package/dist/errors/messages.d.ts +0 -8
- package/dist/errors/messages.js +0 -9
- package/dist/features/about/components/DeveloperView.js +7 -2
- package/dist/features/about/components/PolicyPageView.js +9 -1
- package/dist/features/about/components/PublicProfileView.js +23 -5
- package/dist/features/about/schemas/index.d.ts +8 -8
- package/dist/features/account/components/AddressFilters.js +32 -11
- package/dist/features/account/components/AddressForm.d.ts +26 -25
- package/dist/features/account/components/AddressForm.js +81 -103
- package/dist/features/account/components/AddressesIndexListing.js +8 -4
- package/dist/features/account/components/NotificationBell.js +4 -3
- package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
- package/dist/features/account/components/UserOffersPanel.js +1 -1
- package/dist/features/account/components/UserSidebar.d.ts +3 -4
- package/dist/features/account/components/UserSupportView.js +89 -58
- package/dist/features/account/components/index.d.ts +1 -7
- package/dist/features/account/components/index.js +0 -3
- package/dist/features/account/hooks/useAddresses.d.ts +4 -3
- package/dist/features/account/hooks/useAddresses.js +4 -6
- package/dist/features/account/hooks/useCollapsedSections.d.ts +51 -10
- package/dist/features/account/hooks/useCollapsedSections.js +211 -38
- package/dist/features/account/hooks/useProfile.d.ts +8 -0
- package/dist/features/account/index.d.ts +0 -3
- package/dist/features/account/index.js +0 -3
- package/dist/features/account/schemas/index.d.ts +0 -92
- package/dist/features/account/schemas/index.js +42 -20
- package/dist/features/addresses/components/AddressLocationFields.d.ts +13 -0
- package/dist/features/addresses/components/AddressLocationFields.js +41 -0
- package/dist/features/addresses/hooks/usePostalLookup.d.ts +17 -0
- package/dist/features/addresses/hooks/usePostalLookup.js +133 -0
- package/dist/features/addresses/schemas/address-form.d.ts +423 -0
- package/dist/features/addresses/schemas/address-form.js +212 -0
- package/dist/features/addresses/schemas/index.d.ts +1 -0
- package/dist/features/addresses/schemas/index.js +8 -0
- package/dist/features/admin/actions/admin-read-actions.d.ts +1 -1
- package/dist/features/admin/actions/index.d.ts +0 -1
- package/dist/features/admin/actions/index.js +0 -1
- package/dist/features/admin/actions/notification-actions.js +1 -41
- package/dist/features/admin/components/AdminActionIndexView.d.ts +32 -0
- package/dist/features/admin/components/AdminActionIndexView.js +128 -0
- package/dist/features/admin/components/AdminAdEditorView.js +159 -163
- package/dist/features/admin/components/AdminAddressEditorView.js +97 -55
- package/dist/features/admin/components/AdminBrandEditorView.d.ts +15 -0
- package/dist/features/admin/components/AdminBrandEditorView.js +113 -77
- package/dist/features/admin/components/AdminBundleEditorView.d.ts +19 -9
- package/dist/features/admin/components/AdminBundleEditorView.js +136 -168
- package/dist/features/admin/components/AdminCategoryEditorView.js +120 -43
- package/dist/features/admin/components/AdminCouponEditorView.js +145 -109
- package/dist/features/admin/components/AdminEmployeeEditorView.js +125 -56
- package/dist/features/admin/components/AdminFaqEditorView.js +112 -58
- package/dist/features/admin/components/AdminFeatureEditorView.js +108 -68
- package/dist/features/admin/components/AdminFulfillmentView.js +5 -2
- package/dist/features/admin/components/AdminMediaView.js +3 -3
- package/dist/features/admin/components/AdminNavEditorView.js +69 -44
- package/dist/features/admin/components/AdminOrderEditorView.js +47 -10
- package/dist/features/admin/components/AdminPrizeDrawsView.js +16 -2
- package/dist/features/admin/components/AdminSidebar.d.ts +11 -7
- package/dist/features/admin/components/AdminSiteSettingsView.js +37 -37
- package/dist/features/admin/components/AdminStoreEditorView.js +75 -52
- package/dist/features/admin/components/AdminSublistingCategoryEditorView.js +71 -30
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +95 -65
- package/dist/features/admin/components/BrandQuickCreateForm.d.ts +10 -0
- package/dist/features/admin/components/BrandQuickCreateForm.js +49 -26
- package/dist/features/admin/components/CategoryQuickCreateForm.d.ts +11 -0
- package/dist/features/admin/components/CategoryQuickCreateForm.js +48 -26
- package/dist/features/admin/components/index.d.ts +2 -2
- package/dist/features/admin/components/index.js +1 -1
- package/dist/features/admin/constants/site-settings-tabs.d.ts +120 -0
- package/dist/features/admin/constants/site-settings-tabs.js +152 -0
- package/dist/features/admin/index.d.ts +0 -3
- package/dist/features/admin/index.js +0 -2
- package/dist/features/admin/repository/analytics-rollup.repository.d.ts +35 -0
- package/dist/features/admin/repository/analytics-rollup.repository.js +30 -0
- package/dist/features/admin/schemas/admin-editor-forms.d.ts +56 -57
- package/dist/features/admin/schemas/admin-editor-forms.js +97 -54
- package/dist/features/admin/schemas/admin-ops-forms.d.ts +57 -5
- package/dist/features/admin/schemas/admin-ops-forms.js +104 -20
- package/dist/features/admin/schemas/admin-user-form.js +7 -0
- package/dist/features/admin/schemas/firestore.d.ts +48 -95
- package/dist/features/admin/schemas/firestore.js +15 -151
- package/dist/features/admin/schemas/nav-item-form.js +9 -2
- package/dist/features/admin/server.d.ts +0 -4
- package/dist/features/admin/server.js +0 -2
- package/dist/features/admin/types/index.d.ts +0 -7
- package/dist/features/analytics/repository/page-views.repository.d.ts +14 -0
- package/dist/features/analytics/repository/page-views.repository.js +24 -0
- package/dist/features/analytics/types.d.ts +1 -1
- package/dist/features/analytics/types.js +13 -0
- package/dist/features/auctions/components/AuctionDetailPageView.js +6 -2
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +3 -1
- package/dist/features/auth/actions/index.d.ts +0 -1
- package/dist/features/auth/actions/index.js +0 -1
- package/dist/features/auth/actions/profile-actions.js +4 -3
- package/dist/features/auth/actions/realtime-token-actions.js +1 -12
- package/dist/features/auth/auth-helpers.js +5 -7
- package/dist/features/auth/components/ForgotPasswordView.js +1 -1
- package/dist/features/auth/components/Guards.js +2 -1
- package/dist/features/auth/components/LoginForm.d.ts +0 -2
- package/dist/features/auth/components/LoginForm.js +2 -4
- package/dist/features/auth/components/RegisterForm.js +62 -19
- package/dist/features/auth/components/ResetPasswordView.js +1 -1
- package/dist/features/auth/hooks/useAuth.js +3 -0
- package/dist/features/auth/permissions/constants.d.ts +27 -1
- package/dist/features/auth/role-predicates.d.ts +75 -7
- package/dist/features/auth/role-predicates.js +28 -2
- package/dist/features/auth/schemas/firestore.d.ts +22 -0
- package/dist/features/auth/schemas/index.d.ts +1 -1
- package/dist/features/auth/schemas/index.js +44 -8
- package/dist/features/auth/types/index.d.ts +14 -1
- package/dist/features/blog/api/route.js +10 -2
- package/dist/features/blog/components/BlogIndexListing.js +1 -1
- package/dist/features/blog/hooks/useBlog.js +2 -2
- package/dist/features/blog/repository/blog.repository.js +3 -1
- package/dist/features/blog/schemas/index.d.ts +4 -0
- package/dist/features/blog/schemas/index.js +2 -0
- package/dist/features/blog/types/index.d.ts +1 -1
- package/dist/features/cart/actions/cart-actions.js +13 -4
- package/dist/features/cart/utils/pending-ops.js +1 -1
- package/dist/features/catalogue/components/CatalogueItemEditorView.d.ts +22 -0
- package/dist/features/catalogue/components/CatalogueItemEditorView.js +112 -52
- package/dist/features/catalogue/schemas/validation.d.ts +4 -4
- package/dist/features/catalogue/schemas/validation.js +47 -10
- package/dist/features/categories/components/BrandDetailPageView.js +28 -12
- package/dist/features/categories/components/CategoryDetailPageView.js +37 -20
- package/dist/features/categories/repository/categories.repository.js +3 -1
- package/dist/features/categories/schemas/bundle-form.d.ts +142 -0
- package/dist/features/categories/schemas/bundle-form.js +149 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +10 -1
- package/dist/features/classified/components/ClassifiedContactSellerPanel.js +1 -1
- package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +5 -4
- package/dist/features/classified/components/ClassifiedDetailPageView.js +47 -18
- package/dist/features/consultation/components/ConsultationForm.js +1 -1
- package/dist/features/consultation/schemas/index.js +34 -10
- package/dist/features/corporate/schemas/index.js +36 -15
- package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -1
- package/dist/features/events/components/EventBanner.js +5 -2
- package/dist/features/events/components/EventOfferCard.js +3 -1
- package/dist/features/events/components/EventPollWidget.js +1 -1
- package/dist/features/events/components/SpinWheelView.js +3 -2
- package/dist/features/filters/FilterPanel.js +3 -3
- package/dist/features/filters/RangeFilter.d.ts +10 -0
- package/dist/features/filters/RangeFilter.js +41 -4
- package/dist/features/grouped/components/GroupedListingEditorView.js +2 -1
- package/dist/features/history/hooks/useHistory.js +29 -27
- package/dist/features/homepage/components/AdSlot.js +3 -1
- package/dist/features/homepage/components/GoogleReviewsSection.js +8 -2
- package/dist/features/homepage/components/MarketplaceHomepageView.js +58 -15
- package/dist/features/homepage/components/SocialFeedSection.js +4 -1
- package/dist/features/homepage/hooks/useBlogArticles.js +1 -1
- package/dist/features/homepage/lib/live-stats.js +8 -1
- package/dist/features/homepage/repository/carousel.repository.js +2 -1
- package/dist/features/layout/BottomActions.js +84 -11
- package/dist/features/layout/BottomActionsContext.d.ts +1 -6
- package/dist/features/layout/BottomActionsContext.js +1 -1
- package/dist/features/layout/hooks/useBottomActions.js +2 -2
- package/dist/features/layout/hooks/useFormBottomActions.d.ts +12 -1
- package/dist/features/layout/hooks/useFormBottomActions.js +12 -6
- package/dist/features/live/components/LiveItemDetailPageView.js +4 -1
- package/dist/features/lottery/schemas/config-write.d.ts +9 -5
- package/dist/features/lottery/schemas/config-write.js +69 -9
- package/dist/features/media/finalize.js +3 -1
- package/dist/features/media/modals/ImageEditor.js +1 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +5 -2
- package/dist/features/media/modals/VideoTrimModal.js +5 -2
- package/dist/features/media/upload/MediaUploadField.js +2 -2
- package/dist/features/messages/hooks/useConversation.js +18 -4
- package/dist/features/messages/hooks/useConversations.js +25 -8
- package/dist/features/orders/components/RefundRequestView.js +5 -2
- package/dist/features/orders/schemas/buyer-forms.d.ts +6 -3
- package/dist/features/orders/schemas/buyer-forms.js +31 -3
- package/dist/features/orders/schemas/index.d.ts +2 -2
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -1
- package/dist/features/pre-orders/components/PreOrderActionsClient.js +1 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -1
- package/dist/features/products/components/GroupSettingsPanel.js +3 -1
- package/dist/features/products/components/MakeOfferButton.d.ts +13 -2
- package/dist/features/products/components/MakeOfferButton.js +33 -11
- package/dist/features/products/components/PrizeDrawDetailPageView.js +4 -1
- package/dist/features/products/components/ProductDetailActions.js +0 -1
- package/dist/features/products/components/ProductDetailPageView.d.ts +7 -3
- package/dist/features/products/components/ProductDetailPageView.js +16 -7
- package/dist/features/products/components/ShareButton.js +3 -1
- package/dist/features/products/constants/action-defs.d.ts +1 -2
- package/dist/features/products/constants/action-defs.js +40 -43
- package/dist/features/products/repository/loadProductFeatures.js +10 -2
- package/dist/features/products/repository/products.repository.d.ts +5 -1
- package/dist/features/products/repository/products.repository.js +25 -2
- package/dist/features/products/schemas/firestore.d.ts +7 -3
- package/dist/features/products/schemas/product-features.validators.js +3 -0
- package/dist/features/promotions/components/CouponCard.js +11 -8
- package/dist/features/reviews/actions/review-actions.js +8 -1
- package/dist/features/reviews/components/ReviewDetailPageView.js +13 -3
- package/dist/features/reviews/components/ReviewDetailShell.js +3 -1
- package/dist/features/scams/actions/scam-actions.d.ts +9 -1
- package/dist/features/scams/actions/scam-actions.js +52 -12
- package/dist/features/scams/components/SellerTrustBadge.d.ts +1 -1
- package/dist/features/scams/components/SellerTrustBadge.js +13 -0
- package/dist/features/scams/repository/scammer.repository.js +2 -1
- package/dist/features/scams/schemas/firestore.d.ts +15 -1
- package/dist/features/scams/schemas/report-form.d.ts +5 -5
- package/dist/features/scams/schemas/report-form.js +18 -3
- package/dist/features/search/action-index/derive.d.ts +49 -0
- package/dist/features/search/action-index/derive.js +121 -0
- package/dist/features/search/action-index/repository.d.ts +42 -0
- package/dist/features/search/action-index/repository.js +100 -0
- package/dist/features/search/action-index/settings-entries.d.ts +41 -0
- package/dist/features/search/action-index/settings-entries.js +268 -0
- package/dist/features/search/action-index/types.d.ts +81 -0
- package/dist/features/search/action-index/types.js +102 -0
- package/dist/features/search/action-index/validate-entry.d.ts +34 -0
- package/dist/features/search/action-index/validate-entry.js +114 -0
- package/dist/features/search/hooks/useNavSuggestions.d.ts +5 -1
- package/dist/features/search/hooks/useNavSuggestions.js +23 -3
- package/dist/features/search/repository/search.repository.js +3 -1
- package/dist/features/seller/actions/offer-actions.js +43 -19
- package/dist/features/seller/actions/seller-actions.js +29 -5
- package/dist/features/seller/components/CategoryChipPicker.d.ts +9 -0
- package/dist/features/seller/components/CategoryChipPicker.js +12 -0
- package/dist/features/seller/components/FulfillmentView.js +5 -2
- package/dist/features/seller/components/PhysicalLocationModal.js +1 -1
- package/dist/features/seller/components/PrintCenterView.js +3 -1
- package/dist/features/seller/components/SellerAddressesView.js +5 -1
- package/dist/features/seller/components/SellerAnalyticsAlertsView.js +83 -43
- package/dist/features/seller/components/SellerArtView.d.ts +14 -7
- package/dist/features/seller/components/SellerArtView.js +4 -119
- package/dist/features/seller/components/SellerBidsView.js +1 -1
- package/dist/features/seller/components/SellerClassifiedView.d.ts +14 -7
- package/dist/features/seller/components/SellerClassifiedView.js +4 -124
- package/dist/features/seller/components/SellerCouponEditorView.d.ts +22 -1
- package/dist/features/seller/components/SellerCouponEditorView.js +91 -45
- package/dist/features/seller/components/SellerCouponsView.js +1 -1
- package/dist/features/seller/components/SellerDigitalCodesView.d.ts +14 -7
- package/dist/features/seller/components/SellerDigitalCodesView.js +4 -126
- package/dist/features/seller/components/SellerGoogleReviewsView.js +2 -2
- package/dist/features/seller/components/SellerListingTypeView.d.ts +66 -0
- package/dist/features/seller/components/SellerListingTypeView.js +277 -0
- package/dist/features/seller/components/SellerLiveView.d.ts +14 -7
- package/dist/features/seller/components/SellerLiveView.js +4 -126
- package/dist/features/seller/components/SellerOrdersView.js +3 -3
- package/dist/features/seller/components/SellerPayoutMethodsView.js +2 -2
- package/dist/features/seller/components/SellerProductShell.d.ts +5 -0
- package/dist/features/seller/components/SellerProductShell.js +15 -5
- package/dist/features/seller/components/SellerProductsView.js +24 -10
- package/dist/features/seller/components/SellerReviewsView.js +47 -16
- package/dist/features/seller/components/SellerShippingConfigsView.js +5 -4
- package/dist/features/seller/components/SellerSidebar.d.ts +3 -6
- package/dist/features/seller/components/SellerStickersView.d.ts +14 -7
- package/dist/features/seller/components/SellerStickersView.js +4 -119
- package/dist/features/seller/components/SellerStoreCategoriesView.js +3 -2
- package/dist/features/seller/components/SellerSupportView.d.ts +31 -0
- package/dist/features/seller/components/SellerSupportView.js +100 -0
- package/dist/features/seller/components/index.d.ts +4 -8
- package/dist/features/seller/components/index.js +2 -4
- package/dist/features/seller/index.d.ts +0 -1
- package/dist/features/seller/index.js +0 -1
- package/dist/features/seller/schemas/coupon-form.d.ts +214 -0
- package/dist/features/seller/schemas/coupon-form.js +155 -23
- package/dist/features/seller/schemas/offer-forms.d.ts +16 -7
- package/dist/features/seller/schemas/offer-forms.js +28 -12
- package/dist/features/shell/FormShell.js +2 -2
- package/dist/features/shell/QuickFormDrawer.js +2 -2
- package/dist/features/shell/SectionForm.d.ts +19 -1
- package/dist/features/shell/SectionForm.js +104 -17
- package/dist/features/shell/build-sections.d.ts +23 -0
- package/dist/features/shell/build-sections.js +106 -8
- package/dist/features/shell/field-ui-meta.d.ts +44 -0
- package/dist/features/shell/field-ui-meta.js +14 -7
- package/dist/features/shell/form-sections.d.ts +46 -0
- package/dist/features/shell/form-sections.js +114 -0
- package/dist/features/shipments/components/AdminShipmentEditorView.js +87 -64
- package/dist/features/shipments/schemas/validation.d.ts +2 -2
- package/dist/features/shipments/schemas/validation.js +44 -13
- package/dist/features/store-extensions/schemas/custom-role-form.js +6 -2
- package/dist/features/store-extensions/schemas/listing-template-form.d.ts +7 -7
- package/dist/features/store-extensions/schemas/payout-method-form.js +14 -0
- package/dist/features/stores/actions/store-query-actions.js +3 -2
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -1
- package/dist/features/stores/api/[storeSlug]/products/route.js +3 -1
- package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
- package/dist/features/stores/components/StoreDetailLayoutView.js +12 -3
- package/dist/features/support/repository/support.repository.d.ts +21 -0
- package/dist/features/support/repository/support.repository.js +63 -0
- package/dist/features/support/schemas/firestore.d.ts +27 -2
- package/dist/features/support/schemas/firestore.js +2 -0
- package/dist/features/support/schemas/ticket-create-form.js +7 -0
- package/dist/features/tester/schemas/checklist-item-form.d.ts +43 -0
- package/dist/features/tester/schemas/checklist-item-form.js +109 -0
- package/dist/features/tester/seed-data/blog-tester-seed-data.js +2 -2
- package/dist/features/tester/seed-data/categories-tester-seed-data.js +2 -2
- package/dist/features/tester/seed-data/events-tester-seed-data.js +5 -5
- package/dist/features/tester/seed-data/orders-tester-seed-data.js +2 -2
- package/dist/features/tester/seed-data/products-tester-seed-data.js +48 -49
- package/dist/features/tester/seed-data/stores-tester-seed-data.js +3 -3
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +291 -30
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +51 -14
- package/dist/features/wishlist/hooks/useWishlistToggle.js +8 -1
- package/dist/http/api-handler.js +2 -1
- package/dist/index.d.ts +25 -104
- package/dist/index.js +38 -143
- package/dist/jobs.d.ts +1 -1
- package/dist/jobs.js +1 -1
- package/dist/monitoring/browser.d.ts +0 -2
- package/dist/monitoring/browser.js +12 -1
- package/dist/monitoring/index.d.ts +0 -2
- package/dist/monitoring/index.js +0 -1
- package/dist/next/api/routeHandler.js +9 -4
- package/dist/next/index.d.ts +1 -2
- package/dist/next/index.js +0 -1
- package/dist/next/middleware/index.d.ts +0 -2
- package/dist/next/middleware/index.js +0 -1
- package/dist/next/routing/route-map.d.ts +8 -7
- package/dist/next/routing/route-map.js +10 -3
- package/dist/providers/auth-firebase/session.js +3 -1
- package/dist/providers/db-firebase/admin-app-lite.js +8 -8
- package/dist/providers/db-firebase/admin.js +27 -13
- package/dist/providers/db-firebase/browser-stub.d.ts +1 -11
- package/dist/providers/db-firebase/browser-stub.js +6 -11
- package/dist/providers/db-firebase/index.d.ts +0 -1
- package/dist/providers/db-firebase/index.js +0 -1
- package/dist/providers/db-firebase/rtdb-paths.d.ts +15 -6
- package/dist/providers/db-firebase/rtdb-paths.js +15 -6
- package/dist/providers/db-firebase/rtdb-url.d.ts +27 -0
- package/dist/providers/db-firebase/rtdb-url.js +50 -0
- package/dist/providers/db-firebase/sieve.d.ts +22 -0
- package/dist/providers/firebase-client/realtime.d.ts +20 -0
- package/dist/providers/firebase-client/realtime.js +34 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +1 -1
- package/dist/react/hooks/use-action-dispatch.js +8 -2
- package/dist/react/hooks/useFormStatePreservation.js +3 -1
- package/dist/react/hooks/useListingTypeFlags.d.ts +1 -1
- package/dist/react/hooks/useListingTypeFlags.js +1 -1
- package/dist/react/hooks/usePendingFilters.js +5 -3
- package/dist/react/hooks/usePendingTable.js +15 -3
- package/dist/react/hooks/useRealtimeEvent.js +20 -9
- package/dist/repositories/index.d.ts +0 -1
- package/dist/repositories/index.js +0 -1
- package/dist/schemas/registry.d.ts +197 -232
- package/dist/schemas/registry.js +5 -6
- package/dist/schemas/webhooks/razorpay.d.ts +50 -50
- package/dist/security/authorization.d.ts +9 -0
- package/dist/security/authorization.js +16 -2
- package/dist/security/browser.d.ts +1 -3
- package/dist/security/browser.js +5 -2
- package/dist/security/index.d.ts +1 -3
- package/dist/security/index.js +19 -2
- package/dist/security/pii-encrypt.js +16 -0
- package/dist/security/pii-schemas.d.ts +0 -14
- package/dist/security/pii-schemas.js +7 -15
- package/dist/seed/_helpers/category-forest.js +2 -2
- package/dist/seed/_helpers/media.d.ts +19 -0
- package/dist/seed/_helpers/media.js +75 -0
- package/dist/seed/blog-posts-seed-data.js +17 -17
- package/dist/seed/carousel-slides-seed-data.js +7 -7
- package/dist/seed/cart-seed-data.js +13 -13
- package/dist/seed/categories-seed-data.js +10 -10
- package/dist/seed/events-seed-data.js +24 -24
- package/dist/seed/factories/product.factory.js +4 -4
- package/dist/seed/factories/store.factory.js +3 -3
- package/dist/seed/factories/user.factory.js +2 -2
- package/dist/seed/grouped-listings-seed-data.js +11 -11
- package/dist/seed/homepage-sections-seed-data.js +2 -2
- package/dist/seed/index.d.ts +0 -1
- package/dist/seed/index.js +0 -1
- package/dist/seed/manifest.d.ts +1 -1
- package/dist/seed/manifest.js +0 -5
- package/dist/seed/notifications-seed-data.js +20 -1
- package/dist/seed/orders-seed-data.js +2 -2
- package/dist/seed/products-art-seed-data.js +16 -16
- package/dist/seed/products-auctions-seed-data.js +34 -34
- package/dist/seed/products-classifieds-seed-data.js +35 -37
- package/dist/seed/products-digital-codes-seed-data.js +20 -20
- package/dist/seed/products-live-items-seed-data.js +11 -11
- package/dist/seed/products-preorders-seed-data.js +13 -13
- package/dist/seed/products-prize-draws-seed-data.js +43 -43
- package/dist/seed/products-standard-seed-data.js +54 -54
- package/dist/seed/products-stickers-seed-data.js +15 -15
- package/dist/seed/reviews-seed-data.js +4 -4
- package/dist/seed/scammers-seed-data.js +3 -3
- package/dist/seed/site-settings-seed-data.js +11 -24
- package/dist/seed/store-extensions-seed-data.js +10 -10
- package/dist/seed/stores-seed-data.js +11 -11
- package/dist/seed/support-tickets-seed-data.d.ts +14 -0
- package/dist/seed/support-tickets-seed-data.js +20 -1
- package/dist/seed/users-seed-data.js +20 -20
- package/dist/server-entry.d.ts +0 -1
- package/dist/server-entry.js +0 -1
- package/dist/server.d.ts +9 -6
- package/dist/server.js +7 -13
- package/dist/styles.css +248 -68
- package/dist/tailwind-utilities.css +1 -1
- package/dist/tokens/themes/default-dark.js +2 -2
- package/dist/tokens/themes/default-light.js +2 -2
- package/dist/tokens/tokens.css +24 -4
- package/dist/ui/components/ActionRow.d.ts +50 -0
- package/dist/ui/components/ActionRow.js +53 -0
- package/dist/ui/components/ActionRow.style.css +145 -0
- package/dist/ui/components/Drawer.d.ts +10 -0
- package/dist/ui/components/Drawer.js +2 -1
- package/dist/ui/components/FilterDrawer.js +4 -1
- package/dist/ui/components/FilterDrawer.style.css +6 -12
- package/dist/ui/components/FormActionBar.js +14 -1
- package/dist/ui/components/FormActionBar.style.css +12 -11
- package/dist/ui/components/ListingLayout.js +8 -1
- package/dist/ui/components/ListingLayout.style.css +6 -13
- package/dist/ui/components/Modal.d.ts +15 -1
- package/dist/ui/components/Modal.js +17 -3
- package/dist/ui/components/QuickCreateModal.js +2 -2
- package/dist/ui/components/QuickCreateModal.style.css +78 -84
- package/dist/ui/components/RecordDetailModal.js +2 -2
- package/dist/ui/components/SideDrawer.d.ts +8 -0
- package/dist/ui/components/SideDrawer.js +2 -1
- package/dist/ui/components/SideDrawer.style.css +6 -3
- package/dist/ui/components/SideModal.d.ts +11 -1
- package/dist/ui/components/SideModal.js +3 -2
- package/dist/ui/components/SideModal.style.css +14 -0
- package/dist/ui/components/Typography.style.css +33 -24
- package/dist/ui/components/index.style.css +1 -0
- package/dist/ui/components/toolbar-collapse.js +1 -2
- package/dist/ui/forms/FormShell.style.css +260 -311
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +1 -0
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.js +0 -1
- package/dist/validation/index.d.ts +1 -1
- package/dist/validation/index.js +1 -1
- package/dist/validation/schemas.d.ts +0 -19
- package/dist/validation/schemas.js +8 -19
- package/package.json +1 -1
- package/scripts/seed-cli.mjs +3 -6
package/dist/next/index.d.ts
CHANGED
|
@@ -19,8 +19,7 @@ export type { CacheConfig } from "./cache-middleware";
|
|
|
19
19
|
export { createApiMiddleware, runChain, buildBaseContext, } from "./middleware/chain";
|
|
20
20
|
export type { CreateApiMiddlewareConfig } from "./middleware/chain";
|
|
21
21
|
export { piiScrubberMiddleware } from "./middleware/pii-scrubber";
|
|
22
|
-
export {
|
|
23
|
-
export type { BaseRequestContext, AuthRequestContext, Middleware, PiiRedactionRule, } from "./middleware";
|
|
22
|
+
export type { BaseRequestContext, AuthRequestContext, Middleware, } from "./middleware";
|
|
24
23
|
export { successResponse, errorResponse, ApiErrors } from "./api/api-response";
|
|
25
24
|
export type { ApiSuccessResponse, ApiErrorResponse } from "./api/api-response";
|
|
26
25
|
export { GlobalError } from "./components/GlobalError";
|
package/dist/next/index.js
CHANGED
|
@@ -19,7 +19,6 @@ export { withCache, invalidateCache } from "./cache-middleware";
|
|
|
19
19
|
// PII-aware composable middleware chain (Phase 21)
|
|
20
20
|
export { createApiMiddleware, runChain, buildBaseContext, } from "./middleware/chain";
|
|
21
21
|
export { piiScrubberMiddleware } from "./middleware/pii-scrubber";
|
|
22
|
-
export { createPiiRedactorMiddleware } from "./middleware/pii-redactor";
|
|
23
22
|
// Standardized API response helpers
|
|
24
23
|
export { successResponse, errorResponse, ApiErrors } from "./api/api-response";
|
|
25
24
|
// Error UI view components
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
export type { BaseRequestContext, AuthRequestContext, Middleware, } from "./types";
|
|
2
2
|
export { piiScrubberMiddleware } from "./pii-scrubber";
|
|
3
|
-
export { createPiiRedactorMiddleware } from "./pii-redactor";
|
|
4
|
-
export type { PiiRedactionRule } from "./pii-redactor";
|
|
5
3
|
export { createApiMiddleware, runChain, buildBaseContext } from "./chain";
|
|
6
4
|
export type { CreateApiMiddlewareConfig } from "./chain";
|
|
@@ -149,7 +149,6 @@ export declare const DEFAULT_ROUTE_MAP: {
|
|
|
149
149
|
readonly ORDER_INVOICE: (id: string) => string;
|
|
150
150
|
readonly ORDER_PAYMENT: (id: string) => string;
|
|
151
151
|
readonly NOTIFICATIONS: "/user/notifications";
|
|
152
|
-
readonly MESSAGES: "/user/messages";
|
|
153
152
|
/** Plan §10 — claimed-coupons wallet (Active / Expired / Used tabs). */
|
|
154
153
|
readonly CLAIMED_COUPONS: "/user/coupons";
|
|
155
154
|
readonly BECOME_SELLER: "/user/become-seller";
|
|
@@ -175,7 +174,6 @@ export declare const DEFAULT_ROUTE_MAP: {
|
|
|
175
174
|
};
|
|
176
175
|
readonly STORE: {
|
|
177
176
|
readonly DASHBOARD: "/store";
|
|
178
|
-
readonly MESSAGES: "/store/messages";
|
|
179
177
|
readonly PRODUCTS: "/store/products";
|
|
180
178
|
readonly PRODUCTS_NEW: "/store/products/new";
|
|
181
179
|
readonly PRODUCTS_EDIT: (id: string) => string;
|
|
@@ -211,6 +209,8 @@ export declare const DEFAULT_ROUTE_MAP: {
|
|
|
211
209
|
readonly FEATURES_NEW: "/store/features/new";
|
|
212
210
|
readonly FEATURES_EDIT: (id: string) => string;
|
|
213
211
|
readonly SLUG: "/store/slug";
|
|
212
|
+
/** Tickets raised ABOUT this store (W11). Read-only for the seller. */
|
|
213
|
+
readonly SUPPORT: "/store/support";
|
|
214
214
|
readonly BUNDLES: "/store/bundles";
|
|
215
215
|
readonly BUNDLES_NEW: "/store/bundles/new";
|
|
216
216
|
readonly BUNDLES_EDIT: (id: string) => string;
|
|
@@ -282,6 +282,7 @@ export declare const DEFAULT_ROUTE_MAP: {
|
|
|
282
282
|
readonly CAROUSELS_EDIT: (id: string) => string;
|
|
283
283
|
readonly SECTIONS: "/admin/sections";
|
|
284
284
|
readonly NAVIGATION: "/admin/navigation";
|
|
285
|
+
readonly ACTION_INDEX: "/admin/action-index";
|
|
285
286
|
readonly NAVIGATION_NEW: "/admin/navigation/new";
|
|
286
287
|
readonly NAVIGATION_EDIT: (id: string) => string;
|
|
287
288
|
readonly CATEGORIES: "/admin/categories";
|
|
@@ -333,7 +334,6 @@ export declare const DEFAULT_ROUTE_MAP: {
|
|
|
333
334
|
readonly EVENT_ENTRIES: (id: string) => string;
|
|
334
335
|
readonly STORES: "/admin/stores";
|
|
335
336
|
readonly STORE_DETAIL: (id: string) => string;
|
|
336
|
-
readonly FEATURE_FLAGS: "/admin/feature-flags";
|
|
337
337
|
readonly COPILOT: "/admin/copilot";
|
|
338
338
|
readonly ADS: "/admin/ads";
|
|
339
339
|
readonly ADS_NEW: "/admin/ads/new";
|
|
@@ -552,7 +552,6 @@ export declare const ROUTES: {
|
|
|
552
552
|
readonly ORDER_INVOICE: (id: string) => string;
|
|
553
553
|
readonly ORDER_PAYMENT: (id: string) => string;
|
|
554
554
|
readonly NOTIFICATIONS: "/user/notifications";
|
|
555
|
-
readonly MESSAGES: "/user/messages";
|
|
556
555
|
/** Plan §10 — claimed-coupons wallet (Active / Expired / Used tabs). */
|
|
557
556
|
readonly CLAIMED_COUPONS: "/user/coupons";
|
|
558
557
|
readonly BECOME_SELLER: "/user/become-seller";
|
|
@@ -578,7 +577,6 @@ export declare const ROUTES: {
|
|
|
578
577
|
};
|
|
579
578
|
readonly STORE: {
|
|
580
579
|
readonly DASHBOARD: "/store";
|
|
581
|
-
readonly MESSAGES: "/store/messages";
|
|
582
580
|
readonly PRODUCTS: "/store/products";
|
|
583
581
|
readonly PRODUCTS_NEW: "/store/products/new";
|
|
584
582
|
readonly PRODUCTS_EDIT: (id: string) => string;
|
|
@@ -614,6 +612,8 @@ export declare const ROUTES: {
|
|
|
614
612
|
readonly FEATURES_NEW: "/store/features/new";
|
|
615
613
|
readonly FEATURES_EDIT: (id: string) => string;
|
|
616
614
|
readonly SLUG: "/store/slug";
|
|
615
|
+
/** Tickets raised ABOUT this store (W11). Read-only for the seller. */
|
|
616
|
+
readonly SUPPORT: "/store/support";
|
|
617
617
|
readonly BUNDLES: "/store/bundles";
|
|
618
618
|
readonly BUNDLES_NEW: "/store/bundles/new";
|
|
619
619
|
readonly BUNDLES_EDIT: (id: string) => string;
|
|
@@ -685,6 +685,7 @@ export declare const ROUTES: {
|
|
|
685
685
|
readonly CAROUSELS_EDIT: (id: string) => string;
|
|
686
686
|
readonly SECTIONS: "/admin/sections";
|
|
687
687
|
readonly NAVIGATION: "/admin/navigation";
|
|
688
|
+
readonly ACTION_INDEX: "/admin/action-index";
|
|
688
689
|
readonly NAVIGATION_NEW: "/admin/navigation/new";
|
|
689
690
|
readonly NAVIGATION_EDIT: (id: string) => string;
|
|
690
691
|
readonly CATEGORIES: "/admin/categories";
|
|
@@ -736,7 +737,6 @@ export declare const ROUTES: {
|
|
|
736
737
|
readonly EVENT_ENTRIES: (id: string) => string;
|
|
737
738
|
readonly STORES: "/admin/stores";
|
|
738
739
|
readonly STORE_DETAIL: (id: string) => string;
|
|
739
|
-
readonly FEATURE_FLAGS: "/admin/feature-flags";
|
|
740
740
|
readonly COPILOT: "/admin/copilot";
|
|
741
741
|
readonly ADS: "/admin/ads";
|
|
742
742
|
readonly ADS_NEW: "/admin/ads/new";
|
|
@@ -818,7 +818,6 @@ export declare const ROUTES: {
|
|
|
818
818
|
/** @deprecated Use ROUTES.STORE instead */
|
|
819
819
|
export declare const SELLER_ROUTES: {
|
|
820
820
|
readonly DASHBOARD: "/store";
|
|
821
|
-
readonly MESSAGES: "/store/messages";
|
|
822
821
|
readonly PRODUCTS: "/store/products";
|
|
823
822
|
readonly PRODUCTS_NEW: "/store/products/new";
|
|
824
823
|
readonly PRODUCTS_EDIT: (id: string) => string;
|
|
@@ -854,6 +853,8 @@ export declare const SELLER_ROUTES: {
|
|
|
854
853
|
readonly FEATURES_NEW: "/store/features/new";
|
|
855
854
|
readonly FEATURES_EDIT: (id: string) => string;
|
|
856
855
|
readonly SLUG: "/store/slug";
|
|
856
|
+
/** Tickets raised ABOUT this store (W11). Read-only for the seller. */
|
|
857
|
+
readonly SUPPORT: "/store/support";
|
|
857
858
|
readonly BUNDLES: "/store/bundles";
|
|
858
859
|
readonly BUNDLES_NEW: "/store/bundles/new";
|
|
859
860
|
readonly BUNDLES_EDIT: (id: string) => string;
|
|
@@ -153,7 +153,6 @@ export const DEFAULT_ROUTE_MAP = {
|
|
|
153
153
|
ORDER_INVOICE: (id) => `/user/orders/${id}/invoice`,
|
|
154
154
|
ORDER_PAYMENT: (id) => `/user/orders/${id}/payment`,
|
|
155
155
|
NOTIFICATIONS: "/user/notifications",
|
|
156
|
-
MESSAGES: "/user/messages",
|
|
157
156
|
/** Plan §10 — claimed-coupons wallet (Active / Expired / Used tabs). */
|
|
158
157
|
CLAIMED_COUPONS: "/user/coupons",
|
|
159
158
|
BECOME_SELLER: "/user/become-seller",
|
|
@@ -179,7 +178,6 @@ export const DEFAULT_ROUTE_MAP = {
|
|
|
179
178
|
},
|
|
180
179
|
STORE: {
|
|
181
180
|
DASHBOARD: "/store",
|
|
182
|
-
MESSAGES: "/store/messages",
|
|
183
181
|
PRODUCTS: "/store/products",
|
|
184
182
|
PRODUCTS_NEW: "/store/products/new",
|
|
185
183
|
PRODUCTS_EDIT: (id) => `/store/products/${id}/edit`,
|
|
@@ -215,6 +213,8 @@ export const DEFAULT_ROUTE_MAP = {
|
|
|
215
213
|
FEATURES_NEW: "/store/features/new",
|
|
216
214
|
FEATURES_EDIT: (id) => `/store/features/${id}/edit`,
|
|
217
215
|
SLUG: "/store/slug",
|
|
216
|
+
/** Tickets raised ABOUT this store (W11). Read-only for the seller. */
|
|
217
|
+
SUPPORT: "/store/support",
|
|
218
218
|
// SB1-J — bundles + prize draws
|
|
219
219
|
BUNDLES: "/store/bundles",
|
|
220
220
|
BUNDLES_NEW: "/store/bundles/new",
|
|
@@ -296,6 +296,14 @@ export const DEFAULT_ROUTE_MAP = {
|
|
|
296
296
|
CAROUSELS_EDIT: (id) => `/admin/carousels/${id}/edit`,
|
|
297
297
|
SECTIONS: "/admin/sections",
|
|
298
298
|
NAVIGATION: "/admin/navigation",
|
|
299
|
+
/*
|
|
300
|
+
* The action index (W7 / D7) — one control plane for every page, setting
|
|
301
|
+
* and toggle a user can reach. It supersedes NAVIGATION and
|
|
302
|
+
* SETTINGS_NAVIGATION, neither of whose data ever reached a sidebar:
|
|
303
|
+
* `filterNavItems` short-circuits on a missing `id`, and no nav item had
|
|
304
|
+
* one until W6.
|
|
305
|
+
*/
|
|
306
|
+
ACTION_INDEX: "/admin/action-index",
|
|
299
307
|
NAVIGATION_NEW: "/admin/navigation/new",
|
|
300
308
|
NAVIGATION_EDIT: (id) => `/admin/navigation/${id}/edit`,
|
|
301
309
|
CATEGORIES: "/admin/categories",
|
|
@@ -348,7 +356,6 @@ export const DEFAULT_ROUTE_MAP = {
|
|
|
348
356
|
EVENT_ENTRIES: (id) => `/admin/events/${id}/entries`,
|
|
349
357
|
STORES: "/admin/stores",
|
|
350
358
|
STORE_DETAIL: (id) => `/admin/stores/${id}/view`,
|
|
351
|
-
FEATURE_FLAGS: "/admin/feature-flags",
|
|
352
359
|
COPILOT: "/admin/copilot",
|
|
353
360
|
ADS: "/admin/ads",
|
|
354
361
|
ADS_NEW: "/admin/ads/new",
|
|
@@ -71,8 +71,10 @@ export const firebaseSessionProvider = {
|
|
|
71
71
|
await getAdminAuthLite().revokeRefreshTokens(decoded.uid);
|
|
72
72
|
}
|
|
73
73
|
catch (_err) {
|
|
74
|
+
// Best-effort teardown: an expired/revoked/malformed cookie cannot be
|
|
75
|
+
// verified, and that is the state destroySession is trying to reach —
|
|
76
|
+
// reporting it would alarm on the success case.
|
|
74
77
|
void normalizeError(_err);
|
|
75
|
-
// Best-effort: if cookie is already invalid, treat as already destroyed
|
|
76
78
|
}
|
|
77
79
|
},
|
|
78
80
|
};
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { initializeApp, getApps, cert } from "firebase-admin/app";
|
|
2
|
+
// One resolver, not a second copy — this file duplicated admin.ts's URL
|
|
3
|
+
// logic byte-for-byte, so the region-wrong fallback bug existed twice.
|
|
4
|
+
// Imported from its own dependency-free module, NOT from ./admin, because the
|
|
5
|
+
// whole point of admin-app-lite is not pulling the full admin module in.
|
|
6
|
+
import { resolveRtdbUrl } from "./rtdb-url";
|
|
2
7
|
function nodePath() { return require("path"); }
|
|
3
8
|
function nodeFs() { return require("fs"); }
|
|
4
9
|
// process.cwd() is Node.js-only; access via module.require so the Edge
|
|
@@ -26,17 +31,14 @@ export function getAdminAppLite() {
|
|
|
26
31
|
let app;
|
|
27
32
|
if (nodeFs().existsSync(keyPath)) {
|
|
28
33
|
const sa = JSON.parse(nodeFs().readFileSync(keyPath, "utf8"));
|
|
29
|
-
const dbUrl =
|
|
30
|
-
`https://${sa.project_id}-default-rtdb.firebaseio.com`;
|
|
34
|
+
const dbUrl = resolveRtdbUrl();
|
|
31
35
|
app = initializeApp({ credential: cert(keyPath), databaseURL: dbUrl, ...(storageBucket && { storageBucket }) });
|
|
32
36
|
}
|
|
33
37
|
else if (process.env.FIREBASE_ADMIN_PROJECT_ID &&
|
|
34
38
|
process.env.FIREBASE_ADMIN_CLIENT_EMAIL &&
|
|
35
39
|
process.env.FIREBASE_ADMIN_PRIVATE_KEY) {
|
|
36
40
|
const projectId = process.env.FIREBASE_ADMIN_PROJECT_ID.trim();
|
|
37
|
-
const dbUrl =
|
|
38
|
-
process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL?.trim() ??
|
|
39
|
-
`https://${projectId}-default-rtdb.firebaseio.com`;
|
|
41
|
+
const dbUrl = resolveRtdbUrl();
|
|
40
42
|
app = initializeApp({
|
|
41
43
|
credential: cert({
|
|
42
44
|
projectId,
|
|
@@ -63,9 +65,7 @@ export function getAdminAppLite() {
|
|
|
63
65
|
: {};
|
|
64
66
|
const projectId = firebaseConfig.projectId ?? process.env.GCLOUD_PROJECT ?? "";
|
|
65
67
|
const dbUrl = firebaseConfig.databaseURL ??
|
|
66
|
-
|
|
67
|
-
process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL ??
|
|
68
|
-
(projectId ? `https://${projectId}-default-rtdb.firebaseio.com` : undefined);
|
|
68
|
+
resolveRtdbUrl();
|
|
69
69
|
app = initializeApp({
|
|
70
70
|
...(dbUrl && { databaseURL: dbUrl }),
|
|
71
71
|
...(storageBucket && { storageBucket }),
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { normalizeError } from "../../errors/normalize";
|
|
2
|
+
import { resolveRtdbUrl } from "./rtdb-url";
|
|
2
3
|
function nodePath() { return require("path"); }
|
|
3
4
|
function nodeFs() { return require("fs"); }
|
|
4
5
|
// process.cwd() is Node.js-only; access via module.require so the Edge
|
|
@@ -63,23 +64,36 @@ export function getAdminApp() {
|
|
|
63
64
|
return existing;
|
|
64
65
|
}
|
|
65
66
|
const keyPath = nodePath().join(nodeCwd(), "firebase-admin-key.json");
|
|
66
|
-
|
|
67
|
+
/*
|
|
68
|
+
* 🛑 `||`, not `??`.
|
|
69
|
+
*
|
|
70
|
+
* A Vercel env var that EXISTS but is empty yields `""`, and `""` is not
|
|
71
|
+
* nullish — so `??` short-circuits, the NEXT_PUBLIC fallback never runs, and
|
|
72
|
+
* `...(storageBucket && …)` then drops the key entirely. The app initialises
|
|
73
|
+
* with NO bucket and every own-bucket media request 500s with
|
|
74
|
+
* "Bucket name not specified".
|
|
75
|
+
*
|
|
76
|
+
* Invisible locally: `.env.local` does not define FIREBASE_ADMIN_STORAGE_BUCKET
|
|
77
|
+
* at all, so the fallback always runs here. `scripts/test-storage-flow.mjs`
|
|
78
|
+
* and `scripts/test-storage.mjs` both already use `||` for this same
|
|
79
|
+
* expression — this was the odd one out.
|
|
80
|
+
*/
|
|
81
|
+
const storageBucket = process.env.FIREBASE_ADMIN_STORAGE_BUCKET?.trim() ||
|
|
67
82
|
process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET?.trim();
|
|
68
83
|
let app;
|
|
69
84
|
try {
|
|
70
85
|
if (nodeFs().existsSync(keyPath)) {
|
|
71
86
|
const sa = JSON.parse(nodeFs().readFileSync(keyPath, "utf8"));
|
|
72
|
-
|
|
73
|
-
|
|
87
|
+
// Was NEXT_PUBLIC-only here while the other two branches honoured
|
|
88
|
+
// FIREBASE_ADMIN_DATABASE_URL, so setting it had no effect on this path.
|
|
89
|
+
const dbUrl = resolveRtdbUrl();
|
|
74
90
|
app = initializeApp({ credential: cert(keyPath), databaseURL: dbUrl, ...(storageBucket && { storageBucket }) });
|
|
75
91
|
}
|
|
76
92
|
else if (process.env.FIREBASE_ADMIN_PROJECT_ID &&
|
|
77
93
|
process.env.FIREBASE_ADMIN_CLIENT_EMAIL &&
|
|
78
94
|
process.env.FIREBASE_ADMIN_PRIVATE_KEY) {
|
|
79
95
|
const projectId = process.env.FIREBASE_ADMIN_PROJECT_ID.trim();
|
|
80
|
-
const dbUrl =
|
|
81
|
-
process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL?.trim() ??
|
|
82
|
-
`https://${projectId}-default-rtdb.firebaseio.com`;
|
|
96
|
+
const dbUrl = resolveRtdbUrl();
|
|
83
97
|
app = initializeApp({
|
|
84
98
|
credential: cert({
|
|
85
99
|
projectId,
|
|
@@ -105,12 +119,9 @@ export function getAdminApp() {
|
|
|
105
119
|
? JSON.parse(process.env.FIREBASE_CONFIG)
|
|
106
120
|
: {};
|
|
107
121
|
const projectId = firebaseConfig.projectId ?? process.env.GCLOUD_PROJECT ?? "";
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
(projectId
|
|
112
|
-
? `https://${projectId}-default-rtdb.firebaseio.com`
|
|
113
|
-
: undefined);
|
|
122
|
+
// FIREBASE_CONFIG is injected by the Functions runtime and is
|
|
123
|
+
// authoritative there; env vars are the fallback for other runtimes.
|
|
124
|
+
const dbUrl = firebaseConfig.databaseURL || resolveRtdbUrl();
|
|
114
125
|
app = initializeApp({
|
|
115
126
|
...(dbUrl && { databaseURL: dbUrl }),
|
|
116
127
|
...(storageBucket && { storageBucket }),
|
|
@@ -153,8 +164,11 @@ export function getAdminDb() {
|
|
|
153
164
|
db.settings({ ignoreUndefinedProperties: true });
|
|
154
165
|
}
|
|
155
166
|
catch (_err) {
|
|
167
|
+
// Firestore rejects a second settings() call on an already-initialised
|
|
168
|
+
// instance, which is the only way this throws (HMR reload / duplicate
|
|
169
|
+
// module instance re-entering the memoised bootstrap). The instance is
|
|
170
|
+
// fully usable either way, so there is nothing degraded to report.
|
|
156
171
|
void normalizeError(_err);
|
|
157
|
-
// Already configured — safe to ignore.
|
|
158
172
|
}
|
|
159
173
|
set("__mohasinac_firebase_admin_db__", db);
|
|
160
174
|
return db;
|
|
@@ -22,17 +22,7 @@ export declare function prepareForFirestore(data: any): any;
|
|
|
22
22
|
export declare function deserializeTimestamps<T>(data: any): T;
|
|
23
23
|
export declare const FirebaseRepository: any;
|
|
24
24
|
export declare const FirebaseSieveRepository: any;
|
|
25
|
-
export declare const FirebaseRealtimeRepository: any;
|
|
26
25
|
export declare const firebaseDbProvider: any;
|
|
27
|
-
export
|
|
28
|
-
readonly PRESENCE: "presence";
|
|
29
|
-
readonly CHAT: "chat";
|
|
30
|
-
readonly NOTIFICATIONS: "notifications";
|
|
31
|
-
readonly LIVE_UPDATES: "live_updates";
|
|
32
|
-
readonly AUTH_EVENTS: "auth_events";
|
|
33
|
-
readonly PAYMENT_EVENTS: "payment_events";
|
|
34
|
-
readonly BULK_EVENTS: "bulk_events";
|
|
35
|
-
readonly SEED_EVENTS: "seed_events";
|
|
36
|
-
};
|
|
26
|
+
export { RTDB_PATHS } from "./rtdb-paths";
|
|
37
27
|
export { buildFirebaseClientConfig, normalizeFirebaseConfigValue } from './client-config';
|
|
38
28
|
export type { FirebaseClientConfig } from './client-config';
|
|
@@ -40,17 +40,12 @@ export function deserializeTimestamps(data) {
|
|
|
40
40
|
}
|
|
41
41
|
export const FirebaseRepository = null;
|
|
42
42
|
export const FirebaseSieveRepository = null;
|
|
43
|
-
export const FirebaseRealtimeRepository = null;
|
|
44
43
|
export const firebaseDbProvider = null;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
PAYMENT_EVENTS: "payment_events",
|
|
52
|
-
BULK_EVENTS: "bulk_events",
|
|
53
|
-
SEED_EVENTS: "seed_events",
|
|
54
|
-
};
|
|
44
|
+
// Re-exported, NOT re-declared. This file is the `browser` resolution target, so
|
|
45
|
+
// the byte-for-byte copy that used to live here meant client code and server
|
|
46
|
+
// code read two independently-maintained definitions of the same constant, with
|
|
47
|
+
// nothing guarding the drift. `rtdb-paths.ts` has no imports, so it is safe to
|
|
48
|
+
// pull into a browser bundle directly.
|
|
49
|
+
export { RTDB_PATHS } from "./rtdb-paths";
|
|
55
50
|
// Client config builder � safe in all environments
|
|
56
51
|
export { buildFirebaseClientConfig, normalizeFirebaseConfigValue } from './client-config';
|
|
@@ -20,7 +20,6 @@ export type { DocumentSnapshot } from "firebase-admin/firestore";
|
|
|
20
20
|
export { FirebaseRepository } from "./base";
|
|
21
21
|
export { BaseRepository } from "./base.repository";
|
|
22
22
|
export { FirebaseSieveRepository } from "./sieve";
|
|
23
|
-
export { FirebaseRealtimeRepository } from "./realtime";
|
|
24
23
|
export { RTDB_PATHS } from "./rtdb-paths";
|
|
25
24
|
import type { IDbProvider } from "../../contracts";
|
|
26
25
|
export declare const firebaseDbProvider: IDbProvider;
|
|
@@ -27,7 +27,6 @@ export { firebaseFieldOps } from "./field-ops";
|
|
|
27
27
|
export { FirebaseRepository } from "./base";
|
|
28
28
|
export { BaseRepository } from "./base.repository";
|
|
29
29
|
export { FirebaseSieveRepository } from "./sieve";
|
|
30
|
-
export { FirebaseRealtimeRepository } from "./realtime";
|
|
31
30
|
// Re-export RTDB paths
|
|
32
31
|
export { RTDB_PATHS } from "./rtdb-paths";
|
|
33
32
|
import { FirebaseRepository as _FirebaseRepository } from "./base";
|
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared Realtime Database path constants for auth/payment/bulk event channels.
|
|
2
|
+
* Shared Realtime Database path constants for the auth/payment/bulk event channels.
|
|
3
|
+
*
|
|
4
|
+
* 🛑 Only paths that are actually referenced through this constant belong here.
|
|
5
|
+
* Five keys were removed on 2026-08-29 — `PRESENCE`, `CHAT`, `NOTIFICATIONS`,
|
|
6
|
+
* `LIVE_UPDATES`, `SEED_EVENTS` — every one with **zero consumers**, because
|
|
7
|
+
* each live call site hardcodes its path string instead. A constant nobody uses
|
|
8
|
+
* is not a source of truth; it is a second place for the value to be wrong, and
|
|
9
|
+
* three of those five named RTDB nodes that no longer exist at all.
|
|
10
|
+
*
|
|
11
|
+
* If you add a key, migrate the call sites to it in the same change.
|
|
12
|
+
*
|
|
13
|
+
* This module has NO imports on purpose — that is what lets `browser-stub.ts`
|
|
14
|
+
* re-export it rather than keep the byte-for-byte duplicate it used to carry.
|
|
15
|
+
* The stub is the `browser` resolution target, so that duplicate meant client
|
|
16
|
+
* code and server code were reading two independently-maintained copies.
|
|
3
17
|
*/
|
|
4
18
|
export declare const RTDB_PATHS: {
|
|
5
|
-
readonly PRESENCE: "presence";
|
|
6
|
-
readonly CHAT: "chat";
|
|
7
|
-
readonly NOTIFICATIONS: "notifications";
|
|
8
|
-
readonly LIVE_UPDATES: "live_updates";
|
|
9
19
|
readonly AUTH_EVENTS: "auth_events";
|
|
10
20
|
readonly PAYMENT_EVENTS: "payment_events";
|
|
11
21
|
readonly BULK_EVENTS: "bulk_events";
|
|
12
|
-
readonly SEED_EVENTS: "seed_events";
|
|
13
22
|
};
|
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared Realtime Database path constants for auth/payment/bulk event channels.
|
|
2
|
+
* Shared Realtime Database path constants for the auth/payment/bulk event channels.
|
|
3
|
+
*
|
|
4
|
+
* 🛑 Only paths that are actually referenced through this constant belong here.
|
|
5
|
+
* Five keys were removed on 2026-08-29 — `PRESENCE`, `CHAT`, `NOTIFICATIONS`,
|
|
6
|
+
* `LIVE_UPDATES`, `SEED_EVENTS` — every one with **zero consumers**, because
|
|
7
|
+
* each live call site hardcodes its path string instead. A constant nobody uses
|
|
8
|
+
* is not a source of truth; it is a second place for the value to be wrong, and
|
|
9
|
+
* three of those five named RTDB nodes that no longer exist at all.
|
|
10
|
+
*
|
|
11
|
+
* If you add a key, migrate the call sites to it in the same change.
|
|
12
|
+
*
|
|
13
|
+
* This module has NO imports on purpose — that is what lets `browser-stub.ts`
|
|
14
|
+
* re-export it rather than keep the byte-for-byte duplicate it used to carry.
|
|
15
|
+
* The stub is the `browser` resolution target, so that duplicate meant client
|
|
16
|
+
* code and server code were reading two independently-maintained copies.
|
|
3
17
|
*/
|
|
4
18
|
export const RTDB_PATHS = {
|
|
5
|
-
PRESENCE: "presence",
|
|
6
|
-
CHAT: "chat",
|
|
7
|
-
NOTIFICATIONS: "notifications",
|
|
8
|
-
LIVE_UPDATES: "live_updates",
|
|
9
19
|
AUTH_EVENTS: "auth_events",
|
|
10
20
|
PAYMENT_EVENTS: "payment_events",
|
|
11
21
|
BULK_EVENTS: "bulk_events",
|
|
12
|
-
SEED_EVENTS: "seed_events",
|
|
13
22
|
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the Realtime Database URL from the environment.
|
|
3
|
+
*
|
|
4
|
+
* Its own module, with **no imports**, because both `admin.ts` and
|
|
5
|
+
* `admin-app-lite.ts` need it and `admin-app-lite` exists precisely to avoid
|
|
6
|
+
* pulling in the full admin module. They previously carried byte-for-byte
|
|
7
|
+
* duplicate resolution logic, which meant the bug below existed twice.
|
|
8
|
+
*
|
|
9
|
+
* 🛑 Returns `undefined` rather than guessing.
|
|
10
|
+
*
|
|
11
|
+
* All six copies used to fall back to `https://${projectId}-default-rtdb.firebaseio.com`.
|
|
12
|
+
* That is the **us-central1** URL shape; this project's instance lives at
|
|
13
|
+
* `…-default-rtdb.asia-southeast1.firebasedatabase.app`. So whenever the env var
|
|
14
|
+
* was missing, every server RTDB write silently targeted a database that does
|
|
15
|
+
* not exist — and since all nine RTDB writers wrap their call in a swallowing
|
|
16
|
+
* try/catch, messaging, bids, job status and payment signalling would every one
|
|
17
|
+
* of them degrade to "nothing ever updates", with clean warn-level logs.
|
|
18
|
+
*
|
|
19
|
+
* A guessed URL cannot be correct for a non-default region, so guessing buys
|
|
20
|
+
* nothing and costs the ability to notice. With no `databaseURL`,
|
|
21
|
+
* `getAdminRealtimeDb()` fails loudly at first use instead, which is the
|
|
22
|
+
* outcome you want.
|
|
23
|
+
*
|
|
24
|
+
* `||` not `??`: an env var that is present but empty must fall through, and
|
|
25
|
+
* `??` only falls through on null/undefined.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveRtdbUrl(): string | undefined;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the Realtime Database URL from the environment.
|
|
3
|
+
*
|
|
4
|
+
* Its own module, with **no imports**, because both `admin.ts` and
|
|
5
|
+
* `admin-app-lite.ts` need it and `admin-app-lite` exists precisely to avoid
|
|
6
|
+
* pulling in the full admin module. They previously carried byte-for-byte
|
|
7
|
+
* duplicate resolution logic, which meant the bug below existed twice.
|
|
8
|
+
*
|
|
9
|
+
* 🛑 Returns `undefined` rather than guessing.
|
|
10
|
+
*
|
|
11
|
+
* All six copies used to fall back to `https://${projectId}-default-rtdb.firebaseio.com`.
|
|
12
|
+
* That is the **us-central1** URL shape; this project's instance lives at
|
|
13
|
+
* `…-default-rtdb.asia-southeast1.firebasedatabase.app`. So whenever the env var
|
|
14
|
+
* was missing, every server RTDB write silently targeted a database that does
|
|
15
|
+
* not exist — and since all nine RTDB writers wrap their call in a swallowing
|
|
16
|
+
* try/catch, messaging, bids, job status and payment signalling would every one
|
|
17
|
+
* of them degrade to "nothing ever updates", with clean warn-level logs.
|
|
18
|
+
*
|
|
19
|
+
* A guessed URL cannot be correct for a non-default region, so guessing buys
|
|
20
|
+
* nothing and costs the ability to notice. With no `databaseURL`,
|
|
21
|
+
* `getAdminRealtimeDb()` fails loudly at first use instead, which is the
|
|
22
|
+
* outcome you want.
|
|
23
|
+
*
|
|
24
|
+
* `||` not `??`: an env var that is present but empty must fall through, and
|
|
25
|
+
* `??` only falls through on null/undefined.
|
|
26
|
+
*/
|
|
27
|
+
export function resolveRtdbUrl() {
|
|
28
|
+
// 🛑 Emulator first.
|
|
29
|
+
//
|
|
30
|
+
// `firebase.json` has declared a database emulator on port 9000 for a long
|
|
31
|
+
// time and NOTHING ever connected to it. Client writes were shielded only
|
|
32
|
+
// because every rule is `.write: false`; server writes use the Admin SDK and
|
|
33
|
+
// bypass rules entirely — so `npm run dev` wrote to PRODUCTION. A local bid
|
|
34
|
+
// overwrote the prod `auction-bids` node that live auction pages subscribe to,
|
|
35
|
+
// and a local message send wrote prod `chats/**`.
|
|
36
|
+
//
|
|
37
|
+
// `FIREBASE_DATABASE_EMULATOR_HOST` is the standard variable the Firebase CLI
|
|
38
|
+
// exports for exactly this, so honouring it costs one branch and makes
|
|
39
|
+
// `firebase emulators:start` do what everyone already assumed it did.
|
|
40
|
+
const emulatorHost = process.env.FIREBASE_DATABASE_EMULATOR_HOST?.trim();
|
|
41
|
+
if (emulatorHost) {
|
|
42
|
+
const ns = process.env.FIREBASE_ADMIN_PROJECT_ID?.trim() ||
|
|
43
|
+
process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID?.trim() ||
|
|
44
|
+
"default";
|
|
45
|
+
return `http://${emulatorHost}?ns=${ns}`;
|
|
46
|
+
}
|
|
47
|
+
return (process.env.FIREBASE_ADMIN_DATABASE_URL?.trim() ||
|
|
48
|
+
process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL?.trim() ||
|
|
49
|
+
undefined);
|
|
50
|
+
}
|
|
@@ -117,6 +117,28 @@ export interface SieveOptions {
|
|
|
117
117
|
*/
|
|
118
118
|
aliases?: SieveFilterAliases;
|
|
119
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* 🛑 THE canonical list envelope. Every repository returns this shape.
|
|
122
|
+
*
|
|
123
|
+
* A list endpoint should emit it unchanged — `return successResponse(result)` —
|
|
124
|
+
* and a listing view should read `response.items`. Where a route instead
|
|
125
|
+
* destructures `result.items` and re-emits it as `products` / `orders` /
|
|
126
|
+
* `tickets`, the view has to rename it back in `mapRows`, and the two renames
|
|
127
|
+
* are a pair that can drift. Fifteen such keys exist; `audit-list-envelope`
|
|
128
|
+
* names them and refuses a sixteenth.
|
|
129
|
+
*
|
|
130
|
+
* Nothing type-errors when they drift, which is why they accumulated:
|
|
131
|
+
* `ListingViewConfig<TResponse, TRow>` treats `TResponse` as opaque and
|
|
132
|
+
* delegates the read to a per-view callback.
|
|
133
|
+
*
|
|
134
|
+
* **`pageSize`, never `perPage`.** Three other spellings existed and all three
|
|
135
|
+
* were dead on 2026-08-31 — `GenericListResponse` (which declared BOTH, each
|
|
136
|
+
* optional, so a value could supply neither), appkit's `AdminListResponse`, and
|
|
137
|
+
* the whole `pagination.helper.ts` module. All deleted. `PagedResult` in
|
|
138
|
+
* contracts/repository.ts still spells it `perPage` and is genuinely live in 14
|
|
139
|
+
* repositories via `IReadRepository.findAll`; converging that is a change to the
|
|
140
|
+
* repository contract itself, not to an envelope.
|
|
141
|
+
*/
|
|
120
142
|
export interface SieveResult<T> {
|
|
121
143
|
items: T[];
|
|
122
144
|
total: number;
|
|
@@ -11,7 +11,27 @@ export interface FirebaseClientRealtimeConfig {
|
|
|
11
11
|
export declare class FirebaseClientRealtimeProvider implements IClientRealtimeProvider {
|
|
12
12
|
private app;
|
|
13
13
|
private db;
|
|
14
|
+
private readonly config;
|
|
15
|
+
private readonly appName;
|
|
16
|
+
private readonly scoped;
|
|
14
17
|
constructor(config: FirebaseClientRealtimeConfig);
|
|
18
|
+
/**
|
|
19
|
+
* A provider bound to its OWN Firebase app for this claim scope.
|
|
20
|
+
*
|
|
21
|
+
* 🛑 This is what makes concurrent channels safe. Firebase Auth state is
|
|
22
|
+
* per-app, so with one shared app every `signInWithToken` REPLACED the claims
|
|
23
|
+
* of every other live subscriber: a bulk job signing in with a
|
|
24
|
+
* `{ bulkJobId }`-only token instantly stripped `conversationIds` from an open
|
|
25
|
+
* messages subscription, and vice versa. Whoever signed in last won.
|
|
26
|
+
*
|
|
27
|
+
* Reference-counting fixed only the sign-OUT half of that (a finishing job no
|
|
28
|
+
* longer ends someone else's session). Sign-IN needed separate apps, because
|
|
29
|
+
* there is nothing to coordinate — two channels legitimately need two
|
|
30
|
+
* different claim sets at the same time.
|
|
31
|
+
*
|
|
32
|
+
* Apps are cached per scope and reused, so a remount does not leak one.
|
|
33
|
+
*/
|
|
34
|
+
forScope(scope: string): IClientRealtimeProvider;
|
|
15
35
|
signInWithToken(token: string): Promise<void>;
|
|
16
36
|
signOut(): Promise<void>;
|
|
17
37
|
subscribe(path: string, onData: (snapshot: RealtimeSnapshot) => void, onError?: (error: Error) => void): Unsubscribe;
|
|
@@ -7,12 +7,44 @@ import { getAuth, signInWithCustomToken, signOut } from "firebase/auth";
|
|
|
7
7
|
*/
|
|
8
8
|
export class FirebaseClientRealtimeProvider {
|
|
9
9
|
constructor(config) {
|
|
10
|
+
this.scoped = new Map();
|
|
10
11
|
const appName = config.appName ?? "appkit-realtime";
|
|
12
|
+
this.config = config;
|
|
13
|
+
this.appName = appName;
|
|
11
14
|
this.app =
|
|
12
15
|
getApps().find((a) => a.name === appName) ??
|
|
13
16
|
initializeApp(config.firebaseConfig, appName);
|
|
14
17
|
this.db = getDatabase(this.app);
|
|
15
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* A provider bound to its OWN Firebase app for this claim scope.
|
|
21
|
+
*
|
|
22
|
+
* 🛑 This is what makes concurrent channels safe. Firebase Auth state is
|
|
23
|
+
* per-app, so with one shared app every `signInWithToken` REPLACED the claims
|
|
24
|
+
* of every other live subscriber: a bulk job signing in with a
|
|
25
|
+
* `{ bulkJobId }`-only token instantly stripped `conversationIds` from an open
|
|
26
|
+
* messages subscription, and vice versa. Whoever signed in last won.
|
|
27
|
+
*
|
|
28
|
+
* Reference-counting fixed only the sign-OUT half of that (a finishing job no
|
|
29
|
+
* longer ends someone else's session). Sign-IN needed separate apps, because
|
|
30
|
+
* there is nothing to coordinate — two channels legitimately need two
|
|
31
|
+
* different claim sets at the same time.
|
|
32
|
+
*
|
|
33
|
+
* Apps are cached per scope and reused, so a remount does not leak one.
|
|
34
|
+
*/
|
|
35
|
+
forScope(scope) {
|
|
36
|
+
const existing = this.scoped.get(scope);
|
|
37
|
+
if (existing)
|
|
38
|
+
return existing;
|
|
39
|
+
// Firebase app names are freeform, but keep them predictable in devtools.
|
|
40
|
+
const safe = scope.replace(/[^a-zA-Z0-9_-]/g, "-");
|
|
41
|
+
const child = new FirebaseClientRealtimeProvider({
|
|
42
|
+
...this.config,
|
|
43
|
+
appName: `${this.appName}-${safe}`,
|
|
44
|
+
});
|
|
45
|
+
this.scoped.set(scope, child);
|
|
46
|
+
return child;
|
|
47
|
+
}
|
|
16
48
|
async signInWithToken(token) {
|
|
17
49
|
await signInWithCustomToken(getAuth(this.app), token);
|
|
18
50
|
}
|
|
@@ -21,8 +53,9 @@ export class FirebaseClientRealtimeProvider {
|
|
|
21
53
|
await signOut(getAuth(this.app));
|
|
22
54
|
}
|
|
23
55
|
catch (_err) {
|
|
56
|
+
// A secondary Firebase app that was never signed in has nothing to sign
|
|
57
|
+
// out of; the caller's goal (no credential on this app) already holds.
|
|
24
58
|
void normalizeError(_err);
|
|
25
|
-
// no-op — signing out of a secondary app can fail harmlessly
|
|
26
59
|
}
|
|
27
60
|
}
|
|
28
61
|
subscribe(path, onData, onError) {
|
package/dist/providers.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
export { registerProviders, getProviders } from "./contracts/index";
|
|
13
13
|
export { configureMarketDefaults } from "./core/baseline-resolver";
|
|
14
14
|
export { firebaseAuthProvider, firebaseSessionProvider, createSessionCookieFromToken, createSessionCookie, verifyIdToken, verifySessionCookie, createMiddlewareAuthChain, requireAuth, requireRole, requireAuthUser, requireRoleUser, getUserFromRequest, requireAuthFromRequest, requireRoleFromRequest, revokeUserTokens, } from "./providers/auth-firebase/index";
|
|
15
|
-
export { firebaseDbProvider, getAdminApp, getAdminAuth, getAdminDb, getAdminStorage, getAdminRealtimeDb, _resetAdminSingletons, FirebaseRepository, BaseRepository, FirebaseSieveRepository,
|
|
15
|
+
export { firebaseDbProvider, getAdminApp, getAdminAuth, getAdminDb, getAdminStorage, getAdminRealtimeDb, _resetAdminSingletons, FirebaseRepository, BaseRepository, FirebaseSieveRepository, RTDB_PATHS, firebaseFieldOps, removeUndefined, prepareForFirestore, deserializeTimestamps, } from "./providers/db-firebase/index";
|
|
16
16
|
export type { DocumentSnapshot } from "firebase-admin/firestore";
|
|
17
17
|
export { firebaseStorageProvider } from "./providers/storage-firebase/index";
|
|
18
18
|
export { createResendProvider } from "./providers/email-resend/index";
|