refactor(blog): theme-common shouldn't depend on blog content plugins (#10313)

This commit is contained in:
Sébastien Lorber 2024-07-19 15:55:35 +02:00 committed by GitHub
parent 7544a2373d
commit 61d6858864
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
29 changed files with 111 additions and 76 deletions

52
.eslintrc.js vendored
View file

@ -9,16 +9,18 @@ const OFF = 0;
const WARNING = 1; const WARNING = 1;
const ERROR = 2; const ERROR = 2;
const ClientRestrictedImportPatterns = [ // Prevent importing lodash, usually for browser bundle size reasons
// Prevent importing lodash in client bundle for bundle size const LodashImportPatterns = ['lodash', 'lodash.**', 'lodash/**'];
'lodash',
'lodash.**', // Prevent importing content plugins, usually for coupling reasons
'lodash/**', const ContentPluginsImportPatterns = [
// Prevent importing server code in client bundle '@docusaurus/plugin-content-blog',
'**/../babel/**', '@docusaurus/plugin-content-blog/**',
'**/../server/**', // TODO fix theme-common => docs dependency issue
'**/../commands/**', // '@docusaurus/plugin-content-docs',
'**/../webpack/**', // '@docusaurus/plugin-content-docs/**',
'@docusaurus/plugin-content-pages',
'@docusaurus/plugin-content-pages/**',
]; ];
module.exports = { module.exports = {
@ -408,7 +410,33 @@ module.exports = {
'no-restricted-imports': [ 'no-restricted-imports': [
'error', 'error',
{ {
patterns: ClientRestrictedImportPatterns, patterns: [
...LodashImportPatterns,
...ContentPluginsImportPatterns,
// Prevent importing server code in client bundle
'**/../babel/**',
'**/../server/**',
'**/../commands/**',
'**/../webpack/**',
],
},
],
},
},
{
files: [
'packages/docusaurus-theme-common/src/**/*.{js,ts,tsx}',
'packages/docusaurus-utils-common/src/**/*.{js,ts,tsx}',
],
excludedFiles: '*.test.{js,ts,tsx}',
rules: {
'no-restricted-imports': [
'error',
{
patterns: [
...LodashImportPatterns,
...ContentPluginsImportPatterns,
],
}, },
], ],
}, },
@ -420,7 +448,7 @@ module.exports = {
'no-restricted-imports': [ 'no-restricted-imports': [
'error', 'error',
{ {
patterns: ClientRestrictedImportPatterns.concat( patterns: LodashImportPatterns.concat(
// Prevents relative imports between React theme components // Prevents relative imports between React theme components
[ [
'../**', '../**',

View file

@ -34,6 +34,7 @@
"@docusaurus/core": "3.4.0", "@docusaurus/core": "3.4.0",
"@docusaurus/logger": "3.4.0", "@docusaurus/logger": "3.4.0",
"@docusaurus/mdx-loader": "3.4.0", "@docusaurus/mdx-loader": "3.4.0",
"@docusaurus/theme-common": "3.4.0",
"@docusaurus/types": "3.4.0", "@docusaurus/types": "3.4.0",
"@docusaurus/utils": "3.4.0", "@docusaurus/utils": "3.4.0",
"@docusaurus/utils-common": "3.4.0", "@docusaurus/utils-common": "3.4.0",

View file

@ -6,9 +6,24 @@
*/ */
import React, {useMemo, type ReactNode, useContext} from 'react'; import React, {useMemo, type ReactNode, useContext} from 'react';
import {ReactContextError} from '../utils/reactUtils'; import {ReactContextError} from '@docusaurus/theme-common/internal';
import useRouteContext from '@docusaurus/useRouteContext';
import type {PropBlogPostContent} from '@docusaurus/plugin-content-blog'; import type {
PropBlogPostContent,
BlogMetadata,
} from '@docusaurus/plugin-content-blog';
export function useBlogMetadata(): BlogMetadata {
const routeContext = useRouteContext();
const blogMetadata = routeContext?.data?.blogMetadata;
if (!blogMetadata) {
throw new Error(
"useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context",
);
}
return blogMetadata as BlogMetadata;
}
/** /**
* The React context value returned by the `useBlogPost()` hook. * The React context value returned by the `useBlogPost()` hook.

View file

@ -1,20 +0,0 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import useRouteContext from '@docusaurus/useRouteContext';
import type {BlogMetadata} from '@docusaurus/plugin-content-blog';
export function useBlogMetadata(): BlogMetadata {
const routeContext = useRouteContext();
const blogMetadata = routeContext?.data?.blogMetadata;
if (!blogMetadata) {
throw new Error(
"useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context",
);
}
return blogMetadata as BlogMetadata;
}

View file

@ -0,0 +1,24 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
export {
BlogPostProvider,
type BlogPostContextValue,
useBlogPost,
useBlogMetadata,
} from './contexts';
export {
useBlogListPageStructuredData,
useBlogPostStructuredData,
} from './structuredDataUtils';
export {
BlogSidebarItemList,
groupBlogSidebarItemsByYear,
useVisibleBlogSidebarItems,
} from './sidebarUtils';

View file

@ -5,7 +5,7 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import {groupBlogSidebarItemsByYear} from '../blogUtils'; import {groupBlogSidebarItemsByYear} from './sidebarUtils';
import type {BlogSidebarItem} from '@docusaurus/plugin-content-blog'; import type {BlogSidebarItem} from '@docusaurus/plugin-content-blog';
describe('groupBlogSidebarItemsByYear', () => { describe('groupBlogSidebarItemsByYear', () => {

View file

@ -8,8 +8,8 @@
import React, {type ReactNode, useMemo} from 'react'; import React, {type ReactNode, useMemo} from 'react';
import {useLocation} from '@docusaurus/router'; import {useLocation} from '@docusaurus/router';
import Link from '@docusaurus/Link'; import Link from '@docusaurus/Link';
import {isSamePath} from './routesUtils'; import {groupBy} from '@docusaurus/theme-common';
import {groupBy} from './jsUtils'; import {isSamePath} from '@docusaurus/theme-common/internal';
import type {BlogSidebarItem} from '@docusaurus/plugin-content-blog'; import type {BlogSidebarItem} from '@docusaurus/plugin-content-blog';
function isVisible(item: BlogSidebarItem, pathname: string): boolean { function isVisible(item: BlogSidebarItem, pathname: string): boolean {

View file

@ -9,7 +9,8 @@ import {useBaseUrlUtils, type BaseUrlUtils} from '@docusaurus/useBaseUrl';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import {useBlogMetadata} from '@docusaurus/plugin-content-blog/client'; import {useBlogMetadata} from '@docusaurus/plugin-content-blog/client';
import type {Props as BlogListPageStructuredDataProps} from '@theme/BlogListPage/StructuredData'; import type {Props as BlogListPageStructuredDataProps} from '@theme/BlogListPage/StructuredData';
import {useBlogPost} from '../contexts/blogPost'; import {useBlogPost} from './contexts';
import type { import type {
Blog, Blog,
BlogPosting, BlogPosting,

View file

@ -7,7 +7,7 @@
import React from 'react'; import React from 'react';
import Head from '@docusaurus/Head'; import Head from '@docusaurus/Head';
import {useBlogListPageStructuredData} from '@docusaurus/theme-common'; import {useBlogListPageStructuredData} from '@docusaurus/plugin-content-blog/client';
import type {Props} from '@theme/BlogListPage/StructuredData'; import type {Props} from '@theme/BlogListPage/StructuredData';
export default function BlogListPageStructuredData(props: Props): JSX.Element { export default function BlogListPageStructuredData(props: Props): JSX.Element {

View file

@ -8,7 +8,7 @@
import React from 'react'; import React from 'react';
import clsx from 'clsx'; import clsx from 'clsx';
import {blogPostContainerID} from '@docusaurus/utils-common'; import {blogPostContainerID} from '@docusaurus/utils-common';
import {useBlogPost} from '@docusaurus/theme-common/internal'; import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
import MDXContent from '@theme/MDXContent'; import MDXContent from '@theme/MDXContent';
import type {Props} from '@theme/BlogPostItem/Content'; import type {Props} from '@theme/BlogPostItem/Content';

View file

@ -7,7 +7,7 @@
import React from 'react'; import React from 'react';
import clsx from 'clsx'; import clsx from 'clsx';
import {useBlogPost} from '@docusaurus/theme-common/internal'; import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
import {ThemeClassNames} from '@docusaurus/theme-common'; import {ThemeClassNames} from '@docusaurus/theme-common';
import EditMetaRow from '@theme/EditMetaRow'; import EditMetaRow from '@theme/EditMetaRow';
import TagsListInline from '@theme/TagsListInline'; import TagsListInline from '@theme/TagsListInline';

View file

@ -7,7 +7,7 @@
import React from 'react'; import React from 'react';
import clsx from 'clsx'; import clsx from 'clsx';
import {useBlogPost} from '@docusaurus/theme-common/internal'; import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
import BlogPostItemHeaderAuthor from '@theme/BlogPostItem/Header/Author'; import BlogPostItemHeaderAuthor from '@theme/BlogPostItem/Header/Author';
import type {Props} from '@theme/BlogPostItem/Header/Authors'; import type {Props} from '@theme/BlogPostItem/Header/Authors';
import styles from './styles.module.css'; import styles from './styles.module.css';

View file

@ -9,10 +9,8 @@ import React from 'react';
import clsx from 'clsx'; import clsx from 'clsx';
import {translate} from '@docusaurus/Translate'; import {translate} from '@docusaurus/Translate';
import {usePluralForm} from '@docusaurus/theme-common'; import {usePluralForm} from '@docusaurus/theme-common';
import { import {useDateTimeFormat} from '@docusaurus/theme-common/internal';
useBlogPost, import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
useDateTimeFormat,
} from '@docusaurus/theme-common/internal';
import type {Props} from '@theme/BlogPostItem/Header/Info'; import type {Props} from '@theme/BlogPostItem/Header/Info';
import styles from './styles.module.css'; import styles from './styles.module.css';

View file

@ -8,7 +8,7 @@
import React from 'react'; import React from 'react';
import clsx from 'clsx'; import clsx from 'clsx';
import Link from '@docusaurus/Link'; import Link from '@docusaurus/Link';
import {useBlogPost} from '@docusaurus/theme-common/internal'; import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
import type {Props} from '@theme/BlogPostItem/Header/Title'; import type {Props} from '@theme/BlogPostItem/Header/Title';
import styles from './styles.module.css'; import styles from './styles.module.css';

View file

@ -7,7 +7,7 @@
import React from 'react'; import React from 'react';
import clsx from 'clsx'; import clsx from 'clsx';
import {useBlogPost} from '@docusaurus/theme-common/internal'; import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
import BlogPostItemContainer from '@theme/BlogPostItem/Container'; import BlogPostItemContainer from '@theme/BlogPostItem/Container';
import BlogPostItemHeader from '@theme/BlogPostItem/Header'; import BlogPostItemHeader from '@theme/BlogPostItem/Header';
import BlogPostItemContent from '@theme/BlogPostItem/Content'; import BlogPostItemContent from '@theme/BlogPostItem/Content';

View file

@ -6,7 +6,7 @@
*/ */
import React from 'react'; import React from 'react';
import {BlogPostProvider} from '@docusaurus/theme-common/internal'; import {BlogPostProvider} from '@docusaurus/plugin-content-blog/client';
import BlogPostItem from '@theme/BlogPostItem'; import BlogPostItem from '@theme/BlogPostItem';
import type {Props} from '@theme/BlogPostItems'; import type {Props} from '@theme/BlogPostItems';

View file

@ -7,7 +7,7 @@
import React from 'react'; import React from 'react';
import {PageMetadata} from '@docusaurus/theme-common'; import {PageMetadata} from '@docusaurus/theme-common';
import {useBlogPost} from '@docusaurus/theme-common/internal'; import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
export default function BlogPostPageMetadata(): JSX.Element { export default function BlogPostPageMetadata(): JSX.Element {
const {assets, metadata} = useBlogPost(); const {assets, metadata} = useBlogPost();

View file

@ -7,7 +7,7 @@
import React from 'react'; import React from 'react';
import Head from '@docusaurus/Head'; import Head from '@docusaurus/Head';
import {useBlogPostStructuredData} from '@docusaurus/theme-common'; import {useBlogPostStructuredData} from '@docusaurus/plugin-content-blog/client';
export default function BlogPostStructuredData(): JSX.Element { export default function BlogPostStructuredData(): JSX.Element {
const structuredData = useBlogPostStructuredData(); const structuredData = useBlogPostStructuredData();

View file

@ -8,7 +8,10 @@
import React, {type ReactNode} from 'react'; import React, {type ReactNode} from 'react';
import clsx from 'clsx'; import clsx from 'clsx';
import {HtmlClassNameProvider, ThemeClassNames} from '@docusaurus/theme-common'; import {HtmlClassNameProvider, ThemeClassNames} from '@docusaurus/theme-common';
import {BlogPostProvider, useBlogPost} from '@docusaurus/theme-common/internal'; import {
BlogPostProvider,
useBlogPost,
} from '@docusaurus/plugin-content-blog/client';
import BlogLayout from '@theme/BlogLayout'; import BlogLayout from '@theme/BlogLayout';
import BlogPostItem from '@theme/BlogPostItem'; import BlogPostItem from '@theme/BlogPostItem';
import BlogPostPaginator from '@theme/BlogPostPaginator'; import BlogPostPaginator from '@theme/BlogPostPaginator';

View file

@ -6,7 +6,7 @@
*/ */
import React, {memo, type ReactNode} from 'react'; import React, {memo, type ReactNode} from 'react';
import {useThemeConfig} from '@docusaurus/theme-common'; import {useThemeConfig} from '@docusaurus/theme-common';
import {groupBlogSidebarItemsByYear} from '@docusaurus/theme-common/internal'; import {groupBlogSidebarItemsByYear} from '@docusaurus/plugin-content-blog/client';
import Heading from '@theme/Heading'; import Heading from '@theme/Heading';
import type {Props} from '@theme/BlogSidebar/Content'; import type {Props} from '@theme/BlogSidebar/Content';

View file

@ -11,7 +11,7 @@ import {translate} from '@docusaurus/Translate';
import { import {
useVisibleBlogSidebarItems, useVisibleBlogSidebarItems,
BlogSidebarItemList, BlogSidebarItemList,
} from '@docusaurus/theme-common/internal'; } from '@docusaurus/plugin-content-blog/client';
import BlogSidebarContent from '@theme/BlogSidebar/Content'; import BlogSidebarContent from '@theme/BlogSidebar/Content';
import type {Props as BlogSidebarContentProps} from '@theme/BlogSidebar/Content'; import type {Props as BlogSidebarContentProps} from '@theme/BlogSidebar/Content';
import type {Props} from '@theme/BlogSidebar/Desktop'; import type {Props} from '@theme/BlogSidebar/Desktop';

View file

@ -9,7 +9,7 @@ import React, {memo} from 'react';
import { import {
useVisibleBlogSidebarItems, useVisibleBlogSidebarItems,
BlogSidebarItemList, BlogSidebarItemList,
} from '@docusaurus/theme-common/internal'; } from '@docusaurus/plugin-content-blog/client';
import {NavbarSecondaryMenuFiller} from '@docusaurus/theme-common'; import {NavbarSecondaryMenuFiller} from '@docusaurus/theme-common';
import BlogSidebarContent from '@theme/BlogSidebar/Content'; import BlogSidebarContent from '@theme/BlogSidebar/Content';
import type {Props} from '@theme/BlogSidebar/Mobile'; import type {Props} from '@theme/BlogSidebar/Mobile';

View file

@ -32,7 +32,6 @@
"dependencies": { "dependencies": {
"@docusaurus/mdx-loader": "3.4.0", "@docusaurus/mdx-loader": "3.4.0",
"@docusaurus/module-type-aliases": "3.4.0", "@docusaurus/module-type-aliases": "3.4.0",
"@docusaurus/plugin-content-blog": "3.4.0",
"@docusaurus/plugin-content-docs": "3.4.0", "@docusaurus/plugin-content-docs": "3.4.0",
"@docusaurus/plugin-content-pages": "3.4.0", "@docusaurus/plugin-content-pages": "3.4.0",
"@docusaurus/utils": "3.4.0", "@docusaurus/utils": "3.4.0",

View file

@ -39,11 +39,6 @@ export {
filterDocCardListItems, filterDocCardListItems,
} from './utils/docsUtils'; } from './utils/docsUtils';
export {
useBlogListPageStructuredData,
useBlogPostStructuredData,
} from './utils/structuredDataUtils';
export {usePluralForm} from './utils/usePluralForm'; export {usePluralForm} from './utils/usePluralForm';
export {useCollapsible, Collapsible} from './components/Collapsible'; export {useCollapsible, Collapsible} from './components/Collapsible';

View file

@ -26,11 +26,6 @@ export {DocsVersionProvider, useDocsVersion} from './contexts/docsVersion';
export {DocsSidebarProvider, useDocsSidebar} from './contexts/docsSidebar'; export {DocsSidebarProvider, useDocsSidebar} from './contexts/docsSidebar';
export {DocProvider, useDoc, type DocContextValue} from './contexts/doc'; export {DocProvider, useDoc, type DocContextValue} from './contexts/doc';
export {
BlogPostProvider,
useBlogPost,
type BlogPostContextValue,
} from './contexts/blogPost';
export { export {
useDocsPreferredVersionByPluginId, useDocsPreferredVersionByPluginId,
@ -113,11 +108,6 @@ export {
type TOCHighlightConfig, type TOCHighlightConfig,
} from './hooks/useTOCHighlight'; } from './hooks/useTOCHighlight';
export {
useVisibleBlogSidebarItems,
groupBlogSidebarItemsByYear,
BlogSidebarItemList,
} from './utils/blogUtils';
export {useDateTimeFormat} from './utils/IntlUtils'; export {useDateTimeFormat} from './utils/IntlUtils';
export {useHideableNavbar} from './hooks/useHideableNavbar'; export {useHideableNavbar} from './hooks/useHideableNavbar';

View file

@ -6,6 +6,4 @@
*/ */
/// <reference types="@docusaurus/module-type-aliases" /> /// <reference types="@docusaurus/module-type-aliases" />
/// <reference types="@docusaurus/plugin-content-blog" />
/// <reference types="@docusaurus/plugin-content-docs" /> /// <reference types="@docusaurus/plugin-content-docs" />
/// <reference types="@docusaurus/plugin-content-pages" />

View file

@ -7,7 +7,7 @@
import React, {useState} from 'react'; import React, {useState} from 'react';
import clsx from 'clsx'; import clsx from 'clsx';
import {useBlogPost} from '@docusaurus/theme-common/internal'; import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
import ChangelogItemHeaderAuthor from '@theme/ChangelogItem/Header/Author'; import ChangelogItemHeaderAuthor from '@theme/ChangelogItem/Header/Author';
import IconExpand from '@theme/Icon/Expand'; import IconExpand from '@theme/Icon/Expand';
import type {Props} from '@theme/BlogPostItem/Header/Authors'; import type {Props} from '@theme/BlogPostItem/Header/Authors';

View file

@ -6,7 +6,7 @@
*/ */
import React from 'react'; import React from 'react';
import {useBlogPost} from '@docusaurus/theme-common/internal'; import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
import BlogPostItemHeaderTitle from '@theme/BlogPostItem/Header/Title'; import BlogPostItemHeaderTitle from '@theme/BlogPostItem/Header/Title';
import BlogPostItemHeaderInfo from '@theme/BlogPostItem/Header/Info'; import BlogPostItemHeaderInfo from '@theme/BlogPostItem/Header/Info';

View file

@ -10,7 +10,10 @@ import clsx from 'clsx';
import Translate from '@docusaurus/Translate'; import Translate from '@docusaurus/Translate';
import Link from '@docusaurus/Link'; import Link from '@docusaurus/Link';
import {HtmlClassNameProvider, ThemeClassNames} from '@docusaurus/theme-common'; import {HtmlClassNameProvider, ThemeClassNames} from '@docusaurus/theme-common';
import {BlogPostProvider, useBlogPost} from '@docusaurus/theme-common/internal'; import {
BlogPostProvider,
useBlogPost,
} from '@docusaurus/plugin-content-blog/client';
import BlogPostPageMetadata from '@theme/BlogPostPage/Metadata'; import BlogPostPageMetadata from '@theme/BlogPostPage/Metadata';
import BlogLayout from '@theme/BlogLayout'; import BlogLayout from '@theme/BlogLayout';
import ChangelogItem from '@theme/ChangelogItem'; import ChangelogItem from '@theme/ChangelogItem';