From 653cc5db5b6c962813b2eab5a13048e77ac4a300 Mon Sep 17 00:00:00 2001 From: slorber Date: Wed, 16 Jun 2021 12:50:09 +0200 Subject: [PATCH] fix(v2): navbar doc item should allow older versions to not contain the target doc, as long as the lastVersion contains it --- .../src/plugin-content-docs.d.ts | 5 +++ .../src/theme/NavbarItem/DocNavbarItem.tsx | 40 ++++++++++++++----- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/packages/docusaurus-plugin-content-docs/src/plugin-content-docs.d.ts b/packages/docusaurus-plugin-content-docs/src/plugin-content-docs.d.ts index abef806debfb..aa7d299eb868 100644 --- a/packages/docusaurus-plugin-content-docs/src/plugin-content-docs.d.ts +++ b/packages/docusaurus-plugin-content-docs/src/plugin-content-docs.d.ts @@ -43,6 +43,11 @@ declare module '@docusaurus/plugin-content-docs-types' { export type PropSidebars = { [sidebarId: string]: PropSidebarItem[]; }; + + export type { + GlobalVersion as GlobalDataVersion, + GlobalDoc as GlobalDataDoc, + } from './types'; } declare module '@theme/DocItem' { diff --git a/packages/docusaurus-theme-classic/src/theme/NavbarItem/DocNavbarItem.tsx b/packages/docusaurus-theme-classic/src/theme/NavbarItem/DocNavbarItem.tsx index 8fc176341c61..521fccd9426a 100644 --- a/packages/docusaurus-theme-classic/src/theme/NavbarItem/DocNavbarItem.tsx +++ b/packages/docusaurus-theme-classic/src/theme/NavbarItem/DocNavbarItem.tsx @@ -11,6 +11,29 @@ import {useLatestVersion, useActiveDocContext} from '@theme/hooks/useDocs'; import clsx from 'clsx'; import type {Props} from '@theme/NavbarItem/DocNavbarItem'; import {useDocsPreferredVersion} from '@docusaurus/theme-common'; +import type { + GlobalDataVersion, + GlobalDataDoc, +} from '@docusaurus/plugin-content-docs-types'; + +function getDocInVersions(versions: GlobalDataVersion[], docId: string) { + // vanilla-js flatten, TODO replace soon by ES flat() / flatMap() + const allDocs: GlobalDataDoc[] = [].concat( + ...versions.map((version) => version.docs), + ); + + const doc = allDocs.find((versionDoc) => versionDoc.id === docId); + if (!doc) { + const docIds = allDocs.map((versionDoc) => versionDoc.id).join('\n- '); + throw new Error( + `DocNavbarItem: couldn't find any doc with id "${docId}" in version${ + versions.length ? 's' : '' + } ${versions.map((version) => version.name).join(', ')}". +Available doc ids are:\n- ${docIds}`, + ); + } + return doc; +} export default function DocNavbarItem({ docId, @@ -23,16 +46,13 @@ export default function DocNavbarItem({ const {preferredVersion} = useDocsPreferredVersion(docsPluginId); const latestVersion = useLatestVersion(docsPluginId); - const version = activeVersion ?? preferredVersion ?? latestVersion; - - const doc = version.docs.find((versionDoc) => versionDoc.id === docId); - if (!doc) { - const docIds = version.docs.map((versionDoc) => versionDoc.id).join('\n- '); - throw new Error( - `DocNavbarItem: couldn't find any doc with "${docId}" id in version "${version.name}". -Available doc ids:\n- ${docIds}`, - ); - } + // Versions used to look for the doc to link to, ordered + no duplicate + const versions: GlobalDataVersion[] = [ + ...new Set( + [activeVersion, preferredVersion, latestVersion].filter(Boolean), + ), + ]; + const doc = getDocInVersions(versions, docId); return (