mirror of
https://github.com/facebook/docusaurus.git
synced 2025-04-28 17:57:48 +02:00
refactor(docs): theme-common shouldn't depend on docs content (#10316)
This commit is contained in:
parent
d426469608
commit
026a317fc4
51 changed files with 209 additions and 189 deletions
8
.github/workflows/tests-e2e.yml
vendored
8
.github/workflows/tests-e2e.yml
vendored
|
@ -102,19 +102,11 @@ jobs:
|
|||
working-directory: ../test-website
|
||||
env:
|
||||
YARN_ENABLE_IMMUTABLE_INSTALLS: false # Yarn berry should create the lockfile, despite CI env
|
||||
- name: Install missing dependencies
|
||||
if: matrix.variant == '-st' && matrix.nodeLinker == 'pnp'
|
||||
run: |
|
||||
# These dependencies are referenced in the init project, not by our packages
|
||||
yarn add @docusaurus/theme-classic @docusaurus/types @types/node
|
||||
yarn config set packageExtensions --json '{ "unified@^9.2.2": { "dependencies": { "@types/unist": "^2.0.6" } } }'
|
||||
working-directory: ../test-website
|
||||
- name: Start test-website project
|
||||
run: yarn start --no-open
|
||||
working-directory: ../test-website
|
||||
env:
|
||||
E2E_TEST: true
|
||||
|
||||
- name: TypeCheck website
|
||||
# TODO: there're some lingering issues with PnP + tsc. Enable tsc in PnP later.
|
||||
if: matrix.variant == '-st' && matrix.nodeLinker != 'pnp'
|
||||
|
|
|
@ -52,7 +52,8 @@
|
|||
},
|
||||
"peerDependencies": {
|
||||
"react": "^18.0.0",
|
||||
"react-dom": "^18.0.0"
|
||||
"react-dom": "^18.0.0",
|
||||
"@docusaurus/plugin-content-docs": "*"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0"
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
"@docusaurus/logger": "3.4.0",
|
||||
"@docusaurus/mdx-loader": "3.4.0",
|
||||
"@docusaurus/module-type-aliases": "3.4.0",
|
||||
"@docusaurus/theme-common": "3.4.0",
|
||||
"@docusaurus/types": "3.4.0",
|
||||
"@docusaurus/utils": "3.4.0",
|
||||
"@docusaurus/utils-common": "3.4.0",
|
||||
|
|
|
@ -18,7 +18,7 @@ import type {
|
|||
GlobalVersion,
|
||||
ActivePlugin,
|
||||
GlobalDoc,
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
} from '../index';
|
||||
|
||||
describe('docsClientUtils', () => {
|
||||
it('getActivePlugin', () => {
|
||||
|
|
|
@ -18,8 +18,8 @@ import {
|
|||
useSidebarBreadcrumbs,
|
||||
isVisibleSidebarItem,
|
||||
} from '../docsUtils';
|
||||
import {DocsSidebarProvider} from '../../contexts/docsSidebar';
|
||||
import {DocsVersionProvider} from '../../contexts/docsVersion';
|
||||
import {DocsSidebarProvider} from '../docsSidebar';
|
||||
import {DocsVersionProvider} from '../docsVersion';
|
||||
import type {
|
||||
PropSidebar,
|
||||
PropSidebarItem,
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
import React, {useMemo, type ReactNode, useContext} from 'react';
|
||||
import {ReactContextError} from '../utils/reactUtils';
|
||||
import {ReactContextError} from '@docusaurus/theme-common/internal';
|
||||
import type {PropDocContent} from '@docusaurus/plugin-content-docs';
|
||||
|
||||
/**
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
import React, {type ReactNode, useMemo, useState, useContext} from 'react';
|
||||
import {ReactContextError} from '../utils/reactUtils';
|
||||
import {ReactContextError} from '@docusaurus/theme-common/internal';
|
||||
|
||||
type ContextValue = {
|
||||
/**
|
|
@ -20,13 +20,13 @@ import {
|
|||
type GlobalVersion,
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import {DEFAULT_PLUGIN_ID} from '@docusaurus/constants';
|
||||
import {useThemeConfig, type ThemeConfig} from '@docusaurus/theme-common';
|
||||
import {
|
||||
useThemeConfig,
|
||||
type DocsVersionPersistence,
|
||||
} from '../utils/useThemeConfig';
|
||||
import {isDocsPluginEnabled} from '../utils/docsUtils';
|
||||
import {ReactContextError} from '../utils/reactUtils';
|
||||
import {createStorageSlot} from '../utils/storageUtils';
|
||||
ReactContextError,
|
||||
createStorageSlot,
|
||||
} from '@docusaurus/theme-common/internal';
|
||||
|
||||
type DocsVersionPersistence = ThemeConfig['docs']['versionPersistence'];
|
||||
|
||||
const storageKey = (pluginId: string) => `docs-preferred-version-${pluginId}`;
|
||||
|
||||
|
@ -177,14 +177,11 @@ export function DocsPreferredVersionContextProvider({
|
|||
}: {
|
||||
children: ReactNode;
|
||||
}): JSX.Element {
|
||||
if (isDocsPluginEnabled) {
|
||||
return (
|
||||
<DocsPreferredVersionContextProviderUnsafe>
|
||||
{children}
|
||||
</DocsPreferredVersionContextProviderUnsafe>
|
||||
);
|
||||
}
|
||||
return <>{children}</>;
|
||||
return (
|
||||
<DocsPreferredVersionContextProviderUnsafe>
|
||||
{children}
|
||||
</DocsPreferredVersionContextProviderUnsafe>
|
||||
);
|
||||
}
|
||||
|
||||
function useDocsPreferredVersionContext(): ContextValue {
|
|
@ -5,10 +5,10 @@
|
|||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
import {docVersionSearchTag} from '../searchUtils';
|
||||
import {getDocsVersionSearchTag} from './docsSearch';
|
||||
|
||||
describe('docVersionSearchTag', () => {
|
||||
describe('getDocsVersionSearchTag', () => {
|
||||
it('works', () => {
|
||||
expect(docVersionSearchTag('foo', 'bar')).toBe('docs-foo-bar');
|
||||
expect(getDocsVersionSearchTag('foo', 'bar')).toBe('docs-foo-bar');
|
||||
});
|
||||
});
|
|
@ -0,0 +1,57 @@
|
|||
/**
|
||||
* 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 {
|
||||
useAllDocsData,
|
||||
useActivePluginAndVersion,
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import {useDocsPreferredVersionByPluginId} from './docsPreferredVersion';
|
||||
|
||||
/** The search tag to append as each doc's metadata. */
|
||||
export function getDocsVersionSearchTag(
|
||||
pluginId: string,
|
||||
versionName: string,
|
||||
): string {
|
||||
return `docs-${pluginId}-${versionName}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the relevant docs tags to search.
|
||||
* This is the logic that powers the contextual search feature.
|
||||
*
|
||||
* If user is browsing Android 1.4 docs, he'll get presented with:
|
||||
* - Android '1.4' docs
|
||||
* - iOS 'preferred | latest' docs
|
||||
*
|
||||
* The result is generic and not coupled to Algolia/DocSearch on purpose.
|
||||
*/
|
||||
export function useDocsContextualSearchTags(): string[] {
|
||||
const allDocsData = useAllDocsData();
|
||||
const activePluginAndVersion = useActivePluginAndVersion();
|
||||
const docsPreferredVersionByPluginId = useDocsPreferredVersionByPluginId();
|
||||
|
||||
// This can't use more specialized hooks because we are mapping over all
|
||||
// plugin instances.
|
||||
function getDocPluginTags(pluginId: string) {
|
||||
const activeVersion =
|
||||
activePluginAndVersion?.activePlugin.pluginId === pluginId
|
||||
? activePluginAndVersion.activeVersion
|
||||
: undefined;
|
||||
|
||||
const preferredVersion = docsPreferredVersionByPluginId[pluginId];
|
||||
|
||||
const latestVersion = allDocsData[pluginId]!.versions.find(
|
||||
(v) => v.isLast,
|
||||
)!;
|
||||
|
||||
const version = activeVersion ?? preferredVersion ?? latestVersion;
|
||||
|
||||
return getDocsVersionSearchTag(pluginId, version.name);
|
||||
}
|
||||
|
||||
return [...Object.keys(allDocsData).map(getDocPluginTags)];
|
||||
}
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
import React, {useMemo, useContext, type ReactNode} from 'react';
|
||||
import {ReactContextError} from '../utils/reactUtils';
|
||||
import {ReactContextError} from '@docusaurus/theme-common/internal';
|
||||
import type {PropSidebar} from '@docusaurus/plugin-content-docs';
|
||||
|
||||
// Using a Symbol because null is a valid context value (a doc with no sidebar)
|
|
@ -9,7 +9,6 @@ import {useMemo} from 'react';
|
|||
import {matchPath, useLocation} from '@docusaurus/router';
|
||||
import renderRoutes from '@docusaurus/renderRoutes';
|
||||
import {
|
||||
useAllDocsData,
|
||||
useActivePlugin,
|
||||
useActiveDocContext,
|
||||
useLatestVersion,
|
||||
|
@ -17,12 +16,13 @@ import {
|
|||
type GlobalSidebar,
|
||||
type GlobalDoc,
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import {isSamePath} from '@docusaurus/theme-common/internal';
|
||||
import {uniq} from '@docusaurus/theme-common';
|
||||
import type {Props as DocRootProps} from '@theme/DocRoot';
|
||||
import {useDocsPreferredVersion} from '../contexts/docsPreferredVersion';
|
||||
import {useDocsVersion} from '../contexts/docsVersion';
|
||||
import {useDocsSidebar} from '../contexts/docsSidebar';
|
||||
import {uniq} from './jsUtils';
|
||||
import {isSamePath} from './routesUtils';
|
||||
import {useDocsPreferredVersion} from './docsPreferredVersion';
|
||||
import {useDocsVersion} from './docsVersion';
|
||||
import {useDocsSidebar} from './docsSidebar';
|
||||
|
||||
import type {
|
||||
PropSidebar,
|
||||
PropSidebarItem,
|
||||
|
@ -31,9 +31,6 @@ import type {
|
|||
PropSidebarBreadcrumbsItem,
|
||||
} from '@docusaurus/plugin-content-docs';
|
||||
|
||||
// TODO not ideal, see also "useDocs"
|
||||
export const isDocsPluginEnabled: boolean = !!useAllDocsData;
|
||||
|
||||
/**
|
||||
* A null-safe way to access a doc's data by ID in the active version.
|
||||
*/
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
import React, {type ReactNode, useContext} from 'react';
|
||||
import {ReactContextError} from '../utils/reactUtils';
|
||||
import {ReactContextError} from '@docusaurus/theme-common/internal';
|
||||
import type {PropVersionMetadata} from '@docusaurus/plugin-content-docs';
|
||||
|
||||
const Context = React.createContext<PropVersionMetadata | null>(null);
|
|
@ -20,6 +20,45 @@ import {
|
|||
} from './docsClientUtils';
|
||||
import type {UseDataOptions} from '@docusaurus/types';
|
||||
|
||||
export {
|
||||
useDocById,
|
||||
findSidebarCategory,
|
||||
findFirstSidebarItemLink,
|
||||
isActiveSidebarItem,
|
||||
isVisibleSidebarItem,
|
||||
useVisibleSidebarItems,
|
||||
useSidebarBreadcrumbs,
|
||||
useDocsVersionCandidates,
|
||||
useLayoutDoc,
|
||||
useLayoutDocsSidebar,
|
||||
useDocRootMetadata,
|
||||
useCurrentSidebarCategory,
|
||||
filterDocCardListItems,
|
||||
} from './docsUtils';
|
||||
|
||||
export {useDocsPreferredVersion} from './docsPreferredVersion';
|
||||
|
||||
export {
|
||||
DocSidebarItemsExpandedStateProvider,
|
||||
useDocSidebarItemsExpandedState,
|
||||
} from './docSidebarItemsExpandedState';
|
||||
|
||||
export {DocsVersionProvider, useDocsVersion} from './docsVersion';
|
||||
|
||||
export {DocsSidebarProvider, useDocsSidebar} from './docsSidebar';
|
||||
|
||||
export {DocProvider, useDoc, type DocContextValue} from './doc';
|
||||
|
||||
export {
|
||||
useDocsPreferredVersionByPluginId,
|
||||
DocsPreferredVersionContextProvider,
|
||||
} from './docsPreferredVersion';
|
||||
|
||||
export {
|
||||
useDocsContextualSearchTags,
|
||||
getDocsVersionSearchTag,
|
||||
} from './docsSearch';
|
||||
|
||||
export type ActivePlugin = {
|
||||
pluginId: string;
|
||||
pluginData: GlobalPluginData;
|
||||
|
|
|
@ -8,10 +8,8 @@
|
|||
import React, {type ReactNode} from 'react';
|
||||
import clsx from 'clsx';
|
||||
import {ThemeClassNames} from '@docusaurus/theme-common';
|
||||
import {
|
||||
useSidebarBreadcrumbs,
|
||||
useHomePageRoute,
|
||||
} from '@docusaurus/theme-common/internal';
|
||||
import {useSidebarBreadcrumbs} from '@docusaurus/plugin-content-docs/client';
|
||||
import {useHomePageRoute} from '@docusaurus/theme-common/internal';
|
||||
import Link from '@docusaurus/Link';
|
||||
import {translate} from '@docusaurus/Translate';
|
||||
import HomeBreadcrumbItem from '@theme/DocBreadcrumbs/Items/Home';
|
||||
|
|
|
@ -9,9 +9,9 @@ import React, {type ReactNode} from 'react';
|
|||
import clsx from 'clsx';
|
||||
import Link from '@docusaurus/Link';
|
||||
import {
|
||||
findFirstSidebarItemLink,
|
||||
useDocById,
|
||||
} from '@docusaurus/theme-common/internal';
|
||||
findFirstSidebarItemLink,
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import {usePluralForm} from '@docusaurus/theme-common';
|
||||
import isInternalUrl from '@docusaurus/isInternalUrl';
|
||||
import {translate} from '@docusaurus/Translate';
|
||||
|
|
|
@ -10,7 +10,7 @@ import clsx from 'clsx';
|
|||
import {
|
||||
useCurrentSidebarCategory,
|
||||
filterDocCardListItems,
|
||||
} from '@docusaurus/theme-common';
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import DocCard from '@theme/DocCard';
|
||||
import type {Props} from '@theme/DocCardList';
|
||||
|
||||
|
|
|
@ -6,10 +6,8 @@
|
|||
*/
|
||||
|
||||
import React from 'react';
|
||||
import {
|
||||
PageMetadata,
|
||||
useCurrentSidebarCategory,
|
||||
} from '@docusaurus/theme-common';
|
||||
import {PageMetadata} from '@docusaurus/theme-common';
|
||||
import {useCurrentSidebarCategory} from '@docusaurus/plugin-content-docs/client';
|
||||
import useBaseUrl from '@docusaurus/useBaseUrl';
|
||||
import DocCardList from '@theme/DocCardList';
|
||||
import DocPaginator from '@theme/DocPaginator';
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
import React from 'react';
|
||||
import clsx from 'clsx';
|
||||
import {ThemeClassNames} from '@docusaurus/theme-common';
|
||||
import {useDoc} from '@docusaurus/theme-common/internal';
|
||||
import {useDoc} from '@docusaurus/plugin-content-docs/client';
|
||||
import Heading from '@theme/Heading';
|
||||
import MDXContent from '@theme/MDXContent';
|
||||
import type {Props} from '@theme/DocItem/Content';
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
import React from 'react';
|
||||
import clsx from 'clsx';
|
||||
import {ThemeClassNames} from '@docusaurus/theme-common';
|
||||
import {useDoc} from '@docusaurus/theme-common/internal';
|
||||
import {useDoc} from '@docusaurus/plugin-content-docs/client';
|
||||
import TagsListInline from '@theme/TagsListInline';
|
||||
|
||||
import EditMetaRow from '@theme/EditMetaRow';
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
import React from 'react';
|
||||
import clsx from 'clsx';
|
||||
import {useWindowSize} from '@docusaurus/theme-common';
|
||||
import {useDoc} from '@docusaurus/theme-common/internal';
|
||||
import {useDoc} from '@docusaurus/plugin-content-docs/client';
|
||||
import DocItemPaginator from '@theme/DocItem/Paginator';
|
||||
import DocVersionBanner from '@theme/DocVersionBanner';
|
||||
import DocVersionBadge from '@theme/DocVersionBadge';
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
import React from 'react';
|
||||
import {PageMetadata} from '@docusaurus/theme-common';
|
||||
import {useDoc} from '@docusaurus/theme-common/internal';
|
||||
import {useDoc} from '@docusaurus/plugin-content-docs/client';
|
||||
|
||||
export default function DocItemMetadata(): JSX.Element {
|
||||
const {metadata, frontMatter, assets} = useDoc();
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
import React from 'react';
|
||||
import {useDoc} from '@docusaurus/theme-common/internal';
|
||||
import {useDoc} from '@docusaurus/plugin-content-docs/client';
|
||||
import DocPaginator from '@theme/DocPaginator';
|
||||
|
||||
/**
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
import React from 'react';
|
||||
import {ThemeClassNames} from '@docusaurus/theme-common';
|
||||
import {useDoc} from '@docusaurus/theme-common/internal';
|
||||
import {useDoc} from '@docusaurus/plugin-content-docs/client';
|
||||
|
||||
import TOC from '@theme/TOC';
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
import React from 'react';
|
||||
import clsx from 'clsx';
|
||||
import {ThemeClassNames} from '@docusaurus/theme-common';
|
||||
import {useDoc} from '@docusaurus/theme-common/internal';
|
||||
import {useDoc} from '@docusaurus/plugin-content-docs/client';
|
||||
|
||||
import TOCCollapsible from '@theme/TOCCollapsible';
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
import React from 'react';
|
||||
import {HtmlClassNameProvider} from '@docusaurus/theme-common';
|
||||
import {DocProvider} from '@docusaurus/theme-common/internal';
|
||||
import {DocProvider} from '@docusaurus/plugin-content-docs/client';
|
||||
import DocItemMetadata from '@theme/DocItem/Metadata';
|
||||
import DocItemLayout from '@theme/DocItem/Layout';
|
||||
import type {Props} from '@theme/DocItem';
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
import React from 'react';
|
||||
import clsx from 'clsx';
|
||||
import {useDocsSidebar} from '@docusaurus/theme-common/internal';
|
||||
import {useDocsSidebar} from '@docusaurus/plugin-content-docs/client';
|
||||
import type {Props} from '@theme/DocRoot/Layout/Main';
|
||||
|
||||
import styles from './styles.module.css';
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
import React, {type ReactNode, useState, useCallback} from 'react';
|
||||
import clsx from 'clsx';
|
||||
import {prefersReducedMotion, ThemeClassNames} from '@docusaurus/theme-common';
|
||||
import {useDocsSidebar} from '@docusaurus/theme-common/internal';
|
||||
import {useDocsSidebar} from '@docusaurus/plugin-content-docs/client';
|
||||
import {useLocation} from '@docusaurus/router';
|
||||
import DocSidebar from '@theme/DocSidebar';
|
||||
import ExpandButton from '@theme/DocRoot/Layout/Sidebar/ExpandButton';
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
import React, {useState} from 'react';
|
||||
import {useDocsSidebar} from '@docusaurus/theme-common/internal';
|
||||
import {useDocsSidebar} from '@docusaurus/plugin-content-docs/client';
|
||||
import BackToTopButton from '@theme/BackToTopButton';
|
||||
import DocRootLayoutSidebar from '@theme/DocRoot/Layout/Sidebar';
|
||||
import DocRootLayoutMain from '@theme/DocRoot/Layout/Main';
|
||||
|
|
|
@ -11,7 +11,7 @@ import {HtmlClassNameProvider, ThemeClassNames} from '@docusaurus/theme-common';
|
|||
import {
|
||||
DocsSidebarProvider,
|
||||
useDocRootMetadata,
|
||||
} from '@docusaurus/theme-common/internal';
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import DocRootLayout from '@theme/DocRoot/Layout';
|
||||
import NotFoundContent from '@theme/NotFound/Content';
|
||||
import type {Props} from '@theme/DocRoot';
|
||||
|
|
|
@ -14,12 +14,12 @@ import {
|
|||
Collapsible,
|
||||
useCollapsible,
|
||||
} from '@docusaurus/theme-common';
|
||||
import {isSamePath} from '@docusaurus/theme-common/internal';
|
||||
import {
|
||||
isActiveSidebarItem,
|
||||
findFirstSidebarItemLink,
|
||||
useDocSidebarItemsExpandedState,
|
||||
isSamePath,
|
||||
} from '@docusaurus/theme-common/internal';
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import Link from '@docusaurus/Link';
|
||||
import {translate} from '@docusaurus/Translate';
|
||||
import useIsBrowser from '@docusaurus/useIsBrowser';
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
import React from 'react';
|
||||
import clsx from 'clsx';
|
||||
import {ThemeClassNames} from '@docusaurus/theme-common';
|
||||
import {isActiveSidebarItem} from '@docusaurus/theme-common/internal';
|
||||
import {isActiveSidebarItem} from '@docusaurus/plugin-content-docs/client';
|
||||
import Link from '@docusaurus/Link';
|
||||
import isInternalUrl from '@docusaurus/isInternalUrl';
|
||||
import IconExternalLink from '@theme/Icon/ExternalLink';
|
||||
|
|
|
@ -9,7 +9,7 @@ import React, {memo} from 'react';
|
|||
import {
|
||||
DocSidebarItemsExpandedStateProvider,
|
||||
useVisibleSidebarItems,
|
||||
} from '@docusaurus/theme-common/internal';
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import DocSidebarItem from '@theme/DocSidebarItem';
|
||||
|
||||
import type {Props} from '@theme/DocSidebarItems';
|
||||
|
|
|
@ -9,7 +9,7 @@ import React from 'react';
|
|||
import clsx from 'clsx';
|
||||
import Translate from '@docusaurus/Translate';
|
||||
import {ThemeClassNames} from '@docusaurus/theme-common';
|
||||
import {useDocsVersion} from '@docusaurus/theme-common/internal';
|
||||
import {useDocsVersion} from '@docusaurus/plugin-content-docs/client';
|
||||
import type {Props} from '@theme/DocVersionBadge';
|
||||
|
||||
export default function DocVersionBadge({
|
||||
|
|
|
@ -19,7 +19,7 @@ import {ThemeClassNames} from '@docusaurus/theme-common';
|
|||
import {
|
||||
useDocsPreferredVersion,
|
||||
useDocsVersion,
|
||||
} from '@docusaurus/theme-common/internal';
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import type {Props} from '@theme/DocVersionBanner';
|
||||
import type {
|
||||
VersionBanner,
|
||||
|
|
|
@ -8,9 +8,9 @@
|
|||
import React from 'react';
|
||||
import {HtmlClassNameProvider, PageMetadata} from '@docusaurus/theme-common';
|
||||
import {
|
||||
docVersionSearchTag,
|
||||
getDocsVersionSearchTag,
|
||||
DocsVersionProvider,
|
||||
} from '@docusaurus/theme-common/internal';
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import renderRoutes from '@docusaurus/renderRoutes';
|
||||
import SearchMetadata from '@theme/SearchMetadata';
|
||||
|
||||
|
@ -22,7 +22,7 @@ function DocVersionRootMetadata(props: Props): JSX.Element {
|
|||
<>
|
||||
<SearchMetadata
|
||||
version={version.version}
|
||||
tag={docVersionSearchTag(version.pluginId, version.version)}
|
||||
tag={getDocsVersionSearchTag(version.pluginId, version.version)}
|
||||
/>
|
||||
<PageMetadata>
|
||||
{version.noIndex && <meta name="robots" content="noindex, nofollow" />}
|
||||
|
|
|
@ -10,11 +10,11 @@ import {composeProviders} from '@docusaurus/theme-common';
|
|||
import {
|
||||
ColorModeProvider,
|
||||
AnnouncementBarProvider,
|
||||
DocsPreferredVersionContextProvider,
|
||||
ScrollControllerProvider,
|
||||
NavbarProvider,
|
||||
PluginHtmlClassNameProvider,
|
||||
} from '@docusaurus/theme-common/internal';
|
||||
import {DocsPreferredVersionContextProvider} from '@docusaurus/plugin-content-docs/client';
|
||||
import type {Props} from '@theme/Layout/Provider';
|
||||
|
||||
const Provider = composeProviders([
|
||||
|
|
|
@ -6,8 +6,10 @@
|
|||
*/
|
||||
|
||||
import React from 'react';
|
||||
import {useActiveDocContext} from '@docusaurus/plugin-content-docs/client';
|
||||
import {useLayoutDoc} from '@docusaurus/theme-common/internal';
|
||||
import {
|
||||
useActiveDocContext,
|
||||
useLayoutDoc,
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem';
|
||||
import type {Props} from '@theme/NavbarItem/DocNavbarItem';
|
||||
|
||||
|
|
|
@ -6,8 +6,10 @@
|
|||
*/
|
||||
|
||||
import React from 'react';
|
||||
import {useActiveDocContext} from '@docusaurus/plugin-content-docs/client';
|
||||
import {useLayoutDocsSidebar} from '@docusaurus/theme-common/internal';
|
||||
import {
|
||||
useActiveDocContext,
|
||||
useLayoutDocsSidebar,
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem';
|
||||
import type {Props} from '@theme/NavbarItem/DocSidebarNavbarItem';
|
||||
|
||||
|
|
|
@ -9,9 +9,9 @@ import React from 'react';
|
|||
import {
|
||||
useVersions,
|
||||
useActiveDocContext,
|
||||
useDocsVersionCandidates,
|
||||
useDocsPreferredVersion,
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import {useDocsPreferredVersion} from '@docusaurus/theme-common';
|
||||
import {useDocsVersionCandidates} from '@docusaurus/theme-common/internal';
|
||||
import {translate} from '@docusaurus/Translate';
|
||||
import {useLocation} from '@docusaurus/router';
|
||||
import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem';
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
import React from 'react';
|
||||
import {useDocsVersionCandidates} from '@docusaurus/theme-common/internal';
|
||||
import {useDocsVersionCandidates} from '@docusaurus/plugin-content-docs/client';
|
||||
import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem';
|
||||
import type {Props} from '@theme/NavbarItem/DocsVersionNavbarItem';
|
||||
import type {GlobalVersion} from '@docusaurus/plugin-content-docs/client';
|
||||
|
|
|
@ -32,8 +32,6 @@
|
|||
"dependencies": {
|
||||
"@docusaurus/mdx-loader": "3.4.0",
|
||||
"@docusaurus/module-type-aliases": "3.4.0",
|
||||
"@docusaurus/plugin-content-docs": "3.4.0",
|
||||
"@docusaurus/plugin-content-pages": "3.4.0",
|
||||
"@docusaurus/utils": "3.4.0",
|
||||
"@docusaurus/utils-common": "3.4.0",
|
||||
"@types/history": "^4.7.11",
|
||||
|
@ -54,7 +52,8 @@
|
|||
},
|
||||
"peerDependencies": {
|
||||
"react": "^18.0.0",
|
||||
"react-dom": "^18.0.0"
|
||||
"react-dom": "^18.0.0",
|
||||
"@docusaurus/plugin-content-docs": "*"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0"
|
||||
|
|
|
@ -5,6 +5,29 @@
|
|||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
// TODO Docusaurus v4: remove these workarounds as a breaking change
|
||||
// and remove docs plugin peerDeps in theme-common/package.json
|
||||
// This is public API surface that we need to keep for v3
|
||||
// See https://github.com/facebook/docusaurus/pull/10316
|
||||
export function useCurrentSidebarCategory(...args: unknown[]): unknown {
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
return require('@docusaurus/plugin-content-docs/client').useCurrentSidebarCategory(
|
||||
...args,
|
||||
);
|
||||
}
|
||||
export function filterDocCardListItems(...args: unknown[]): unknown {
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
return require('@docusaurus/plugin-content-docs/client').filterDocCardListItems(
|
||||
...args,
|
||||
);
|
||||
}
|
||||
export function useDocsPreferredVersion(...args: unknown[]): unknown {
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
return require('@docusaurus/plugin-content-docs/client').useDocsPreferredVersion(
|
||||
...args,
|
||||
);
|
||||
}
|
||||
|
||||
/*
|
||||
* APIs to document
|
||||
*/
|
||||
|
@ -32,13 +55,6 @@ export {
|
|||
listStorageKeys,
|
||||
} from './utils/storageUtils';
|
||||
|
||||
export {useContextualSearchFilters} from './utils/searchUtils';
|
||||
|
||||
export {
|
||||
useCurrentSidebarCategory,
|
||||
filterDocCardListItems,
|
||||
} from './utils/docsUtils';
|
||||
|
||||
export {usePluralForm} from './utils/usePluralForm';
|
||||
|
||||
export {useCollapsible, Collapsible} from './components/Collapsible';
|
||||
|
@ -89,8 +105,6 @@ export {duplicates, uniq, groupBy} from './utils/jsUtils';
|
|||
|
||||
export {usePrismTheme} from './hooks/usePrismTheme';
|
||||
|
||||
export {useDocsPreferredVersion} from './contexts/docsPreferredVersion';
|
||||
|
||||
export {processAdmonitionProps} from './utils/admonitionUtils';
|
||||
|
||||
export {
|
||||
|
|
|
@ -18,20 +18,6 @@
|
|||
// eslint-disable-next-line no-restricted-syntax
|
||||
export * from './index';
|
||||
|
||||
export {
|
||||
DocSidebarItemsExpandedStateProvider,
|
||||
useDocSidebarItemsExpandedState,
|
||||
} from './contexts/docSidebarItemsExpandedState';
|
||||
export {DocsVersionProvider, useDocsVersion} from './contexts/docsVersion';
|
||||
export {DocsSidebarProvider, useDocsSidebar} from './contexts/docsSidebar';
|
||||
|
||||
export {DocProvider, useDoc, type DocContextValue} from './contexts/doc';
|
||||
|
||||
export {
|
||||
useDocsPreferredVersionByPluginId,
|
||||
DocsPreferredVersionContextProvider,
|
||||
} from './contexts/docsPreferredVersion';
|
||||
|
||||
export {
|
||||
AnnouncementBarProvider,
|
||||
useAnnouncementBar,
|
||||
|
@ -54,22 +40,7 @@ export {
|
|||
containsLineNumbers,
|
||||
} from './utils/codeBlockUtils';
|
||||
|
||||
export {docVersionSearchTag, DEFAULT_SEARCH_TAG} from './utils/searchUtils';
|
||||
|
||||
export {
|
||||
isDocsPluginEnabled,
|
||||
useDocById,
|
||||
findSidebarCategory,
|
||||
findFirstSidebarItemLink,
|
||||
isActiveSidebarItem,
|
||||
isVisibleSidebarItem,
|
||||
useVisibleSidebarItems,
|
||||
useSidebarBreadcrumbs,
|
||||
useDocsVersionCandidates,
|
||||
useLayoutDoc,
|
||||
useLayoutDocsSidebar,
|
||||
useDocRootMetadata,
|
||||
} from './utils/docsUtils';
|
||||
export {DEFAULT_SEARCH_TAG} from './utils/searchUtils';
|
||||
|
||||
export {useTitleFormatter} from './utils/generalUtils';
|
||||
|
||||
|
|
|
@ -6,4 +6,3 @@
|
|||
*/
|
||||
|
||||
/// <reference types="@docusaurus/module-type-aliases" />
|
||||
/// <reference types="@docusaurus/plugin-content-docs" />
|
||||
|
|
|
@ -5,62 +5,4 @@
|
|||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
import {
|
||||
useAllDocsData,
|
||||
useActivePluginAndVersion,
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
|
||||
import {useDocsPreferredVersionByPluginId} from '../contexts/docsPreferredVersion';
|
||||
|
||||
export const DEFAULT_SEARCH_TAG = 'default';
|
||||
|
||||
/** The search tag to append as each doc's metadata. */
|
||||
export function docVersionSearchTag(
|
||||
pluginId: string,
|
||||
versionName: string,
|
||||
): string {
|
||||
return `docs-${pluginId}-${versionName}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the relevant context information for contextual search.
|
||||
*
|
||||
* The value is generic and not coupled to Algolia/DocSearch, since we may want
|
||||
* to support multiple search engines, or allowing users to use their own search
|
||||
* engine solution.
|
||||
*/
|
||||
export function useContextualSearchFilters(): {locale: string; tags: string[]} {
|
||||
const {i18n} = useDocusaurusContext();
|
||||
const allDocsData = useAllDocsData();
|
||||
const activePluginAndVersion = useActivePluginAndVersion();
|
||||
const docsPreferredVersionByPluginId = useDocsPreferredVersionByPluginId();
|
||||
|
||||
// This can't use more specialized hooks because we are mapping over all
|
||||
// plugin instances.
|
||||
function getDocPluginTags(pluginId: string) {
|
||||
const activeVersion =
|
||||
activePluginAndVersion?.activePlugin.pluginId === pluginId
|
||||
? activePluginAndVersion.activeVersion
|
||||
: undefined;
|
||||
|
||||
const preferredVersion = docsPreferredVersionByPluginId[pluginId];
|
||||
|
||||
const latestVersion = allDocsData[pluginId]!.versions.find(
|
||||
(v) => v.isLast,
|
||||
)!;
|
||||
|
||||
const version = activeVersion ?? preferredVersion ?? latestVersion;
|
||||
|
||||
return docVersionSearchTag(pluginId, version.name);
|
||||
}
|
||||
|
||||
const tags = [
|
||||
DEFAULT_SEARCH_TAG,
|
||||
...Object.keys(allDocsData).map(getDocPluginTags),
|
||||
];
|
||||
|
||||
return {
|
||||
locale: i18n.currentLocale,
|
||||
tags,
|
||||
};
|
||||
}
|
||||
|
|
|
@ -5,11 +5,20 @@
|
|||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
import {useContextualSearchFilters} from '@docusaurus/theme-common';
|
||||
import {DEFAULT_SEARCH_TAG} from '@docusaurus/theme-common/internal';
|
||||
import {useDocsContextualSearchTags} from '@docusaurus/plugin-content-docs/client';
|
||||
import useDocusaurusContext from '@docusaurus/core/src/client/exports/useDocusaurusContext';
|
||||
|
||||
// Translate search-engine agnostic search filters to Algolia search filters
|
||||
function useSearchTags() {
|
||||
// only docs have custom search tags per version
|
||||
const docsTags = useDocsContextualSearchTags();
|
||||
return [DEFAULT_SEARCH_TAG, ...docsTags];
|
||||
}
|
||||
|
||||
// Translate search-engine agnostic search tags to Algolia search filters
|
||||
export function useAlgoliaContextualFacetFilters(): [string, string[]] {
|
||||
const {locale, tags} = useContextualSearchFilters();
|
||||
const locale = useDocusaurusContext().i18n.currentLocale;
|
||||
const tags = useSearchTags();
|
||||
|
||||
// Seems safe to convert locale->language, see AlgoliaSearchMetadata comment
|
||||
const languageFilter = `language:${locale}`;
|
||||
|
|
|
@ -12,8 +12,10 @@ import React, {
|
|||
useRef,
|
||||
type ReactNode,
|
||||
} from 'react';
|
||||
import {useDocsPreferredVersion} from '@docusaurus/theme-common';
|
||||
import {useVersions} from '@docusaurus/plugin-content-docs/client';
|
||||
import {
|
||||
useVersions,
|
||||
useDocsPreferredVersion,
|
||||
} from '@docusaurus/plugin-content-docs/client';
|
||||
import Translate from '@docusaurus/Translate';
|
||||
import Link from '@docusaurus/Link';
|
||||
import CodeBlock from '@theme/CodeBlock';
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
import React from 'react';
|
||||
import {useLayoutDoc} from '@docusaurus/theme-common/internal';
|
||||
import {useLayoutDoc} from '@docusaurus/plugin-content-docs/client';
|
||||
import Link from '@docusaurus/Link';
|
||||
import Translate from '@docusaurus/Translate';
|
||||
import DocCategoryGeneratedIndexPage from '@theme-original/DocCategoryGeneratedIndexPage';
|
||||
|
|
Loading…
Add table
Reference in a new issue