@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,91 @@
|
|
|
1
|
+
import { revalidatePath, revalidateTag } from 'next/cache';
|
|
2
|
+
/**
|
|
3
|
+
* Cache tags.
|
|
4
|
+
*
|
|
5
|
+
* Publishing invalidates a small, explicit set of tags rather than the whole
|
|
6
|
+
* site — the post itself, the indexes it appears in, and the sitemap. Everything
|
|
7
|
+
* else stays warm at the edge, which is what keeps a publish from causing a
|
|
8
|
+
* traffic spike against the origin.
|
|
9
|
+
*/
|
|
10
|
+
export const tags = {
|
|
11
|
+
tenant: (tenantSlug) => `tenant:${tenantSlug}`,
|
|
12
|
+
post: (tenantSlug, postSlug) => `post:${tenantSlug}:${postSlug}`,
|
|
13
|
+
postIndex: (tenantSlug) => `post-index:${tenantSlug}`,
|
|
14
|
+
category: (tenantSlug, categorySlug) => `category:${tenantSlug}:${categorySlug}`,
|
|
15
|
+
sitemap: (tenantSlug) => `sitemap:${tenantSlug}`,
|
|
16
|
+
redirects: (tenantSlug) => `redirects:${tenantSlug}`,
|
|
17
|
+
};
|
|
18
|
+
/** Tags touched when a single post changes state. */
|
|
19
|
+
export const tagsForPost = (args) => {
|
|
20
|
+
const { tenantSlug, postSlug, categorySlugs = [] } = args;
|
|
21
|
+
return [
|
|
22
|
+
tags.post(tenantSlug, postSlug),
|
|
23
|
+
tags.postIndex(tenantSlug),
|
|
24
|
+
tags.sitemap(tenantSlug),
|
|
25
|
+
...categorySlugs.map((c) => tags.category(tenantSlug, c)),
|
|
26
|
+
];
|
|
27
|
+
};
|
|
28
|
+
export const revalidateTags = (list) => {
|
|
29
|
+
for (const tag of new Set(list)) {
|
|
30
|
+
try {
|
|
31
|
+
revalidateTag(tag);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// revalidateTag throws outside a request/render scope (e.g. during seed).
|
|
35
|
+
// A miss here is a stale cache entry, never a data problem, so it is safe
|
|
36
|
+
// to swallow — but we surface it in development.
|
|
37
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
38
|
+
console.warn(`[revalidate] could not invalidate "${tag}" outside request scope`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const revalidateSitePaths = () => {
|
|
44
|
+
for (const path of ['/', '/blog']) {
|
|
45
|
+
try {
|
|
46
|
+
revalidatePath(path, 'layout');
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
50
|
+
console.warn(`[revalidate] could not invalidate path "${path}" outside request scope`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
/** When CMS and renderer are separate deployments, bust the public cache too. */
|
|
56
|
+
const notifyRenderer = async (args) => {
|
|
57
|
+
const secret = process.env.REVALIDATE_SECRET;
|
|
58
|
+
const renderer = process.env.RENDERER_ORIGIN?.trim().replace(/\/$/, '');
|
|
59
|
+
const self = process.env.NEXT_PUBLIC_SERVER_URL?.trim().replace(/\/$/, '');
|
|
60
|
+
if (!secret || !renderer || (self && renderer === self))
|
|
61
|
+
return;
|
|
62
|
+
try {
|
|
63
|
+
await fetch(`${renderer}/api/revalidate`, {
|
|
64
|
+
method: 'POST',
|
|
65
|
+
headers: {
|
|
66
|
+
Authorization: `Bearer ${secret}`,
|
|
67
|
+
'Content-Type': 'application/json',
|
|
68
|
+
},
|
|
69
|
+
body: JSON.stringify(args),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
74
|
+
console.warn('[revalidate] could not reach renderer origin');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
/** Invalidate every public cache entry a post publish/update touches. */
|
|
79
|
+
export const purgePublicCaches = async (args) => {
|
|
80
|
+
const tagList = args.postSlug
|
|
81
|
+
? tagsForPost({
|
|
82
|
+
tenantSlug: args.tenantSlug,
|
|
83
|
+
postSlug: args.postSlug,
|
|
84
|
+
categorySlugs: args.categorySlugs,
|
|
85
|
+
})
|
|
86
|
+
: [tags.postIndex(args.tenantSlug), tags.tenant(args.tenantSlug), tags.sitemap(args.tenantSlug)];
|
|
87
|
+
// Shared-host "all brands" index uses these tags too.
|
|
88
|
+
revalidateTags([...tagList, tags.postIndex('all'), 'tenant:all']);
|
|
89
|
+
revalidateSitePaths();
|
|
90
|
+
await notifyRenderer(args);
|
|
91
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Tenant } from '../payload-types';
|
|
2
|
+
export declare const DEFAULT_ROBOTS_ALLOW: string[];
|
|
3
|
+
export declare const DEFAULT_ROBOTS_DISALLOW: string[];
|
|
4
|
+
export declare const pathsFromRows: (rows: {
|
|
5
|
+
path?: string | null;
|
|
6
|
+
}[] | null | undefined, fallback: string[]) => string[];
|
|
7
|
+
export type RobotsConfig = {
|
|
8
|
+
allowPaths: string[];
|
|
9
|
+
disallowPaths: string[];
|
|
10
|
+
includeSitemap: boolean;
|
|
11
|
+
extraRules: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const resolveRobotsConfig: (tenant?: Pick<Tenant, "robots"> | null) => RobotsConfig;
|
|
14
|
+
/** Build the production robots.txt body for a brand. */
|
|
15
|
+
export declare const buildRobotsTxt: (args: {
|
|
16
|
+
config: RobotsConfig;
|
|
17
|
+
sitemapUrl?: string | null;
|
|
18
|
+
}) => string;
|
|
19
|
+
//# sourceMappingURL=robots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"robots.d.ts","sourceRoot":"","sources":["../../app/lib/robots.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAE9C,eAAO,MAAM,oBAAoB,UAAY,CAAA;AAC7C,eAAO,MAAM,uBAAuB,UAA8B,CAAA;AAQlE,eAAO,MAAM,aAAa,GACxB,MAAM;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,GAAG,IAAI,GAAG,SAAS,EACnD,UAAU,MAAM,EAAE,KACjB,MAAM,EAKR,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,cAAc,EAAE,OAAO,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,SAAS,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,KACrC,YAKD,CAAA;AAEF,wDAAwD;AACxD,eAAO,MAAM,cAAc,GAAI,MAAM;IACnC,MAAM,EAAE,YAAY,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B,KAAG,MAkBH,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export const DEFAULT_ROBOTS_ALLOW = ['/blog'];
|
|
2
|
+
export const DEFAULT_ROBOTS_DISALLOW = ['/admin', '/cms', '/api/'];
|
|
3
|
+
const normaliseRobotPath = (raw) => {
|
|
4
|
+
const trimmed = raw.trim();
|
|
5
|
+
if (!trimmed)
|
|
6
|
+
return '';
|
|
7
|
+
return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
|
|
8
|
+
};
|
|
9
|
+
export const pathsFromRows = (rows, fallback) => {
|
|
10
|
+
const parsed = (rows ?? [])
|
|
11
|
+
.map((r) => normaliseRobotPath(String(r?.path ?? '')))
|
|
12
|
+
.filter(Boolean);
|
|
13
|
+
return parsed.length ? [...new Set(parsed)] : fallback;
|
|
14
|
+
};
|
|
15
|
+
export const resolveRobotsConfig = (tenant) => ({
|
|
16
|
+
allowPaths: pathsFromRows(tenant?.robots?.allowPaths, DEFAULT_ROBOTS_ALLOW),
|
|
17
|
+
disallowPaths: pathsFromRows(tenant?.robots?.disallowPaths, DEFAULT_ROBOTS_DISALLOW),
|
|
18
|
+
includeSitemap: tenant?.robots?.includeSitemap !== false,
|
|
19
|
+
extraRules: (tenant?.robots?.extraRules ?? '').trim(),
|
|
20
|
+
});
|
|
21
|
+
/** Build the production robots.txt body for a brand. */
|
|
22
|
+
export const buildRobotsTxt = (args) => {
|
|
23
|
+
const lines = ['User-agent: *'];
|
|
24
|
+
for (const path of args.config.allowPaths)
|
|
25
|
+
lines.push(`Allow: ${path}`);
|
|
26
|
+
for (const path of args.config.disallowPaths)
|
|
27
|
+
lines.push(`Disallow: ${path}`);
|
|
28
|
+
if (args.config.extraRules) {
|
|
29
|
+
lines.push('');
|
|
30
|
+
lines.push(...args.config.extraRules.split(/\r?\n/).map((l) => l.trimEnd()).filter(Boolean));
|
|
31
|
+
}
|
|
32
|
+
if (args.config.includeSitemap && args.sitemapUrl) {
|
|
33
|
+
lines.push('');
|
|
34
|
+
lines.push(`Sitemap: ${args.sitemapUrl}`);
|
|
35
|
+
}
|
|
36
|
+
lines.push('');
|
|
37
|
+
return lines.join('\n');
|
|
38
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight Yoast-style SEO + readability checks for the post editor.
|
|
3
|
+
* Runs fully client-side from the draft the editor already holds.
|
|
4
|
+
*/
|
|
5
|
+
export type CheckTone = 'good' | 'ok' | 'bad';
|
|
6
|
+
export type AnalysisCheck = {
|
|
7
|
+
id: string;
|
|
8
|
+
label: string;
|
|
9
|
+
detail: string;
|
|
10
|
+
tone: CheckTone;
|
|
11
|
+
};
|
|
12
|
+
export type SeoAnalysisInput = {
|
|
13
|
+
title: string;
|
|
14
|
+
slug: string;
|
|
15
|
+
excerpt: string;
|
|
16
|
+
metaTitle: string;
|
|
17
|
+
metaDescription: string;
|
|
18
|
+
focusKeyphrase: string;
|
|
19
|
+
contentText: string;
|
|
20
|
+
contentHtml: string;
|
|
21
|
+
hasFeaturedImage: boolean;
|
|
22
|
+
featuredAlt: string;
|
|
23
|
+
};
|
|
24
|
+
export declare const analyseSeo: (input: SeoAnalysisInput) => AnalysisCheck[];
|
|
25
|
+
export declare const analyseReadability: (input: Pick<SeoAnalysisInput, "contentText" | "contentHtml">) => AnalysisCheck[];
|
|
26
|
+
export declare const summariseTone: (checks: AnalysisCheck[]) => CheckTone;
|
|
27
|
+
export declare const toneLabel: (tone: CheckTone) => string;
|
|
28
|
+
//# sourceMappingURL=seo-analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-analysis.d.ts","sourceRoot":"","sources":["../../app/lib/seo-analysis.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,CAAA;AAE7C,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,SAAS,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,OAAO,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAiCD,eAAO,MAAM,UAAU,GAAI,OAAO,gBAAgB,KAAG,aAAa,EA+JjE,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,OAAO,IAAI,CAAC,gBAAgB,EAAE,aAAa,GAAG,aAAa,CAAC,KAAG,aAAa,EA2E9G,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,QAAQ,aAAa,EAAE,KAAG,SAIvD,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,MAAM,SAAS,KAAG,MACoB,CAAA"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight Yoast-style SEO + readability checks for the post editor.
|
|
3
|
+
* Runs fully client-side from the draft the editor already holds.
|
|
4
|
+
*/
|
|
5
|
+
const wordsOf = (text) => text
|
|
6
|
+
.toLowerCase()
|
|
7
|
+
.replace(/[^a-z0-9\s'-]/g, ' ')
|
|
8
|
+
.split(/\s+/)
|
|
9
|
+
.filter(Boolean);
|
|
10
|
+
const sentencesOf = (text) => text
|
|
11
|
+
.split(/[.!?]+/)
|
|
12
|
+
.map((s) => s.trim())
|
|
13
|
+
.filter((s) => s.length > 0);
|
|
14
|
+
const countKeyphrase = (haystack, phrase) => {
|
|
15
|
+
if (!phrase.trim())
|
|
16
|
+
return 0;
|
|
17
|
+
const h = haystack.toLowerCase();
|
|
18
|
+
const p = phrase.toLowerCase().trim();
|
|
19
|
+
let n = 0;
|
|
20
|
+
let i = 0;
|
|
21
|
+
while ((i = h.indexOf(p, i)) !== -1) {
|
|
22
|
+
n += 1;
|
|
23
|
+
i += p.length;
|
|
24
|
+
}
|
|
25
|
+
return n;
|
|
26
|
+
};
|
|
27
|
+
const TRANSITIONS = /\b(however|therefore|moreover|furthermore|additionally|meanwhile|consequently|instead|similarly|likewise|for example|for instance|in addition|on the other hand|as a result|in conclusion|finally|next|then|also|because|although|while|whereas)\b/gi;
|
|
28
|
+
const PASSIVE = /\b(is|are|was|were|be|been|being)\s+\w+ed\b/gi;
|
|
29
|
+
export const analyseSeo = (input) => {
|
|
30
|
+
const phrase = input.focusKeyphrase.trim();
|
|
31
|
+
const seoTitle = (input.metaTitle || input.title).trim();
|
|
32
|
+
const meta = (input.metaDescription || input.excerpt).trim();
|
|
33
|
+
const body = input.contentText.trim();
|
|
34
|
+
const words = wordsOf(body);
|
|
35
|
+
const intro = body.slice(0, 300);
|
|
36
|
+
const slug = input.slug.toLowerCase();
|
|
37
|
+
const checks = [];
|
|
38
|
+
const push = (id, label, detail, tone) => checks.push({ id, label, detail, tone });
|
|
39
|
+
if (!phrase) {
|
|
40
|
+
push('keyphrase', 'Focus keyphrase', 'No focus keyphrase was set for this page.', 'bad');
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const inTitle = seoTitle.toLowerCase().includes(phrase.toLowerCase());
|
|
44
|
+
push('keyphrase-title', 'Keyphrase in SEO title', inTitle ? 'The focus keyphrase appears in the SEO title.' : 'Include the focus keyphrase in the SEO title.', inTitle ? 'good' : 'bad');
|
|
45
|
+
const inMeta = meta.toLowerCase().includes(phrase.toLowerCase());
|
|
46
|
+
push('keyphrase-meta', 'Keyphrase in meta description', inMeta ? 'Keyphrase appears in the meta description.' : 'Add the keyphrase to the meta description.', inMeta ? 'good' : 'bad');
|
|
47
|
+
const inSlug = slug.includes(phrase.toLowerCase().replace(/\s+/g, '-'));
|
|
48
|
+
push('keyphrase-slug', 'Keyphrase in slug', inSlug ? 'Great work — the slug reflects the keyphrase.' : 'Include the keyphrase in the permalink slug.', inSlug ? 'good' : 'ok');
|
|
49
|
+
const inIntro = intro.toLowerCase().includes(phrase.toLowerCase());
|
|
50
|
+
push('keyphrase-intro', 'Keyphrase in introduction', inIntro
|
|
51
|
+
? 'The keyphrase appears early in the content.'
|
|
52
|
+
: 'Use the focus keyphrase (or a close synonym) in the first paragraph.', inIntro ? 'good' : 'bad');
|
|
53
|
+
const density = words.length ? (countKeyphrase(body, phrase) / words.length) * 100 : 0;
|
|
54
|
+
const densityOk = density >= 0.5 && density <= 3;
|
|
55
|
+
push('keyphrase-density', 'Keyphrase density', words.length
|
|
56
|
+
? `Found about ${density.toFixed(1)}% density across ${words.length} words.`
|
|
57
|
+
: 'Write some body content to measure keyphrase density.', !words.length ? 'ok' : densityOk ? 'good' : 'ok');
|
|
58
|
+
const phraseWords = phrase.split(/\s+/).filter(Boolean).length;
|
|
59
|
+
push('keyphrase-length', 'Keyphrase length', phraseWords > 4
|
|
60
|
+
? 'Your keyphrase is longer than the recommended maximum length.'
|
|
61
|
+
: phraseWords < 2
|
|
62
|
+
? 'Your keyphrase is very short. Consider using a longer phrase.'
|
|
63
|
+
: 'Your keyphrase has a good length.', phraseWords > 4 ? 'bad' : phraseWords < 2 ? 'ok' : 'good');
|
|
64
|
+
}
|
|
65
|
+
const titleLen = seoTitle.length;
|
|
66
|
+
push('seo-title-length', 'SEO title width', titleLen === 0
|
|
67
|
+
? 'Add an SEO title (or a post title).'
|
|
68
|
+
: titleLen < 30
|
|
69
|
+
? `Title is short (${titleLen} chars). Aim for 30–60.`
|
|
70
|
+
: titleLen > 60
|
|
71
|
+
? `Title may truncate in Google (${titleLen} chars). Aim for ≤60.`
|
|
72
|
+
: `Title length looks good (${titleLen} characters).`, titleLen === 0 ? 'bad' : titleLen < 30 || titleLen > 60 ? 'ok' : 'good');
|
|
73
|
+
const metaLen = meta.length;
|
|
74
|
+
push('meta-length', 'Meta description length', metaLen === 0
|
|
75
|
+
? 'Add a meta description (or an excerpt).'
|
|
76
|
+
: metaLen < 120
|
|
77
|
+
? `Description is short (${metaLen} chars). Aim for 120–156.`
|
|
78
|
+
: metaLen > 156
|
|
79
|
+
? `Description is over 156 characters (${metaLen}). Shorten it for full SERP visibility.`
|
|
80
|
+
: `Description length looks good (${metaLen} characters).`, metaLen === 0 ? 'bad' : metaLen < 120 || metaLen > 156 ? 'ok' : 'good');
|
|
81
|
+
const hasImg = input.hasFeaturedImage || /<img[\s>]/i.test(input.contentHtml);
|
|
82
|
+
push('images', 'Images', hasImg ? 'At least one image is present.' : 'Add a featured image or inline images.', hasImg ? 'good' : 'bad');
|
|
83
|
+
if (phrase && input.hasFeaturedImage) {
|
|
84
|
+
const altHas = input.featuredAlt.toLowerCase().includes(phrase.toLowerCase());
|
|
85
|
+
push('alt-keyphrase', 'Keyphrase in image alt attributes', altHas
|
|
86
|
+
? 'Featured image alt includes the keyphrase.'
|
|
87
|
+
: 'Include the focus keyphrase in the featured image alt text.', altHas ? 'good' : 'ok');
|
|
88
|
+
}
|
|
89
|
+
const h2count = (input.contentHtml.match(/<h[23]\b/gi) || []).length;
|
|
90
|
+
push('subheadings', 'Keyphrase in subheading', h2count > 0
|
|
91
|
+
? `Found ${h2count} H2/H3 subheading(s).`
|
|
92
|
+
: 'Add H2/H3 subheadings to structure the article.', h2count > 0 ? 'good' : 'ok');
|
|
93
|
+
push('text-length', 'Text length', words.length === 0
|
|
94
|
+
? 'No body text yet.'
|
|
95
|
+
: words.length < 300
|
|
96
|
+
? `Only ${words.length} words — aim for at least 300 for a solid article.`
|
|
97
|
+
: `The text contains ${words.length} words.`, words.length === 0 ? 'bad' : words.length < 300 ? 'ok' : 'good');
|
|
98
|
+
const internal = (input.contentHtml.match(/data-link-type="internal"|href="\/blog/gi) || []).length;
|
|
99
|
+
const outbound = (input.contentHtml.match(/href="https?:\/\//gi) || []).length;
|
|
100
|
+
push('internal-links', 'Internal links', internal > 0 ? `Found ${internal} internal link(s).` : 'Add internal links to related posts or categories.', internal > 0 ? 'good' : 'ok');
|
|
101
|
+
push('outbound-links', 'Outbound links', outbound > 0 ? `Found ${outbound} outbound link(s).` : 'Consider adding a relevant outbound link.', outbound > 0 ? 'good' : 'ok');
|
|
102
|
+
return checks;
|
|
103
|
+
};
|
|
104
|
+
export const analyseReadability = (input) => {
|
|
105
|
+
const body = input.contentText.trim();
|
|
106
|
+
const sentences = sentencesOf(body);
|
|
107
|
+
const words = wordsOf(body);
|
|
108
|
+
const checks = [];
|
|
109
|
+
const push = (id, label, detail, tone) => checks.push({ id, label, detail, tone });
|
|
110
|
+
if (!sentences.length) {
|
|
111
|
+
push('empty', 'Readability', 'Write some content to analyse readability.', 'ok');
|
|
112
|
+
return checks;
|
|
113
|
+
}
|
|
114
|
+
const longSentences = sentences.filter((s) => wordsOf(s).length > 20).length;
|
|
115
|
+
const longPct = (longSentences / sentences.length) * 100;
|
|
116
|
+
push('sentence-length', 'Sentence length', longPct <= 25
|
|
117
|
+
? 'Great — most sentences are a comfortable length.'
|
|
118
|
+
: `${Math.round(longPct)}% of sentences are over 20 words. Shorten some of them.`, longPct <= 25 ? 'good' : 'bad');
|
|
119
|
+
const passiveHits = (body.match(PASSIVE) || []).length;
|
|
120
|
+
const passivePct = sentences.length ? (passiveHits / sentences.length) * 100 : 0;
|
|
121
|
+
push('passive-voice', 'Passive voice', passivePct <= 10
|
|
122
|
+
? "You are not using too much passive voice. That's great!"
|
|
123
|
+
: `${Math.round(passivePct)}% of sentences look passive. Prefer active voice.`, passivePct <= 10 ? 'good' : 'ok');
|
|
124
|
+
const withTransition = sentences.filter((s) => TRANSITIONS.test(s)).length;
|
|
125
|
+
TRANSITIONS.lastIndex = 0;
|
|
126
|
+
const transitionPct = (withTransition / sentences.length) * 100;
|
|
127
|
+
push('transition-words', 'Transition words', transitionPct >= 30
|
|
128
|
+
? 'Enough sentences use transition words.'
|
|
129
|
+
: `Only ${Math.round(transitionPct)}% of sentences contain transition words, which is not enough. Use more of them.`, transitionPct >= 30 ? 'good' : 'bad');
|
|
130
|
+
const paras = input.contentHtml
|
|
131
|
+
.split(/<\/p>/i)
|
|
132
|
+
.map((p) => p.replace(/<[^>]+>/g, ' ').trim())
|
|
133
|
+
.filter(Boolean);
|
|
134
|
+
const longParas = paras.filter((p) => wordsOf(p).length > 150).length;
|
|
135
|
+
push('paragraph-length', 'Paragraph length', longParas === 0
|
|
136
|
+
? 'There are no paragraphs that are too long. Great job!'
|
|
137
|
+
: `${longParas} paragraph(s) are very long. Break them up.`, longParas === 0 ? 'good' : 'ok');
|
|
138
|
+
const headings = (input.contentHtml.match(/<h[2-4]\b/gi) || []).length;
|
|
139
|
+
push('subheading-distribution', 'Subheading distribution', words.length < 300
|
|
140
|
+
? 'Short posts need fewer subheadings.'
|
|
141
|
+
: headings > 0
|
|
142
|
+
? 'Great job!'
|
|
143
|
+
: 'Add subheadings to break up longer sections.', words.length < 300 || headings > 0 ? 'good' : 'ok');
|
|
144
|
+
return checks;
|
|
145
|
+
};
|
|
146
|
+
export const summariseTone = (checks) => {
|
|
147
|
+
if (checks.some((c) => c.tone === 'bad'))
|
|
148
|
+
return 'bad';
|
|
149
|
+
if (checks.some((c) => c.tone === 'ok'))
|
|
150
|
+
return 'ok';
|
|
151
|
+
return 'good';
|
|
152
|
+
};
|
|
153
|
+
export const toneLabel = (tone) => tone === 'good' ? 'Good' : tone === 'ok' ? 'OK' : 'Needs work';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Payload field caps for the shared SEO group — keep the editor in sync with these. */
|
|
2
|
+
export declare const SEO_FIELD_LIMITS: {
|
|
3
|
+
readonly metaTitle: 70;
|
|
4
|
+
readonly metaDescription: 180;
|
|
5
|
+
readonly ogTitle: 70;
|
|
6
|
+
readonly ogDescription: 200;
|
|
7
|
+
};
|
|
8
|
+
export type SeoLengthInput = {
|
|
9
|
+
metaTitle?: string | null;
|
|
10
|
+
metaDescription?: string | null;
|
|
11
|
+
ogTitle?: string | null;
|
|
12
|
+
ogDescription?: string | null;
|
|
13
|
+
};
|
|
14
|
+
export type SeoFieldError = {
|
|
15
|
+
field: string;
|
|
16
|
+
message: string;
|
|
17
|
+
};
|
|
18
|
+
export declare const seoFieldLengthErrors: (seo: SeoLengthInput | null | undefined) => SeoFieldError[];
|
|
19
|
+
//# sourceMappingURL=seo-limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-limits.d.ts","sourceRoot":"","sources":["../../app/lib/seo-limits.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,eAAO,MAAM,gBAAgB;;;;;CAKnB,CAAA;AAEV,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAE9D,eAAO,MAAM,oBAAoB,GAAI,KAAK,cAAc,GAAG,IAAI,GAAG,SAAS,KAAG,aAAa,EAiC1F,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Payload field caps for the shared SEO group — keep the editor in sync with these. */
|
|
2
|
+
export const SEO_FIELD_LIMITS = {
|
|
3
|
+
metaTitle: 70,
|
|
4
|
+
metaDescription: 180,
|
|
5
|
+
ogTitle: 70,
|
|
6
|
+
ogDescription: 200,
|
|
7
|
+
};
|
|
8
|
+
export const seoFieldLengthErrors = (seo) => {
|
|
9
|
+
const errors = [];
|
|
10
|
+
const metaTitle = (seo?.metaTitle ?? '').trim();
|
|
11
|
+
const metaDescription = (seo?.metaDescription ?? '').trim();
|
|
12
|
+
const ogTitle = (seo?.ogTitle ?? '').trim();
|
|
13
|
+
const ogDescription = (seo?.ogDescription ?? '').trim();
|
|
14
|
+
if (metaTitle.length > SEO_FIELD_LIMITS.metaTitle) {
|
|
15
|
+
errors.push({
|
|
16
|
+
field: 'seo.metaTitle',
|
|
17
|
+
message: `SEO title must be ${SEO_FIELD_LIMITS.metaTitle} characters or fewer (currently ${metaTitle.length}).`,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
if (metaDescription.length > SEO_FIELD_LIMITS.metaDescription) {
|
|
21
|
+
errors.push({
|
|
22
|
+
field: 'seo.metaDescription',
|
|
23
|
+
message: `Meta description must be ${SEO_FIELD_LIMITS.metaDescription} characters or fewer (currently ${metaDescription.length}).`,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
if (ogTitle.length > SEO_FIELD_LIMITS.ogTitle) {
|
|
27
|
+
errors.push({
|
|
28
|
+
field: 'seo.ogTitle',
|
|
29
|
+
message: `Social title must be ${SEO_FIELD_LIMITS.ogTitle} characters or fewer (currently ${ogTitle.length}).`,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if (ogDescription.length > SEO_FIELD_LIMITS.ogDescription) {
|
|
33
|
+
errors.push({
|
|
34
|
+
field: 'seo.ogDescription',
|
|
35
|
+
message: `Social description must be ${SEO_FIELD_LIMITS.ogDescription} characters or fewer (currently ${ogDescription.length}).`,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return errors;
|
|
39
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Metadata } from 'next';
|
|
2
|
+
import type { Media, Post, Tenant } from '../payload-types';
|
|
3
|
+
/**
|
|
4
|
+
* The SEO layer.
|
|
5
|
+
*
|
|
6
|
+
* Canonicals and structured data are *generated* from stored fields, never
|
|
7
|
+
* authored. An editor cannot produce a canonical that disagrees with the page it
|
|
8
|
+
* sits on, and JSON-LD cannot drift from the content it describes, because
|
|
9
|
+
* neither is a field anyone can type into.
|
|
10
|
+
*/
|
|
11
|
+
type Rel<T> = T | string | number | null | undefined;
|
|
12
|
+
export declare const mediaUrl: (m: Rel<Media>, size?: "thumbnail" | "card" | "hero" | "og") => string | null;
|
|
13
|
+
export declare const mediaDimensions: (m: Rel<Media>, size?: "thumbnail" | "card" | "hero" | "og") => {
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
} | null;
|
|
17
|
+
export declare const postMetadata: (args: {
|
|
18
|
+
tenant: Tenant;
|
|
19
|
+
post: Post;
|
|
20
|
+
origin: string;
|
|
21
|
+
path?: string;
|
|
22
|
+
}) => Metadata;
|
|
23
|
+
export declare const listingMetadata: (args: {
|
|
24
|
+
tenant: Tenant;
|
|
25
|
+
origin: string;
|
|
26
|
+
title: string;
|
|
27
|
+
description?: string | null;
|
|
28
|
+
path: string;
|
|
29
|
+
noindex?: boolean;
|
|
30
|
+
page?: number;
|
|
31
|
+
}) => Metadata;
|
|
32
|
+
/**
|
|
33
|
+
* A single @graph containing Article, BreadcrumbList, Person and Organization.
|
|
34
|
+
* One script tag, cross-referenced by @id, is what Google prefers over several
|
|
35
|
+
* disconnected blocks.
|
|
36
|
+
*/
|
|
37
|
+
export declare const articleJsonLd: (args: {
|
|
38
|
+
tenant: Tenant;
|
|
39
|
+
post: Post;
|
|
40
|
+
origin: string;
|
|
41
|
+
}) => Record<string, unknown>;
|
|
42
|
+
export declare const blogJsonLd: (args: {
|
|
43
|
+
tenant: Tenant;
|
|
44
|
+
origin: string;
|
|
45
|
+
posts: Post[];
|
|
46
|
+
}) => Record<string, unknown>;
|
|
47
|
+
/** JSON-LD is serialised with `<` escaped so it can never break out of the script tag. */
|
|
48
|
+
export declare const jsonLdScript: (data: Record<string, unknown>) => string;
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=seo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../app/lib/seo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,KAAK,EAAoB,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAM7E;;;;;;;GAOG;AAEH,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;AAIpD,eAAO,MAAM,QAAQ,GACnB,GAAG,GAAG,CAAC,KAAK,CAAC,EACb,OAAO,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,KAC1C,MAAM,GAAG,IAOX,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,GAAG,GAAG,CAAC,KAAK,CAAC,EACb,OAAO,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,KAC1C;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAQtC,CAAA;AAkCD,eAAO,MAAM,YAAY,GAAI,MAAM;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,KAAG,QAmDH,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,MAAM;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,KAAG,QAkBH,CAAA;AAiCD;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;CACf,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CA6DzB,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,MAAM;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,IAAI,EAAE,CAAA;CACd,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAsBzB,CAAA;AAED,0FAA0F;AAC1F,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MACd,CAAA"}
|