@canvas-digital/blog-sdk 2.0.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/README.md +110 -0
- package/dist/BlogPlatform.d.ts +40 -0
- package/dist/BlogPlatform.d.ts.map +1 -0
- package/dist/BlogPlatform.js +38 -0
- package/dist/admin/components/BlogAdmin.d.ts +10 -0
- package/dist/admin/components/BlogAdmin.d.ts.map +1 -0
- package/dist/admin/components/BlogAdmin.js +36 -0
- package/dist/admin/components/CategoryManager.d.ts +5 -0
- package/dist/admin/components/CategoryManager.d.ts.map +1 -0
- package/dist/admin/components/CategoryManager.js +43 -0
- package/dist/admin/components/MediaManager.d.ts +7 -0
- package/dist/admin/components/MediaManager.d.ts.map +1 -0
- package/dist/admin/components/MediaManager.js +37 -0
- package/dist/admin/components/PostEditor.d.ts +7 -0
- package/dist/admin/components/PostEditor.d.ts.map +1 -0
- package/dist/admin/components/PostEditor.js +160 -0
- package/dist/admin/components/PostList.d.ts +8 -0
- package/dist/admin/components/PostList.d.ts.map +1 -0
- package/dist/admin/components/PostList.js +32 -0
- package/dist/admin/components/TagManager.d.ts +5 -0
- package/dist/admin/components/TagManager.d.ts.map +1 -0
- package/dist/admin/components/TagManager.js +41 -0
- package/dist/admin/components/editor/RichTextEditor.d.ts +8 -0
- package/dist/admin/components/editor/RichTextEditor.d.ts.map +1 -0
- package/dist/admin/components/editor/RichTextEditor.js +47 -0
- package/dist/admin/components/internal/States.d.ts +16 -0
- package/dist/admin/components/internal/States.d.ts.map +1 -0
- package/dist/admin/components/internal/States.js +15 -0
- package/dist/admin/hooks/useAsync.d.ts +23 -0
- package/dist/admin/hooks/useAsync.d.ts.map +1 -0
- package/dist/admin/hooks/useAsync.js +40 -0
- package/dist/admin/index.d.ts +10 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +9 -0
- package/dist/admin/theme.d.ts +6 -0
- package/dist/admin/theme.d.ts.map +1 -0
- package/dist/admin/theme.js +52 -0
- package/dist/admin/types.d.ts +27 -0
- package/dist/admin/types.d.ts.map +1 -0
- package/dist/admin/types.js +1 -0
- package/dist/blog-client.iife.js +1 -0
- package/dist/client/admin-client.d.ts +33 -0
- package/dist/client/admin-client.d.ts.map +1 -0
- package/dist/client/admin-client.js +153 -0
- package/dist/client/errors.d.ts +14 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +26 -0
- package/dist/client/http.d.ts +12 -0
- package/dist/client/http.d.ts.map +1 -0
- package/dist/client/http.js +135 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +6 -0
- package/dist/client/pagination.d.ts +4 -0
- package/dist/client/pagination.d.ts.map +1 -0
- package/dist/client/pagination.js +32 -0
- package/dist/client/public-client.d.ts +23 -0
- package/dist/client/public-client.d.ts.map +1 -0
- package/dist/client/public-client.js +94 -0
- package/dist/client/types.d.ts +115 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +1 -0
- package/dist/components/BlogUploader/BackButton.d.ts +5 -0
- package/dist/components/BlogUploader/BackButton.d.ts.map +1 -0
- package/dist/components/BlogUploader/BackButton.js +27 -0
- package/dist/components/BlogUploader/CommentSection.d.ts +12 -0
- package/dist/components/BlogUploader/CommentSection.d.ts.map +1 -0
- package/dist/components/BlogUploader/CommentSection.js +65 -0
- package/dist/components/BlogUploader/PostCard.d.ts +17 -0
- package/dist/components/BlogUploader/PostCard.d.ts.map +1 -0
- package/dist/components/BlogUploader/PostCard.js +42 -0
- package/dist/components/BlogUploader/PostFormatHero.d.ts +7 -0
- package/dist/components/BlogUploader/PostFormatHero.d.ts.map +1 -0
- package/dist/components/BlogUploader/PostFormatHero.js +47 -0
- package/dist/components/BlogUploader/ReadingProgress.d.ts +9 -0
- package/dist/components/BlogUploader/ReadingProgress.d.ts.map +1 -0
- package/dist/components/BlogUploader/ReadingProgress.js +28 -0
- package/dist/components/BlogUploader/RichText.d.ts +5 -0
- package/dist/components/BlogUploader/RichText.d.ts.map +1 -0
- package/dist/components/BlogUploader/RichText.js +59 -0
- package/dist/components/BlogUploader/ShareRow.d.ts +12 -0
- package/dist/components/BlogUploader/ShareRow.d.ts.map +1 -0
- package/dist/components/BlogUploader/ShareRow.js +13 -0
- package/dist/components/BlogUploader/ViewBeacon.d.ts +12 -0
- package/dist/components/BlogUploader/ViewBeacon.d.ts.map +1 -0
- package/dist/components/BlogUploader/ViewBeacon.js +37 -0
- package/dist/components/BlogUploader/dashboard/BrandSettings.d.ts +28 -0
- package/dist/components/BlogUploader/dashboard/BrandSettings.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/BrandSettings.js +60 -0
- package/dist/components/BlogUploader/dashboard/BrandSwitcher.d.ts +14 -0
- package/dist/components/BlogUploader/dashboard/BrandSwitcher.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/BrandSwitcher.js +25 -0
- package/dist/components/BlogUploader/dashboard/Chips.d.ts +15 -0
- package/dist/components/BlogUploader/dashboard/Chips.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/Chips.js +15 -0
- package/dist/components/BlogUploader/dashboard/CommentsManager.d.ts +19 -0
- package/dist/components/BlogUploader/dashboard/CommentsManager.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/CommentsManager.js +32 -0
- package/dist/components/BlogUploader/dashboard/LogOutButton.d.ts +4 -0
- package/dist/components/BlogUploader/dashboard/LogOutButton.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/LogOutButton.js +22 -0
- package/dist/components/BlogUploader/dashboard/MediaLibrary.d.ts +16 -0
- package/dist/components/BlogUploader/dashboard/MediaLibrary.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/MediaLibrary.js +124 -0
- package/dist/components/BlogUploader/dashboard/MediaPicker.d.ts +19 -0
- package/dist/components/BlogUploader/dashboard/MediaPicker.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/MediaPicker.js +99 -0
- package/dist/components/BlogUploader/dashboard/PostsTable.d.ts +46 -0
- package/dist/components/BlogUploader/dashboard/PostsTable.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/PostsTable.js +109 -0
- package/dist/components/BlogUploader/dashboard/Shell.d.ts +25 -0
- package/dist/components/BlogUploader/dashboard/Shell.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/Shell.js +128 -0
- package/dist/components/BlogUploader/dashboard/TermManager.d.ts +29 -0
- package/dist/components/BlogUploader/dashboard/TermManager.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/TermManager.js +96 -0
- package/dist/components/BlogUploader/dashboard/ToastProvider.d.ts +6 -0
- package/dist/components/BlogUploader/dashboard/ToastProvider.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/ToastProvider.js +5 -0
- package/dist/components/BlogUploader/dashboard/UsersManager.d.ts +32 -0
- package/dist/components/BlogUploader/dashboard/UsersManager.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/UsersManager.js +98 -0
- package/dist/components/BlogUploader/dashboard/charts.d.ts +22 -0
- package/dist/components/BlogUploader/dashboard/charts.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/charts.js +79 -0
- package/dist/components/BlogUploader/dashboard/editor/FormatContentPanel.d.ts +25 -0
- package/dist/components/BlogUploader/dashboard/editor/FormatContentPanel.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/FormatContentPanel.js +62 -0
- package/dist/components/BlogUploader/dashboard/editor/PostEditor.d.ts +95 -0
- package/dist/components/BlogUploader/dashboard/editor/PostEditor.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/PostEditor.js +649 -0
- package/dist/components/BlogUploader/dashboard/editor/RichTextEditor.d.ts +37 -0
- package/dist/components/BlogUploader/dashboard/editor/RichTextEditor.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/RichTextEditor.js +475 -0
- package/dist/components/BlogUploader/dashboard/editor/SeoAnalysisPanel.d.ts +11 -0
- package/dist/components/BlogUploader/dashboard/editor/SeoAnalysisPanel.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/SeoAnalysisPanel.js +31 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastCollapsible.d.ts +12 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastCollapsible.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastCollapsible.js +5 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastInsightsPanel.d.ts +4 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastInsightsPanel.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastInsightsPanel.js +31 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastInternalLinksPanel.d.ts +4 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastInternalLinksPanel.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastInternalLinksPanel.js +35 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSeoAnalysisPanel.d.ts +11 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSeoAnalysisPanel.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSeoAnalysisPanel.js +23 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSeoMetabox.d.ts +50 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSeoMetabox.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSeoMetabox.js +101 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSnippetField.d.ts +22 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSnippetField.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/YoastSnippetField.js +51 -0
- package/dist/components/BlogUploader/dashboard/editor/load.d.ts +10 -0
- package/dist/components/BlogUploader/dashboard/editor/load.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/editor/load.js +141 -0
- package/dist/components/BlogUploader/dashboard/loadTerms.d.ts +13 -0
- package/dist/components/BlogUploader/dashboard/loadTerms.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/loadTerms.js +41 -0
- package/dist/components/BlogUploader/dashboard/seo/BrandSeoActions.d.ts +8 -0
- package/dist/components/BlogUploader/dashboard/seo/BrandSeoActions.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/BrandSeoActions.js +35 -0
- package/dist/components/BlogUploader/dashboard/seo/Ga4Settings.d.ts +9 -0
- package/dist/components/BlogUploader/dashboard/seo/Ga4Settings.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/Ga4Settings.js +40 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectAnalyticsDashboard.d.ts +5 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectAnalyticsDashboard.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectAnalyticsDashboard.js +29 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectDetail.d.ts +10 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectDetail.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectDetail.js +31 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectForm.d.ts +27 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectForm.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectForm.js +79 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectList.d.ts +20 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectList.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/RedirectList.js +33 -0
- package/dist/components/BlogUploader/dashboard/seo/RobotsEditor.d.ts +11 -0
- package/dist/components/BlogUploader/dashboard/seo/RobotsEditor.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/RobotsEditor.js +54 -0
- package/dist/components/BlogUploader/dashboard/seo/SearchConsoleSettings.d.ts +9 -0
- package/dist/components/BlogUploader/dashboard/seo/SearchConsoleSettings.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/SearchConsoleSettings.js +38 -0
- package/dist/components/BlogUploader/dashboard/seo/SeoBrandList.d.ts +28 -0
- package/dist/components/BlogUploader/dashboard/seo/SeoBrandList.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/SeoBrandList.js +29 -0
- package/dist/components/BlogUploader/dashboard/seo/SeoBrandLists.d.ts +17 -0
- package/dist/components/BlogUploader/dashboard/seo/SeoBrandLists.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/SeoBrandLists.js +8 -0
- package/dist/components/BlogUploader/dashboard/seo/shared.d.ts +18 -0
- package/dist/components/BlogUploader/dashboard/seo/shared.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/seo/shared.js +6 -0
- package/dist/components/BlogUploader/dashboard/tools/ExportTool.d.ts +8 -0
- package/dist/components/BlogUploader/dashboard/tools/ExportTool.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/tools/ExportTool.js +78 -0
- package/dist/components/BlogUploader/dashboard/tools/ImportTool.d.ts +7 -0
- package/dist/components/BlogUploader/dashboard/tools/ImportTool.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/tools/ImportTool.js +70 -0
- package/dist/components/BlogUploader/dashboard/upload.d.ts +47 -0
- package/dist/components/BlogUploader/dashboard/upload.d.ts.map +1 -0
- package/dist/components/BlogUploader/dashboard/upload.js +68 -0
- package/dist/components/BlogUploader/site/ArticleDetailHero.d.ts +27 -0
- package/dist/components/BlogUploader/site/ArticleDetailHero.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/ArticleDetailHero.js +13 -0
- package/dist/components/BlogUploader/site/ArticleRailDetails.d.ts +27 -0
- package/dist/components/BlogUploader/site/ArticleRailDetails.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/ArticleRailDetails.js +17 -0
- package/dist/components/BlogUploader/site/BlogIndexView.d.ts +28 -0
- package/dist/components/BlogUploader/site/BlogIndexView.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/BlogIndexView.js +34 -0
- package/dist/components/BlogUploader/site/BrandTableOfContents.d.ts +18 -0
- package/dist/components/BlogUploader/site/BrandTableOfContents.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/BrandTableOfContents.js +15 -0
- package/dist/components/BlogUploader/site/HeroFadeSlide.d.ts +11 -0
- package/dist/components/BlogUploader/site/HeroFadeSlide.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/HeroFadeSlide.js +3 -0
- package/dist/components/BlogUploader/site/HeroMediaVisual.d.ts +23 -0
- package/dist/components/BlogUploader/site/HeroMediaVisual.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/HeroMediaVisual.js +50 -0
- package/dist/components/BlogUploader/site/IndexFeedSection.d.ts +14 -0
- package/dist/components/BlogUploader/site/IndexFeedSection.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/IndexFeedSection.js +12 -0
- package/dist/components/BlogUploader/site/InfinitePostFeed.d.ts +23 -0
- package/dist/components/BlogUploader/site/InfinitePostFeed.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/InfinitePostFeed.js +152 -0
- package/dist/components/BlogUploader/site/SiteMediaHero.d.ts +12 -0
- package/dist/components/BlogUploader/site/SiteMediaHero.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/SiteMediaHero.js +80 -0
- package/dist/components/BlogUploader/site/SiteMotion.d.ts +12 -0
- package/dist/components/BlogUploader/site/SiteMotion.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/SiteMotion.js +27 -0
- package/dist/components/BlogUploader/site/SiteNavAuth.d.ts +8 -0
- package/dist/components/BlogUploader/site/SiteNavAuth.d.ts.map +1 -0
- package/dist/components/BlogUploader/site/SiteNavAuth.js +36 -0
- package/dist/components/admin/AdminPostDetail.d.ts +7 -0
- package/dist/components/admin/AdminPostDetail.d.ts.map +1 -0
- package/dist/components/admin/AdminPostDetail.js +105 -0
- package/dist/components/admin/BrandSettings.d.ts +11 -0
- package/dist/components/admin/BrandSettings.d.ts.map +1 -0
- package/dist/components/admin/BrandSettings.js +71 -0
- package/dist/components/admin/BrandSwitcher.d.ts +3 -0
- package/dist/components/admin/BrandSwitcher.d.ts.map +1 -0
- package/dist/components/admin/BrandSwitcher.js +12 -0
- package/dist/components/admin/CategoryManager.d.ts +2 -0
- package/dist/components/admin/CategoryManager.d.ts.map +1 -0
- package/dist/components/admin/CategoryManager.js +1 -0
- package/dist/components/admin/Chips.d.ts +15 -0
- package/dist/components/admin/Chips.d.ts.map +1 -0
- package/dist/components/admin/Chips.js +15 -0
- package/dist/components/admin/CommentsManager.d.ts +6 -0
- package/dist/components/admin/CommentsManager.d.ts.map +1 -0
- package/dist/components/admin/CommentsManager.js +30 -0
- package/dist/components/admin/Dashboard.d.ts +3 -0
- package/dist/components/admin/Dashboard.d.ts.map +1 -0
- package/dist/components/admin/Dashboard.js +34 -0
- package/dist/components/admin/MediaLibrary.d.ts +4 -0
- package/dist/components/admin/MediaLibrary.d.ts.map +1 -0
- package/dist/components/admin/MediaLibrary.js +119 -0
- package/dist/components/admin/MediaManager.d.ts +2 -0
- package/dist/components/admin/MediaManager.d.ts.map +1 -0
- package/dist/components/admin/MediaManager.js +1 -0
- package/dist/components/admin/MediaPicker.d.ts +10 -0
- package/dist/components/admin/MediaPicker.d.ts.map +1 -0
- package/dist/components/admin/MediaPicker.js +86 -0
- package/dist/components/admin/PostEditor.d.ts +2 -0
- package/dist/components/admin/PostEditor.d.ts.map +1 -0
- package/dist/components/admin/PostEditor.js +1 -0
- package/dist/components/admin/PostList.d.ts +13 -0
- package/dist/components/admin/PostList.d.ts.map +1 -0
- package/dist/components/admin/PostList.js +93 -0
- package/dist/components/admin/PostsTable.d.ts +15 -0
- package/dist/components/admin/PostsTable.d.ts.map +1 -0
- package/dist/components/admin/PostsTable.js +106 -0
- package/dist/components/admin/Shell.d.ts +18 -0
- package/dist/components/admin/Shell.d.ts.map +1 -0
- package/dist/components/admin/Shell.js +99 -0
- package/dist/components/admin/TagManager.d.ts +2 -0
- package/dist/components/admin/TagManager.d.ts.map +1 -0
- package/dist/components/admin/TagManager.js +1 -0
- package/dist/components/admin/TermManager.d.ts +9 -0
- package/dist/components/admin/TermManager.d.ts.map +1 -0
- package/dist/components/admin/TermManager.js +105 -0
- package/dist/components/admin/UsersManager.d.ts +5 -0
- package/dist/components/admin/UsersManager.d.ts.map +1 -0
- package/dist/components/admin/UsersManager.js +96 -0
- package/dist/components/admin/api/mappers.d.ts +37 -0
- package/dist/components/admin/api/mappers.d.ts.map +1 -0
- package/dist/components/admin/api/mappers.js +174 -0
- package/dist/components/admin/charts.d.ts +30 -0
- package/dist/components/admin/charts.d.ts.map +1 -0
- package/dist/components/admin/charts.js +79 -0
- package/dist/components/admin/editor/FormatContentPanel.d.ts +25 -0
- package/dist/components/admin/editor/FormatContentPanel.d.ts.map +1 -0
- package/dist/components/admin/editor/FormatContentPanel.js +62 -0
- package/dist/components/admin/editor/PostEditor.d.ts +5 -0
- package/dist/components/admin/editor/PostEditor.d.ts.map +1 -0
- package/dist/components/admin/editor/PostEditor.js +404 -0
- package/dist/components/admin/editor/RichTextEditor.d.ts +42 -0
- package/dist/components/admin/editor/RichTextEditor.d.ts.map +1 -0
- package/dist/components/admin/editor/RichTextEditor.js +475 -0
- package/dist/components/admin/editor/SeoAnalysisPanel.d.ts +11 -0
- package/dist/components/admin/editor/SeoAnalysisPanel.d.ts.map +1 -0
- package/dist/components/admin/editor/SeoAnalysisPanel.js +31 -0
- package/dist/components/admin/editor/YoastCollapsible.d.ts +12 -0
- package/dist/components/admin/editor/YoastCollapsible.d.ts.map +1 -0
- package/dist/components/admin/editor/YoastCollapsible.js +5 -0
- package/dist/components/admin/editor/YoastInsightsPanel.d.ts +4 -0
- package/dist/components/admin/editor/YoastInsightsPanel.d.ts.map +1 -0
- package/dist/components/admin/editor/YoastInsightsPanel.js +31 -0
- package/dist/components/admin/editor/YoastInternalLinksPanel.d.ts +4 -0
- package/dist/components/admin/editor/YoastInternalLinksPanel.d.ts.map +1 -0
- package/dist/components/admin/editor/YoastInternalLinksPanel.js +35 -0
- package/dist/components/admin/editor/YoastSeoAnalysisPanel.d.ts +11 -0
- package/dist/components/admin/editor/YoastSeoAnalysisPanel.d.ts.map +1 -0
- package/dist/components/admin/editor/YoastSeoAnalysisPanel.js +23 -0
- package/dist/components/admin/editor/YoastSeoMetabox.d.ts +54 -0
- package/dist/components/admin/editor/YoastSeoMetabox.d.ts.map +1 -0
- package/dist/components/admin/editor/YoastSeoMetabox.js +101 -0
- package/dist/components/admin/editor/YoastSnippetField.d.ts +22 -0
- package/dist/components/admin/editor/YoastSnippetField.d.ts.map +1 -0
- package/dist/components/admin/editor/YoastSnippetField.js +51 -0
- package/dist/components/admin/editor/load.d.ts +10 -0
- package/dist/components/admin/editor/load.d.ts.map +1 -0
- package/dist/components/admin/editor/load.js +141 -0
- package/dist/components/admin/index.d.ts +28 -0
- package/dist/components/admin/index.d.ts.map +1 -0
- package/dist/components/admin/index.js +27 -0
- package/dist/components/admin/internal/States.d.ts +16 -0
- package/dist/components/admin/internal/States.d.ts.map +1 -0
- package/dist/components/admin/internal/States.js +15 -0
- package/dist/components/admin/lib/format.d.ts +7 -0
- package/dist/components/admin/lib/format.d.ts.map +1 -0
- package/dist/components/admin/lib/format.js +43 -0
- package/dist/components/admin/lib/publishing.d.ts +8 -0
- package/dist/components/admin/lib/publishing.d.ts.map +1 -0
- package/dist/components/admin/lib/publishing.js +10 -0
- package/dist/components/admin/lib/robots.d.ts +13 -0
- package/dist/components/admin/lib/robots.d.ts.map +1 -0
- package/dist/components/admin/lib/robots.js +22 -0
- package/dist/components/admin/mock/fixtures.d.ts +240 -0
- package/dist/components/admin/mock/fixtures.d.ts.map +1 -0
- package/dist/components/admin/mock/fixtures.js +546 -0
- package/dist/components/admin/mock/store.d.ts +139 -0
- package/dist/components/admin/mock/store.d.ts.map +1 -0
- package/dist/components/admin/mock/store.js +1067 -0
- package/dist/components/admin/seo/Ga4Settings.d.ts +34 -0
- package/dist/components/admin/seo/Ga4Settings.d.ts.map +1 -0
- package/dist/components/admin/seo/Ga4Settings.js +80 -0
- package/dist/components/admin/seo/RedirectAnalyticsDashboard.d.ts +5 -0
- package/dist/components/admin/seo/RedirectAnalyticsDashboard.d.ts.map +1 -0
- package/dist/components/admin/seo/RedirectAnalyticsDashboard.js +24 -0
- package/dist/components/admin/seo/RedirectDetail.d.ts +11 -0
- package/dist/components/admin/seo/RedirectDetail.d.ts.map +1 -0
- package/dist/components/admin/seo/RedirectDetail.js +30 -0
- package/dist/components/admin/seo/RedirectForm.d.ts +29 -0
- package/dist/components/admin/seo/RedirectForm.d.ts.map +1 -0
- package/dist/components/admin/seo/RedirectForm.js +89 -0
- package/dist/components/admin/seo/RedirectList.d.ts +10 -0
- package/dist/components/admin/seo/RedirectList.d.ts.map +1 -0
- package/dist/components/admin/seo/RedirectList.js +28 -0
- package/dist/components/admin/seo/RobotsEditor.d.ts +5 -0
- package/dist/components/admin/seo/RobotsEditor.d.ts.map +1 -0
- package/dist/components/admin/seo/RobotsEditor.js +50 -0
- package/dist/components/admin/seo/SearchConsoleSettings.d.ts +3 -0
- package/dist/components/admin/seo/SearchConsoleSettings.d.ts.map +1 -0
- package/dist/components/admin/seo/SearchConsoleSettings.js +1 -0
- package/dist/components/admin/seo/SeoBrandList.d.ts +3 -0
- package/dist/components/admin/seo/SeoBrandList.d.ts.map +1 -0
- package/dist/components/admin/seo/SeoBrandList.js +1 -0
- package/dist/components/admin/seo/shared.d.ts +17 -0
- package/dist/components/admin/seo/shared.d.ts.map +1 -0
- package/dist/components/admin/seo/shared.js +7 -0
- package/dist/components/admin/tools/ExportTool.d.ts +3 -0
- package/dist/components/admin/tools/ExportTool.d.ts.map +1 -0
- package/dist/components/admin/tools/ExportTool.js +1 -0
- package/dist/components/admin/tools/ImportTool.d.ts +3 -0
- package/dist/components/admin/tools/ImportTool.d.ts.map +1 -0
- package/dist/components/admin/tools/ImportTool.js +1 -0
- package/dist/components/admin/tools/ToolsHub.d.ts +10 -0
- package/dist/components/admin/tools/ToolsHub.d.ts.map +1 -0
- package/dist/components/admin/tools/ToolsHub.js +106 -0
- package/dist/components/admin/tools/index.d.ts +3 -0
- package/dist/components/admin/tools/index.d.ts.map +1 -0
- package/dist/components/admin/tools/index.js +1 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +2 -0
- package/dist/components/user/BlogCard.d.ts +20 -0
- package/dist/components/user/BlogCard.d.ts.map +1 -0
- package/dist/components/user/BlogCard.js +22 -0
- package/dist/components/user/BlogCategories.d.ts +6 -0
- package/dist/components/user/BlogCategories.d.ts.map +1 -0
- package/dist/components/user/BlogCategories.js +11 -0
- package/dist/components/user/BlogDetail.d.ts +25 -0
- package/dist/components/user/BlogDetail.d.ts.map +1 -0
- package/dist/components/user/BlogDetail.js +90 -0
- package/dist/components/user/BlogList.d.ts +20 -0
- package/dist/components/user/BlogList.d.ts.map +1 -0
- package/dist/components/user/BlogList.js +56 -0
- package/dist/components/user/BlogSearch.d.ts +8 -0
- package/dist/components/user/BlogSearch.d.ts.map +1 -0
- package/dist/components/user/BlogSearch.js +19 -0
- package/dist/components/user/BlogTags.d.ts +6 -0
- package/dist/components/user/BlogTags.d.ts.map +1 -0
- package/dist/components/user/BlogTags.js +11 -0
- package/dist/components/user/FeaturedBlogs.d.ts +8 -0
- package/dist/components/user/FeaturedBlogs.d.ts.map +1 -0
- package/dist/components/user/FeaturedBlogs.js +12 -0
- package/dist/components/user/RelatedBlogs.d.ts +9 -0
- package/dist/components/user/RelatedBlogs.d.ts.map +1 -0
- package/dist/components/user/RelatedBlogs.js +12 -0
- package/dist/components/user/SiteMediaHero.d.ts +14 -0
- package/dist/components/user/SiteMediaHero.d.ts.map +1 -0
- package/dist/components/user/SiteMediaHero.js +43 -0
- package/dist/components/user/detail/ArticleDetailHero.d.ts +30 -0
- package/dist/components/user/detail/ArticleDetailHero.d.ts.map +1 -0
- package/dist/components/user/detail/ArticleDetailHero.js +29 -0
- package/dist/components/user/detail/ArticleRailDetails.d.ts +24 -0
- package/dist/components/user/detail/ArticleRailDetails.d.ts.map +1 -0
- package/dist/components/user/detail/ArticleRailDetails.js +12 -0
- package/dist/components/user/detail/BackButton.d.ts +7 -0
- package/dist/components/user/detail/BackButton.d.ts.map +1 -0
- package/dist/components/user/detail/BackButton.js +18 -0
- package/dist/components/user/detail/CommentSection.d.ts +28 -0
- package/dist/components/user/detail/CommentSection.d.ts.map +1 -0
- package/dist/components/user/detail/CommentSection.js +68 -0
- package/dist/components/user/detail/HeroFadeSlide.d.ts +12 -0
- package/dist/components/user/detail/HeroFadeSlide.d.ts.map +1 -0
- package/dist/components/user/detail/HeroFadeSlide.js +5 -0
- package/dist/components/user/detail/ReadingProgress.d.ts +2 -0
- package/dist/components/user/detail/ReadingProgress.d.ts.map +1 -0
- package/dist/components/user/detail/ReadingProgress.js +20 -0
- package/dist/components/user/detail/ShareRow.d.ts +7 -0
- package/dist/components/user/detail/ShareRow.d.ts.map +1 -0
- package/dist/components/user/detail/ShareRow.js +7 -0
- package/dist/components/user/detail/toc.d.ts +14 -0
- package/dist/components/user/detail/toc.d.ts.map +1 -0
- package/dist/components/user/detail/toc.js +106 -0
- package/dist/components/user/index.d.ts +14 -0
- package/dist/components/user/index.d.ts.map +1 -0
- package/dist/components/user/index.js +13 -0
- package/dist/components/user/internal/States.d.ts +18 -0
- package/dist/components/user/internal/States.d.ts.map +1 -0
- package/dist/components/user/internal/States.js +21 -0
- package/dist/constants/index.d.ts +4 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +3 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useAsync.d.ts +23 -0
- package/dist/hooks/useAsync.d.ts.map +1 -0
- package/dist/hooks/useAsync.js +40 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/lib/access.d.ts +64 -0
- package/dist/lib/access.d.ts.map +1 -0
- package/dist/lib/access.js +127 -0
- package/dist/lib/canonical.d.ts +15 -0
- package/dist/lib/canonical.d.ts.map +1 -0
- package/dist/lib/canonical.js +34 -0
- package/dist/lib/comments.d.ts +9 -0
- package/dist/lib/comments.d.ts.map +1 -0
- package/dist/lib/comments.js +23 -0
- package/dist/lib/dashboard.d.ts +39 -0
- package/dist/lib/dashboard.d.ts.map +1 -0
- package/dist/lib/dashboard.js +157 -0
- package/dist/lib/data-transfer.d.ts +23 -0
- package/dist/lib/data-transfer.d.ts.map +1 -0
- package/dist/lib/data-transfer.js +436 -0
- package/dist/lib/default-author.d.ts +12 -0
- package/dist/lib/default-author.d.ts.map +1 -0
- package/dist/lib/default-author.js +57 -0
- package/dist/lib/format-media.d.ts +6 -0
- package/dist/lib/format-media.d.ts.map +1 -0
- package/dist/lib/format-media.js +18 -0
- package/dist/lib/format.d.ts +7 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +43 -0
- package/dist/lib/hero-post.d.ts +24 -0
- package/dist/lib/hero-post.d.ts.map +1 -0
- package/dist/lib/hero-post.js +95 -0
- package/dist/lib/lexical-build.d.ts +30 -0
- package/dist/lib/lexical-build.d.ts.map +1 -0
- package/dist/lib/lexical-build.js +57 -0
- package/dist/lib/lexical-doc.d.ts +88 -0
- package/dist/lib/lexical-doc.d.ts.map +1 -0
- package/dist/lib/lexical-doc.js +385 -0
- package/dist/lib/lexical-dom.d.ts +19 -0
- package/dist/lib/lexical-dom.d.ts.map +1 -0
- package/dist/lib/lexical-dom.js +181 -0
- package/dist/lib/lexical.d.ts +31 -0
- package/dist/lib/lexical.d.ts.map +1 -0
- package/dist/lib/lexical.js +59 -0
- package/dist/lib/post-categories.d.ts +11 -0
- package/dist/lib/post-categories.d.ts.map +1 -0
- package/dist/lib/post-categories.js +27 -0
- package/dist/lib/post-format.d.ts +39 -0
- package/dist/lib/post-format.d.ts.map +1 -0
- package/dist/lib/post-format.js +82 -0
- package/dist/lib/publishing.d.ts +3 -0
- package/dist/lib/publishing.d.ts.map +1 -0
- package/dist/lib/publishing.js +1 -0
- package/dist/lib/queries.d.ts +49 -0
- package/dist/lib/queries.d.ts.map +1 -0
- package/dist/lib/queries.js +340 -0
- package/dist/lib/redirect-analytics.d.ts +27 -0
- package/dist/lib/redirect-analytics.d.ts.map +1 -0
- package/dist/lib/redirect-analytics.js +147 -0
- package/dist/lib/redirects.d.ts +39 -0
- package/dist/lib/redirects.d.ts.map +1 -0
- package/dist/lib/redirects.js +96 -0
- package/dist/lib/revalidate.d.ts +30 -0
- package/dist/lib/revalidate.d.ts.map +1 -0
- package/dist/lib/revalidate.js +91 -0
- package/dist/lib/robots.d.ts +19 -0
- package/dist/lib/robots.d.ts.map +1 -0
- package/dist/lib/robots.js +38 -0
- package/dist/lib/seo-analysis.d.ts +28 -0
- package/dist/lib/seo-analysis.d.ts.map +1 -0
- package/dist/lib/seo-analysis.js +153 -0
- package/dist/lib/seo-limits.d.ts +19 -0
- package/dist/lib/seo-limits.d.ts.map +1 -0
- package/dist/lib/seo-limits.js +39 -0
- package/dist/lib/seo.d.ts +50 -0
- package/dist/lib/seo.d.ts.map +1 -0
- package/dist/lib/seo.js +238 -0
- package/dist/lib/slug.d.ts +3 -0
- package/dist/lib/slug.d.ts.map +1 -0
- package/dist/lib/slug.js +9 -0
- package/dist/lib/stats.d.ts +71 -0
- package/dist/lib/stats.d.ts.map +1 -0
- package/dist/lib/stats.js +207 -0
- package/dist/lib/tenant-host.d.ts +9 -0
- package/dist/lib/tenant-host.d.ts.map +1 -0
- package/dist/lib/tenant-host.js +15 -0
- package/dist/lib/tenant.d.ts +41 -0
- package/dist/lib/tenant.d.ts.map +1 -0
- package/dist/lib/tenant.js +140 -0
- package/dist/lib/toc.d.ts +16 -0
- package/dist/lib/toc.d.ts.map +1 -0
- package/dist/lib/toc.js +28 -0
- package/dist/lib/yoast-snippet.d.ts +25 -0
- package/dist/lib/yoast-snippet.d.ts.map +1 -0
- package/dist/lib/yoast-snippet.js +79 -0
- package/dist/pages/admin/BlogAdmin.d.ts +9 -0
- package/dist/pages/admin/BlogAdmin.d.ts.map +1 -0
- package/dist/pages/admin/BlogAdmin.js +234 -0
- package/dist/pages/admin/index.d.ts +2 -0
- package/dist/pages/admin/index.d.ts.map +1 -0
- package/dist/pages/admin/index.js +1 -0
- package/dist/pages/index.d.ts +3 -0
- package/dist/pages/index.d.ts.map +1 -0
- package/dist/pages/index.js +2 -0
- package/dist/pages/user/UserBlogPage.d.ts +10 -0
- package/dist/pages/user/UserBlogPage.d.ts.map +1 -0
- package/dist/pages/user/UserBlogPage.js +15 -0
- package/dist/pages/user/index.d.ts +2 -0
- package/dist/pages/user/index.d.ts.map +1 -0
- package/dist/pages/user/index.js +1 -0
- package/dist/services/admin-client.d.ts +33 -0
- package/dist/services/admin-client.d.ts.map +1 -0
- package/dist/services/admin-client.js +154 -0
- package/dist/services/admin-sdk-client.d.ts +285 -0
- package/dist/services/admin-sdk-client.d.ts.map +1 -0
- package/dist/services/admin-sdk-client.js +242 -0
- package/dist/services/errors.d.ts +14 -0
- package/dist/services/errors.d.ts.map +1 -0
- package/dist/services/errors.js +26 -0
- package/dist/services/http.d.ts +24 -0
- package/dist/services/http.d.ts.map +1 -0
- package/dist/services/http.js +159 -0
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +7 -0
- package/dist/services/pagination.d.ts +4 -0
- package/dist/services/pagination.d.ts.map +1 -0
- package/dist/services/pagination.js +32 -0
- package/dist/services/public-client.d.ts +23 -0
- package/dist/services/public-client.d.ts.map +1 -0
- package/dist/services/public-client.js +94 -0
- package/dist/services/types.d.ts +124 -0
- package/dist/services/types.d.ts.map +1 -0
- package/dist/services/types.js +1 -0
- package/dist/style.css +3105 -0
- package/dist/styles/adminTheme.d.ts +6 -0
- package/dist/styles/adminTheme.d.ts.map +1 -0
- package/dist/styles/adminTheme.js +52 -0
- package/dist/styles/index.d.ts +3 -0
- package/dist/styles/index.d.ts.map +1 -0
- package/dist/styles/index.js +2 -0
- package/dist/styles/userTheme.d.ts +8 -0
- package/dist/styles/userTheme.d.ts.map +1 -0
- package/dist/styles/userTheme.js +60 -0
- package/dist/types/admin.d.ts +28 -0
- package/dist/types/admin.d.ts.map +1 -0
- package/dist/types/admin.js +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/user.d.ts +41 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/user.js +1 -0
- package/dist/user/components/BlogCard.d.ts +15 -0
- package/dist/user/components/BlogCard.d.ts.map +1 -0
- package/dist/user/components/BlogCard.js +31 -0
- package/dist/user/components/BlogCategories.d.ts +6 -0
- package/dist/user/components/BlogCategories.d.ts.map +1 -0
- package/dist/user/components/BlogCategories.js +11 -0
- package/dist/user/components/BlogDetail.d.ts +7 -0
- package/dist/user/components/BlogDetail.d.ts.map +1 -0
- package/dist/user/components/BlogDetail.js +19 -0
- package/dist/user/components/BlogList.d.ts +8 -0
- package/dist/user/components/BlogList.d.ts.map +1 -0
- package/dist/user/components/BlogList.js +18 -0
- package/dist/user/components/BlogSearch.d.ts +8 -0
- package/dist/user/components/BlogSearch.d.ts.map +1 -0
- package/dist/user/components/BlogSearch.js +19 -0
- package/dist/user/components/BlogTags.d.ts +6 -0
- package/dist/user/components/BlogTags.d.ts.map +1 -0
- package/dist/user/components/BlogTags.js +11 -0
- package/dist/user/components/FeaturedBlogs.d.ts +8 -0
- package/dist/user/components/FeaturedBlogs.d.ts.map +1 -0
- package/dist/user/components/FeaturedBlogs.js +12 -0
- package/dist/user/components/RelatedBlogs.d.ts +9 -0
- package/dist/user/components/RelatedBlogs.d.ts.map +1 -0
- package/dist/user/components/RelatedBlogs.js +12 -0
- package/dist/user/components/internal/States.d.ts +18 -0
- package/dist/user/components/internal/States.d.ts.map +1 -0
- package/dist/user/components/internal/States.js +16 -0
- package/dist/user/hooks/useAsync.d.ts +21 -0
- package/dist/user/hooks/useAsync.d.ts.map +1 -0
- package/dist/user/hooks/useAsync.js +40 -0
- package/dist/user/index.d.ts +11 -0
- package/dist/user/index.d.ts.map +1 -0
- package/dist/user/index.js +10 -0
- package/dist/user/sanitize.d.ts +2 -0
- package/dist/user/sanitize.d.ts.map +1 -0
- package/dist/user/sanitize.js +120 -0
- package/dist/user/theme.d.ts +8 -0
- package/dist/user/theme.d.ts.map +1 -0
- package/dist/user/theme.js +60 -0
- package/dist/user/types.d.ts +41 -0
- package/dist/user/types.d.ts.map +1 -0
- package/dist/user/types.js +1 -0
- package/dist/utils/env.d.ts +16 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +57 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/sanitize.d.ts +2 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +120 -0
- package/package.json +63 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type DependencyList } from "react";
|
|
2
|
+
export type AsyncState<T> = {
|
|
3
|
+
status: "loading";
|
|
4
|
+
data: null;
|
|
5
|
+
error: null;
|
|
6
|
+
} | {
|
|
7
|
+
status: "success";
|
|
8
|
+
data: T;
|
|
9
|
+
error: null;
|
|
10
|
+
} | {
|
|
11
|
+
status: "empty";
|
|
12
|
+
data: T;
|
|
13
|
+
error: null;
|
|
14
|
+
} | {
|
|
15
|
+
status: "error";
|
|
16
|
+
data: null;
|
|
17
|
+
error: string;
|
|
18
|
+
authError: boolean;
|
|
19
|
+
};
|
|
20
|
+
export declare function useAsync<T>(factory: () => Promise<T>, deps: DependencyList, isEmpty?: (value: T) => boolean): AsyncState<T> & {
|
|
21
|
+
reload: () => void;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=useAsync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAsync.d.ts","sourceRoot":"","sources":["../../app/hooks/useAsync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAGjE,MAAM,MAAM,UAAU,CAAC,CAAC,IACpB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GAC9C;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GAC3C;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvE,wBAAgB,QAAQ,CAAC,CAAC,EACxB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,IAAI,EAAE,cAAc,EACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAC9B,UAAU,CAAC,CAAC,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,IAAI,CAAA;CAAE,CAyCxC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
import { getErrorMessage, isAuthError } from "../services";
|
|
3
|
+
export function useAsync(factory, deps, isEmpty) {
|
|
4
|
+
const [nonce, setNonce] = useState(0);
|
|
5
|
+
const [state, setState] = useState({
|
|
6
|
+
status: "loading",
|
|
7
|
+
data: null,
|
|
8
|
+
error: null,
|
|
9
|
+
});
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
let cancelled = false;
|
|
12
|
+
setState({ status: "loading", data: null, error: null });
|
|
13
|
+
factory()
|
|
14
|
+
.then((data) => {
|
|
15
|
+
if (cancelled) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (isEmpty?.(data)) {
|
|
19
|
+
setState({ status: "empty", data, error: null });
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
setState({ status: "success", data, error: null });
|
|
23
|
+
})
|
|
24
|
+
.catch((error) => {
|
|
25
|
+
if (cancelled) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
setState({
|
|
29
|
+
status: "error",
|
|
30
|
+
data: null,
|
|
31
|
+
error: getErrorMessage(error),
|
|
32
|
+
authError: isAuthError(error),
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
return () => {
|
|
36
|
+
cancelled = true;
|
|
37
|
+
};
|
|
38
|
+
}, [...deps, nonce]);
|
|
39
|
+
return { ...state, reload: () => setNonce((value) => value + 1) };
|
|
40
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from "./services";
|
|
2
|
+
export { BlogList, BlogDetail, BlogSearch, BlogCategories, BlogTags, FeaturedBlogs, RelatedBlogs, } from "./components/user";
|
|
3
|
+
export { sanitizeHtml, normalizeDomain, resolveBlogApiUrl, } from "./utils";
|
|
4
|
+
export { DEFAULT_THEME, formatDate, cardStyle, } from "./styles/userTheme";
|
|
5
|
+
export type { BlogTheme, ThemeColors, ThemeFonts, BlogComponentProps, Branding, } from "./types/user";
|
|
6
|
+
export { BlogAdmin } from "./pages/admin";
|
|
7
|
+
export { PostList, PostEditor, CategoryManager, TagManager, MediaManager, } from "./components/admin";
|
|
8
|
+
export { buttonStyle } from "./styles/adminTheme";
|
|
9
|
+
export type { AdminTheme, Branding as AdminBranding } from "./types/admin";
|
|
10
|
+
export { UserBlogPage } from "./pages/user";
|
|
11
|
+
export * from "./BlogPlatform";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../app/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAE3B,OAAO,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,cAAc,EACd,QAAQ,EACR,aAAa,EACb,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,aAAa,EACb,UAAU,EACV,SAAS,GACV,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,QAAQ,GACT,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EACL,QAAQ,EACR,UAAU,EACV,eAAe,EACf,UAAU,EACV,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,YAAY,EAAE,UAAU,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,eAAe,CAAC;AAE3E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./services";
|
|
2
|
+
export { BlogList, BlogDetail, BlogSearch, BlogCategories, BlogTags, FeaturedBlogs, RelatedBlogs, } from "./components/user";
|
|
3
|
+
export { sanitizeHtml, normalizeDomain, resolveBlogApiUrl, } from "./utils";
|
|
4
|
+
export { DEFAULT_THEME, formatDate, cardStyle, } from "./styles/userTheme";
|
|
5
|
+
export { BlogAdmin } from "./pages/admin";
|
|
6
|
+
export { PostList, PostEditor, CategoryManager, TagManager, MediaManager, } from "./components/admin";
|
|
7
|
+
export { buttonStyle } from "./styles/adminTheme";
|
|
8
|
+
export { UserBlogPage } from "./pages/user";
|
|
9
|
+
export * from "./BlogPlatform";
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Access } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Tenant scoping lives here, in access-control functions, and nowhere else.
|
|
4
|
+
*
|
|
5
|
+
* Payload applies these to every read, write and delete — through the admin UI,
|
|
6
|
+
* the REST API and the GraphQL API alike. Scoping applied in a route handler is
|
|
7
|
+
* scoping the next developer forgets, so no query in this codebase should ever
|
|
8
|
+
* filter by tenant itself.
|
|
9
|
+
*/
|
|
10
|
+
export declare const TENANT_ROLES: readonly ["brand-admin", "editor", "author", "contributor"];
|
|
11
|
+
export type TenantRole = (typeof TENANT_ROLES)[number];
|
|
12
|
+
/** Ids are ObjectId strings on Mongo and numeric on SQL stores, so every
|
|
13
|
+
* comparison in this file goes through String() rather than assuming either. */
|
|
14
|
+
export type DocId = string | number;
|
|
15
|
+
export type TenantAssignment = {
|
|
16
|
+
tenant: DocId | {
|
|
17
|
+
id: DocId;
|
|
18
|
+
};
|
|
19
|
+
role: TenantRole;
|
|
20
|
+
categories?: (DocId | {
|
|
21
|
+
id: DocId;
|
|
22
|
+
})[] | null;
|
|
23
|
+
};
|
|
24
|
+
export type AuthUser = {
|
|
25
|
+
id: DocId;
|
|
26
|
+
globalRole?: 'platform-admin' | 'analyst' | 'none' | null;
|
|
27
|
+
tenantRoles?: TenantAssignment[] | null;
|
|
28
|
+
};
|
|
29
|
+
export declare const isPlatformAdmin: (user: unknown) => boolean;
|
|
30
|
+
export declare const isAnalyst: (user: unknown) => boolean;
|
|
31
|
+
/** Every tenant id where the user holds at least `minRole`. */
|
|
32
|
+
export declare const tenantIdsWithRole: (user: unknown, minRole: TenantRole) => string[];
|
|
33
|
+
export declare const assignmentFor: (user: unknown, tenantId: string | null) => TenantAssignment | null;
|
|
34
|
+
export declare const hasTenantRole: (user: unknown, tenantId: string | null, minRole: TenantRole) => boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Read access: platform admins and analysts see everything; everyone else is
|
|
37
|
+
* constrained to the tenants they are assigned to.
|
|
38
|
+
*/
|
|
39
|
+
export declare const readTenantScoped: Access;
|
|
40
|
+
/**
|
|
41
|
+
* Create access must return a boolean (Payload cannot apply a Where to a row
|
|
42
|
+
* that does not exist yet), so we check the tenant on the incoming payload.
|
|
43
|
+
*/
|
|
44
|
+
export declare const createTenantScoped: (minRole?: TenantRole) => Access;
|
|
45
|
+
/**
|
|
46
|
+
* Update access. Authors and contributors are additionally restricted to the
|
|
47
|
+
* documents they created; editors and above may edit anything in their tenants.
|
|
48
|
+
*/
|
|
49
|
+
export declare const updateTenantScoped: Access;
|
|
50
|
+
/** Deleting published content is a brand-admin action. */
|
|
51
|
+
export declare const deleteTenantScoped: Access;
|
|
52
|
+
/**
|
|
53
|
+
* Publishing is gated in the Posts `beforeChange` hook rather than as field
|
|
54
|
+
* access, because `_status` is owned by Payload's drafts system and declaring it
|
|
55
|
+
* a second time collides with the generated schema. The hook has the better
|
|
56
|
+
* blast radius anyway: it covers the admin UI, REST and GraphQL identically.
|
|
57
|
+
* See collections/Posts.ts.
|
|
58
|
+
*/
|
|
59
|
+
/** Only platform admins manage users and tenants. */
|
|
60
|
+
export declare const platformAdminOnly: Access;
|
|
61
|
+
export declare const authenticated: Access;
|
|
62
|
+
/** Public collections are readable by anonymous requests but only when published. */
|
|
63
|
+
export declare const publishedOrAuthenticated: Access;
|
|
64
|
+
//# sourceMappingURL=access.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../../app/lib/access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAS,MAAM,SAAS,CAAA;AAE5C;;;;;;;GAOG;AAEH,eAAO,MAAM,YAAY,6DAA8D,CAAA;AACvF,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAUtD;iFACiF;AACjF,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAEnC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,KAAK,GAAG;QAAE,EAAE,EAAE,KAAK,CAAA;KAAE,CAAA;IAC7B,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,CAAC,EAAE,CAAC,KAAK,GAAG;QAAE,EAAE,EAAE,KAAK,CAAA;KAAE,CAAC,EAAE,GAAG,IAAI,CAAA;CAC9C,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,KAAK,CAAA;IACT,UAAU,CAAC,EAAE,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAAA;IACzD,WAAW,CAAC,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAA;CACxC,CAAA;AAYD,eAAO,MAAM,eAAe,GAAI,MAAM,OAAO,KAAG,OACD,CAAA;AAE/C,eAAO,MAAM,SAAS,GAAI,MAAM,OAAO,KAAG,OAAiD,CAAA;AAE3F,+DAA+D;AAC/D,eAAO,MAAM,iBAAiB,GAAI,MAAM,OAAO,EAAE,SAAS,UAAU,KAAG,MAAM,EAO5E,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,MAAM,OAAO,EAAE,UAAU,MAAM,GAAG,IAAI,KAAG,gBAAgB,GAAG,IAIzF,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,MAAM,OAAO,EACb,UAAU,MAAM,GAAG,IAAI,EACvB,SAAS,UAAU,KAClB,OAGF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAM9B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC5B,UAAS,UAAqB,KAAG,MAOjC,CAAA;AAEH;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAmBhC,CAAA;AAED,0DAA0D;AAC1D,eAAO,MAAM,kBAAkB,EAAE,MAMhC,CAAA;AAED;;;;;;GAMG;AAEH,qDAAqD;AACrD,eAAO,MAAM,iBAAiB,EAAE,MAAqD,CAAA;AAErF,eAAO,MAAM,aAAa,EAAE,MAA6C,CAAA;AAEzE,qFAAqF;AACrF,eAAO,MAAM,wBAAwB,EAAE,MAGtC,CAAA"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant scoping lives here, in access-control functions, and nowhere else.
|
|
3
|
+
*
|
|
4
|
+
* Payload applies these to every read, write and delete — through the admin UI,
|
|
5
|
+
* the REST API and the GraphQL API alike. Scoping applied in a route handler is
|
|
6
|
+
* scoping the next developer forgets, so no query in this codebase should ever
|
|
7
|
+
* filter by tenant itself.
|
|
8
|
+
*/
|
|
9
|
+
export const TENANT_ROLES = ['brand-admin', 'editor', 'author', 'contributor'];
|
|
10
|
+
/** Higher number = more capability. Used for "at least this role" checks. */
|
|
11
|
+
const RANK = {
|
|
12
|
+
contributor: 1,
|
|
13
|
+
author: 2,
|
|
14
|
+
editor: 3,
|
|
15
|
+
'brand-admin': 4,
|
|
16
|
+
};
|
|
17
|
+
/** Relationship fields arrive either as an id or a populated doc. */
|
|
18
|
+
const idOf = (v) => {
|
|
19
|
+
if (typeof v === 'string')
|
|
20
|
+
return v;
|
|
21
|
+
if (typeof v === 'number')
|
|
22
|
+
return String(v);
|
|
23
|
+
if (v && typeof v === 'object' && 'id' in v)
|
|
24
|
+
return String(v.id);
|
|
25
|
+
return null;
|
|
26
|
+
};
|
|
27
|
+
const asUser = (user) => user ?? null;
|
|
28
|
+
export const isPlatformAdmin = (user) => asUser(user)?.globalRole === 'platform-admin';
|
|
29
|
+
export const isAnalyst = (user) => asUser(user)?.globalRole === 'analyst';
|
|
30
|
+
/** Every tenant id where the user holds at least `minRole`. */
|
|
31
|
+
export const tenantIdsWithRole = (user, minRole) => {
|
|
32
|
+
const u = asUser(user);
|
|
33
|
+
if (!u?.tenantRoles)
|
|
34
|
+
return [];
|
|
35
|
+
return u.tenantRoles
|
|
36
|
+
.filter((a) => a.role && RANK[a.role] >= RANK[minRole])
|
|
37
|
+
.map((a) => idOf(a.tenant))
|
|
38
|
+
.filter((id) => Boolean(id));
|
|
39
|
+
};
|
|
40
|
+
export const assignmentFor = (user, tenantId) => {
|
|
41
|
+
const u = asUser(user);
|
|
42
|
+
if (!u?.tenantRoles || !tenantId)
|
|
43
|
+
return null;
|
|
44
|
+
return u.tenantRoles.find((a) => idOf(a.tenant) === tenantId) ?? null;
|
|
45
|
+
};
|
|
46
|
+
export const hasTenantRole = (user, tenantId, minRole) => {
|
|
47
|
+
const a = assignmentFor(user, tenantId);
|
|
48
|
+
return Boolean(a?.role && RANK[a.role] >= RANK[minRole]);
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Read access: platform admins and analysts see everything; everyone else is
|
|
52
|
+
* constrained to the tenants they are assigned to.
|
|
53
|
+
*/
|
|
54
|
+
export const readTenantScoped = ({ req: { user } }) => {
|
|
55
|
+
if (!user)
|
|
56
|
+
return false;
|
|
57
|
+
if (isPlatformAdmin(user) || isAnalyst(user))
|
|
58
|
+
return true;
|
|
59
|
+
const ids = tenantIdsWithRole(user, 'contributor');
|
|
60
|
+
if (ids.length === 0)
|
|
61
|
+
return false;
|
|
62
|
+
return { tenant: { in: ids } };
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Create access must return a boolean (Payload cannot apply a Where to a row
|
|
66
|
+
* that does not exist yet), so we check the tenant on the incoming payload.
|
|
67
|
+
*/
|
|
68
|
+
export const createTenantScoped = (minRole = 'author') => ({ req: { user }, data }) => {
|
|
69
|
+
if (!user)
|
|
70
|
+
return false;
|
|
71
|
+
if (isPlatformAdmin(user))
|
|
72
|
+
return true;
|
|
73
|
+
const tenantId = idOf(data?.tenant);
|
|
74
|
+
if (!tenantId)
|
|
75
|
+
return false;
|
|
76
|
+
return hasTenantRole(user, tenantId, minRole);
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Update access. Authors and contributors are additionally restricted to the
|
|
80
|
+
* documents they created; editors and above may edit anything in their tenants.
|
|
81
|
+
*/
|
|
82
|
+
export const updateTenantScoped = ({ req: { user } }) => {
|
|
83
|
+
if (!user)
|
|
84
|
+
return false;
|
|
85
|
+
if (isPlatformAdmin(user))
|
|
86
|
+
return true;
|
|
87
|
+
const editorTenants = tenantIdsWithRole(user, 'editor');
|
|
88
|
+
const ownOnlyTenants = tenantIdsWithRole(user, 'contributor').filter((id) => !editorTenants.includes(id));
|
|
89
|
+
const clauses = [];
|
|
90
|
+
if (editorTenants.length)
|
|
91
|
+
clauses.push({ tenant: { in: editorTenants } });
|
|
92
|
+
if (ownOnlyTenants.length) {
|
|
93
|
+
clauses.push({
|
|
94
|
+
and: [{ tenant: { in: ownOnlyTenants } }, { createdBy: { equals: asUser(user)?.id } }],
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if (clauses.length === 0)
|
|
98
|
+
return false;
|
|
99
|
+
return clauses.length === 1 ? clauses[0] : { or: clauses };
|
|
100
|
+
};
|
|
101
|
+
/** Deleting published content is a brand-admin action. */
|
|
102
|
+
export const deleteTenantScoped = ({ req: { user } }) => {
|
|
103
|
+
if (!user)
|
|
104
|
+
return false;
|
|
105
|
+
if (isPlatformAdmin(user))
|
|
106
|
+
return true;
|
|
107
|
+
const ids = tenantIdsWithRole(user, 'brand-admin');
|
|
108
|
+
if (ids.length === 0)
|
|
109
|
+
return false;
|
|
110
|
+
return { tenant: { in: ids } };
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Publishing is gated in the Posts `beforeChange` hook rather than as field
|
|
114
|
+
* access, because `_status` is owned by Payload's drafts system and declaring it
|
|
115
|
+
* a second time collides with the generated schema. The hook has the better
|
|
116
|
+
* blast radius anyway: it covers the admin UI, REST and GraphQL identically.
|
|
117
|
+
* See collections/Posts.ts.
|
|
118
|
+
*/
|
|
119
|
+
/** Only platform admins manage users and tenants. */
|
|
120
|
+
export const platformAdminOnly = ({ req: { user } }) => isPlatformAdmin(user);
|
|
121
|
+
export const authenticated = ({ req: { user } }) => Boolean(user);
|
|
122
|
+
/** Public collections are readable by anonymous requests but only when published. */
|
|
123
|
+
export const publishedOrAuthenticated = ({ req: { user } }) => {
|
|
124
|
+
if (user)
|
|
125
|
+
return readTenantScoped({ req: { user } });
|
|
126
|
+
return { _status: { equals: 'published' } };
|
|
127
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical override: blank (this page is canonical) or a full https:// URL.
|
|
3
|
+
* Relative paths and plain text are refused.
|
|
4
|
+
*/
|
|
5
|
+
export declare const CANONICAL_HINT = "Must be a full https:// URL, or leave blank to use this page.";
|
|
6
|
+
export declare const validateCanonicalOverride: (value: unknown) => true | string;
|
|
7
|
+
/** Trimmed absolute https URL, or null when blank. Throws nothing — returns a result. */
|
|
8
|
+
export declare const normaliseCanonicalOverride: (value: string | null | undefined) => {
|
|
9
|
+
ok: true;
|
|
10
|
+
value: string | null;
|
|
11
|
+
} | {
|
|
12
|
+
ok: false;
|
|
13
|
+
message: string;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=canonical.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../app/lib/canonical.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,cAAc,kEACsC,CAAA;AAEjE,eAAO,MAAM,yBAAyB,GACpC,OAAO,OAAO,KACb,IAAI,GAAG,MAgBT,CAAA;AAED,yFAAyF;AACzF,eAAO,MAAM,0BAA0B,GACrC,OAAO,MAAM,GAAG,IAAI,GAAG,SAAS,KAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAMnE,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical override: blank (this page is canonical) or a full https:// URL.
|
|
3
|
+
* Relative paths and plain text are refused.
|
|
4
|
+
*/
|
|
5
|
+
export const CANONICAL_HINT = 'Must be a full https:// URL, or leave blank to use this page.';
|
|
6
|
+
export const validateCanonicalOverride = (value) => {
|
|
7
|
+
if (value == null)
|
|
8
|
+
return true;
|
|
9
|
+
if (typeof value !== 'string')
|
|
10
|
+
return CANONICAL_HINT;
|
|
11
|
+
const raw = value.trim();
|
|
12
|
+
if (!raw)
|
|
13
|
+
return true;
|
|
14
|
+
try {
|
|
15
|
+
const u = new URL(raw);
|
|
16
|
+
if (u.protocol !== 'https:') {
|
|
17
|
+
return 'Canonical must start with https:// (http is not allowed). Leave blank to use this page.';
|
|
18
|
+
}
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return CANONICAL_HINT;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
/** Trimmed absolute https URL, or null when blank. Throws nothing — returns a result. */
|
|
26
|
+
export const normaliseCanonicalOverride = (value) => {
|
|
27
|
+
const check = validateCanonicalOverride(value ?? '');
|
|
28
|
+
if (check !== true)
|
|
29
|
+
return { ok: false, message: check };
|
|
30
|
+
const raw = (value ?? '').trim();
|
|
31
|
+
if (!raw)
|
|
32
|
+
return { ok: true, value: null };
|
|
33
|
+
return { ok: true, value: new URL(raw).toString() };
|
|
34
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type PublicComment = {
|
|
2
|
+
id: string;
|
|
3
|
+
authorName: string;
|
|
4
|
+
body: string;
|
|
5
|
+
createdAt: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const commentsTag: (postId: string) => string;
|
|
8
|
+
export declare const getApprovedComments: (postId: string) => any;
|
|
9
|
+
//# sourceMappingURL=comments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../app/lib/comments.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,WAAyB,CAAA;AAEnE,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,QAwB/C,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { unstable_cache } from 'next/cache';
|
|
2
|
+
import { getPayloadClient } from './tenant';
|
|
3
|
+
export const commentsTag = (postId) => `comments:${postId}`;
|
|
4
|
+
export const getApprovedComments = (postId) => unstable_cache(async () => {
|
|
5
|
+
const payload = await getPayloadClient();
|
|
6
|
+
const result = await payload.find({
|
|
7
|
+
collection: 'comments',
|
|
8
|
+
where: {
|
|
9
|
+
and: [{ post: { equals: postId } }, { status: { equals: 'approved' } }],
|
|
10
|
+
},
|
|
11
|
+
sort: 'createdAt',
|
|
12
|
+
limit: 200,
|
|
13
|
+
depth: 0,
|
|
14
|
+
pagination: false,
|
|
15
|
+
overrideAccess: true,
|
|
16
|
+
});
|
|
17
|
+
return result.docs.map((c) => ({
|
|
18
|
+
id: String(c.id),
|
|
19
|
+
authorName: c.authorName,
|
|
20
|
+
body: c.body,
|
|
21
|
+
createdAt: c.createdAt,
|
|
22
|
+
}));
|
|
23
|
+
}, ['comments', postId], { tags: [commentsTag(postId)] });
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { getPayloadClient } from './tenant';
|
|
2
|
+
import type { Tenant, User } from '../payload-types';
|
|
3
|
+
/**
|
|
4
|
+
* The three things every dashboard screen needs before it can render: who is
|
|
5
|
+
* asking, which brands they may see, and the counts the sidebar puts on badges.
|
|
6
|
+
*
|
|
7
|
+
* Gathering them here means a new screen cannot accidentally skip the auth check
|
|
8
|
+
* or invent its own idea of what "needs attention" means — both come from one
|
|
9
|
+
* place, and the definition itself lives in lib/publishing.ts.
|
|
10
|
+
*/
|
|
11
|
+
export type ShellData = {
|
|
12
|
+
tenants: Tenant[];
|
|
13
|
+
activeBrand?: Tenant;
|
|
14
|
+
attentionCount: number;
|
|
15
|
+
scheduledCount: number;
|
|
16
|
+
trashCount: number;
|
|
17
|
+
canPublishHere: boolean;
|
|
18
|
+
userName: string;
|
|
19
|
+
userRole: string;
|
|
20
|
+
userAvatarUrl: string | null;
|
|
21
|
+
isAdmin: boolean;
|
|
22
|
+
};
|
|
23
|
+
export declare const displayUserRole: (user: User, activeBrand?: Tenant) => string;
|
|
24
|
+
export declare const getOptionalUser: any;
|
|
25
|
+
export declare const requireUser: (returnTo: string) => Promise<{
|
|
26
|
+
payload: any;
|
|
27
|
+
user: any;
|
|
28
|
+
}>;
|
|
29
|
+
export declare const loadShell: (payload: Awaited<ReturnType<typeof getPayloadClient>>, user: User, brandSlug?: string) => Promise<ShellData>;
|
|
30
|
+
export declare const nf: Intl.NumberFormat;
|
|
31
|
+
export declare const relative: (value?: string | null) => string;
|
|
32
|
+
export declare const fmtDateTime: (value?: string | Date | null) => string;
|
|
33
|
+
export declare const fmtDate: (value?: string | Date | null) => string;
|
|
34
|
+
/** Relationship values arrive populated or bare depending on depth. */
|
|
35
|
+
export declare const relName: (v: unknown) => string | null;
|
|
36
|
+
export declare const relSlug: (v: unknown) => string | null;
|
|
37
|
+
export declare const relTitle: (v: unknown) => string | null;
|
|
38
|
+
export declare const relId: (v: unknown) => string | null;
|
|
39
|
+
//# sourceMappingURL=dashboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../app/lib/dashboard.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAK3C,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEpD;;;;;;;GAOG;AAEH,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,OAAO,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAQD,eAAO,MAAM,eAAe,GAAI,MAAM,IAAI,EAAE,cAAc,MAAM,KAAG,MAmBlE,CAAA;AAQD,eAAO,MAAM,eAAe,KAG1B,CAAA;AAEF,eAAO,MAAM,WAAW,GAAU,UAAU,MAAM;;;EAIjD,CAAA;AA2CD,eAAO,MAAM,SAAS,GACpB,SAAS,OAAO,CAAC,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,EACrD,MAAM,IAAI,EACV,YAAY,MAAM,KACjB,OAAO,CAAC,SAAS,CA+DnB,CAAA;AAID,eAAO,MAAM,EAAE,mBAAiC,CAAA;AAEhD,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,GAAG,IAAI,KAAG,MAQhD,CAAA;AAED,eAAO,MAAM,WAAW,0CAAiB,CAAA;AACzC,eAAO,MAAM,OAAO,0CAAkB,CAAA;AAEtC,uEAAuE;AACvE,eAAO,MAAM,OAAO,GAAI,GAAG,OAAO,KAAG,MAAM,GAAG,IAC4C,CAAA;AAE1F,eAAO,MAAM,OAAO,GAAI,GAAG,OAAO,KAAG,MAAM,GAAG,IAC4C,CAAA;AAE1F,eAAO,MAAM,QAAQ,GAAI,GAAG,OAAO,KAAG,MAAM,GAAG,IAC8C,CAAA;AAE7F,eAAO,MAAM,KAAK,GAAI,GAAG,OAAO,KAAG,MAAM,GAAG,IAO3C,CAAA"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { headers as nextHeaders } from 'next/headers';
|
|
2
|
+
import { redirect } from 'next/navigation';
|
|
3
|
+
import { cache } from 'react';
|
|
4
|
+
import { unstable_cache } from 'next/cache';
|
|
5
|
+
import { getPayloadClient } from './tenant';
|
|
6
|
+
import { attentionWhere } from './publishing';
|
|
7
|
+
import { assignmentFor, hasTenantRole, isAnalyst, isPlatformAdmin } from './access';
|
|
8
|
+
import { formatDateTime, formatShortDate } from './format';
|
|
9
|
+
import { mediaUrl } from './seo';
|
|
10
|
+
const formatRole = (role) => role
|
|
11
|
+
.split('-')
|
|
12
|
+
.map((w) => w[0].toUpperCase() + w.slice(1))
|
|
13
|
+
.join(' ');
|
|
14
|
+
export const displayUserRole = (user, activeBrand) => {
|
|
15
|
+
if (isPlatformAdmin(user))
|
|
16
|
+
return 'Platform admin';
|
|
17
|
+
if (isAnalyst(user))
|
|
18
|
+
return 'Analyst';
|
|
19
|
+
if (activeBrand) {
|
|
20
|
+
const assignment = assignmentFor(user, String(activeBrand.id));
|
|
21
|
+
if (assignment?.role)
|
|
22
|
+
return formatRole(assignment.role);
|
|
23
|
+
}
|
|
24
|
+
if (user.globalRole && user.globalRole !== 'none')
|
|
25
|
+
return formatRole(user.globalRole);
|
|
26
|
+
const ranks = { contributor: 1, author: 2, editor: 3, 'brand-admin': 4 };
|
|
27
|
+
const roles = (user.tenantRoles ?? []).map((row) => row.role).filter(Boolean);
|
|
28
|
+
if (roles.length) {
|
|
29
|
+
const best = roles.sort((a, b) => (ranks[b] ?? 0) - (ranks[a] ?? 0))[0];
|
|
30
|
+
return formatRole(best);
|
|
31
|
+
}
|
|
32
|
+
return 'Member';
|
|
33
|
+
};
|
|
34
|
+
const authSession = cache(async () => {
|
|
35
|
+
const payload = await getPayloadClient();
|
|
36
|
+
const { user } = await payload.auth({ headers: await nextHeaders() });
|
|
37
|
+
return { payload, user: (user ?? null) };
|
|
38
|
+
});
|
|
39
|
+
export const getOptionalUser = cache(async () => {
|
|
40
|
+
const { user } = await authSession();
|
|
41
|
+
return user;
|
|
42
|
+
});
|
|
43
|
+
export const requireUser = async (returnTo) => {
|
|
44
|
+
const { payload, user } = await authSession();
|
|
45
|
+
if (!user)
|
|
46
|
+
redirect(`/cms/login?redirect=${encodeURIComponent(returnTo)}`);
|
|
47
|
+
return { payload, user };
|
|
48
|
+
};
|
|
49
|
+
const badgeCounts = async (payload, user, activeBrandId) => {
|
|
50
|
+
const scope = activeBrandId ? [{ tenant: { equals: activeBrandId } }] : [];
|
|
51
|
+
const nowIso = new Date().toISOString();
|
|
52
|
+
const count = async (where, trash = false) => (await payload.find({
|
|
53
|
+
collection: 'posts',
|
|
54
|
+
where: { and: [...scope, ...where] },
|
|
55
|
+
limit: 0,
|
|
56
|
+
depth: 0,
|
|
57
|
+
user,
|
|
58
|
+
overrideAccess: false,
|
|
59
|
+
trash,
|
|
60
|
+
})).totalDocs;
|
|
61
|
+
const [attentionCount, scheduledCount, trashCount] = await Promise.all([
|
|
62
|
+
count([attentionWhere()]),
|
|
63
|
+
count([{ _status: { equals: 'draft' } }, { scheduledFor: { greater_than: nowIso } }]),
|
|
64
|
+
count([{ deletedAt: { exists: true } }], true),
|
|
65
|
+
]);
|
|
66
|
+
return { attentionCount, scheduledCount, trashCount };
|
|
67
|
+
};
|
|
68
|
+
/** Badge counts change rarely — a short cache keeps sidebar hops snappy. */
|
|
69
|
+
const cachedBadgeCounts = (userId, brandId, payload, user) => unstable_cache(() => badgeCounts(payload, user, brandId), ['shell-badges', userId, brandId ?? 'all'], { revalidate: 20, tags: [`shell-badges:${userId}`] })();
|
|
70
|
+
export const loadShell = async (payload, user, brandSlug) => {
|
|
71
|
+
const tenantRes = await payload.find({
|
|
72
|
+
collection: 'tenants',
|
|
73
|
+
limit: 100,
|
|
74
|
+
depth: 0,
|
|
75
|
+
sort: 'name',
|
|
76
|
+
pagination: false,
|
|
77
|
+
user,
|
|
78
|
+
overrideAccess: false,
|
|
79
|
+
});
|
|
80
|
+
const tenants = tenantRes.docs;
|
|
81
|
+
const slug = brandSlug?.trim();
|
|
82
|
+
// Default / missing / `all` → All brands. Only an explicit ?brand=slug selects one.
|
|
83
|
+
const activeBrand = !slug || slug === 'all' ? undefined : tenants.find((t) => t.slug === slug);
|
|
84
|
+
const [{ attentionCount, scheduledCount, trashCount }, userAvatarUrl] = await Promise.all([
|
|
85
|
+
cachedBadgeCounts(String(user.id), activeBrand ? String(activeBrand.id) : undefined, payload, user),
|
|
86
|
+
(async () => {
|
|
87
|
+
const authUser = user;
|
|
88
|
+
const avatarRef = authUser.avatar;
|
|
89
|
+
if (avatarRef && typeof avatarRef === 'object') {
|
|
90
|
+
return mediaUrl(avatarRef, 'thumbnail');
|
|
91
|
+
}
|
|
92
|
+
if (typeof avatarRef === 'string' || typeof avatarRef === 'number') {
|
|
93
|
+
try {
|
|
94
|
+
const media = await payload.findByID({
|
|
95
|
+
collection: 'media',
|
|
96
|
+
id: avatarRef,
|
|
97
|
+
depth: 0,
|
|
98
|
+
user,
|
|
99
|
+
overrideAccess: false,
|
|
100
|
+
});
|
|
101
|
+
return mediaUrl(media, 'thumbnail');
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
})(),
|
|
109
|
+
]);
|
|
110
|
+
const canPublishHere = activeBrand
|
|
111
|
+
? isPlatformAdmin(user) || hasTenantRole(user, String(activeBrand.id), 'editor')
|
|
112
|
+
: isPlatformAdmin(user) || tenants.some((t) => hasTenantRole(user, String(t.id), 'editor'));
|
|
113
|
+
return {
|
|
114
|
+
tenants,
|
|
115
|
+
activeBrand,
|
|
116
|
+
attentionCount,
|
|
117
|
+
scheduledCount,
|
|
118
|
+
trashCount,
|
|
119
|
+
canPublishHere,
|
|
120
|
+
userName: user.name ?? user.email,
|
|
121
|
+
userRole: displayUserRole(user, activeBrand),
|
|
122
|
+
userAvatarUrl,
|
|
123
|
+
isAdmin: isPlatformAdmin(user),
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
/* ---------------- formatting, shared by every screen ---------------- */
|
|
127
|
+
export const nf = new Intl.NumberFormat('en-GB');
|
|
128
|
+
export const relative = (value) => {
|
|
129
|
+
if (!value)
|
|
130
|
+
return '—';
|
|
131
|
+
const days = Math.floor((Date.now() - new Date(value).getTime()) / 86400000);
|
|
132
|
+
if (days <= 0)
|
|
133
|
+
return 'today';
|
|
134
|
+
if (days === 1)
|
|
135
|
+
return 'yesterday';
|
|
136
|
+
if (days < 30)
|
|
137
|
+
return `${days}d ago`;
|
|
138
|
+
if (days < 365)
|
|
139
|
+
return `${Math.floor(days / 30)}mo ago`;
|
|
140
|
+
return `${Math.floor(days / 365)}y ago`;
|
|
141
|
+
};
|
|
142
|
+
export const fmtDateTime = formatDateTime;
|
|
143
|
+
export const fmtDate = formatShortDate;
|
|
144
|
+
/** Relationship values arrive populated or bare depending on depth. */
|
|
145
|
+
export const relName = (v) => v && typeof v === 'object' && 'name' in v ? String(v.name) : null;
|
|
146
|
+
export const relSlug = (v) => v && typeof v === 'object' && 'slug' in v ? String(v.slug) : null;
|
|
147
|
+
export const relTitle = (v) => v && typeof v === 'object' && 'title' in v ? String(v.title) : null;
|
|
148
|
+
export const relId = (v) => {
|
|
149
|
+
if (typeof v === 'string' || typeof v === 'number')
|
|
150
|
+
return String(v);
|
|
151
|
+
if (v && typeof v === 'object' && 'id' in v) {
|
|
152
|
+
const id = v.id;
|
|
153
|
+
if (typeof id === 'string' || typeof id === 'number')
|
|
154
|
+
return String(id);
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared serializers / parsers for Tools → Export / Import.
|
|
3
|
+
* Supported formats: json, xml, csv.
|
|
4
|
+
*/
|
|
5
|
+
export type TransferFormat = 'json' | 'xml' | 'csv';
|
|
6
|
+
export type TransferBundle = {
|
|
7
|
+
format: 'blog-portal-export';
|
|
8
|
+
version: number;
|
|
9
|
+
exportedAt?: string;
|
|
10
|
+
brand?: string | null;
|
|
11
|
+
brandName?: string;
|
|
12
|
+
type?: string;
|
|
13
|
+
counts?: Record<string, number>;
|
|
14
|
+
posts?: Record<string, unknown>[];
|
|
15
|
+
media?: Record<string, unknown>[];
|
|
16
|
+
comments?: Record<string, unknown>[];
|
|
17
|
+
};
|
|
18
|
+
export declare const serializeTransfer: (bundle: TransferBundle, format: TransferFormat) => string;
|
|
19
|
+
export declare const contentTypeFor: (format: TransferFormat) => string;
|
|
20
|
+
export declare const extensionFor: (format: TransferFormat) => string;
|
|
21
|
+
export declare const detectFormat: (filename: string, content: string) => TransferFormat;
|
|
22
|
+
export declare const parseTransfer: (content: string, format?: TransferFormat) => TransferBundle;
|
|
23
|
+
//# sourceMappingURL=data-transfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-transfer.d.ts","sourceRoot":"","sources":["../../app/lib/data-transfer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAA;AAEnD,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,oBAAoB,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;CACrC,CAAA;AAgGD,eAAO,MAAM,iBAAiB,GAAI,QAAQ,cAAc,EAAE,QAAQ,cAAc,KAAG,MAqFlF,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,QAAQ,cAAc,KAAG,MAIvD,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,QAAQ,cAAc,KAAG,MAAgB,CAAA;AA+MtE,eAAO,MAAM,YAAY,GAAI,UAAU,MAAM,EAAE,SAAS,MAAM,KAAG,cAShE,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,EAAE,SAAS,cAAc,KAAG,cA6BxE,CAAA"}
|