From 64909e7f1412d2f3e0cf5943e9cfe349476de69e Mon Sep 17 00:00:00 2001 From: Joshua Chen Date: Sat, 22 Jan 2022 13:36:56 +0800 Subject: [PATCH] fix(content-docs): make getActivePlugin match plugin paths more exactly (#6435) * fix(content-docs): make getActivePlugin match plugin IDs more exactly * refactor... --- .../client/__tests__/docsClientUtils.test.ts | 35 +++++++++++++++++-- .../src/client/docsClientUtils.ts | 19 +++++----- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/packages/docusaurus-plugin-content-docs/src/client/__tests__/docsClientUtils.test.ts b/packages/docusaurus-plugin-content-docs/src/client/__tests__/docsClientUtils.test.ts index ba7c2f86d9..0a414d4749 100644 --- a/packages/docusaurus-plugin-content-docs/src/client/__tests__/docsClientUtils.test.ts +++ b/packages/docusaurus-plugin-content-docs/src/client/__tests__/docsClientUtils.test.ts @@ -6,14 +6,17 @@ */ import { - type ActivePlugin, getActivePlugin, getLatestVersion, getActiveDocContext, getActiveVersion, getDocVersionSuggestions, } from '../docsClientUtils'; -import type {GlobalPluginData, GlobalVersion} from '../../types'; +import type { + GlobalPluginData, + GlobalVersion, + ActivePlugin, +} from '@docusaurus/plugin-content-docs/client'; import {shuffle} from 'lodash'; describe('docsClientUtils', () => { @@ -58,6 +61,34 @@ describe('docsClientUtils', () => { expect(getActivePlugin(data, '/android')).toEqual(activePluginAndroid); expect(getActivePlugin(data, '/android/')).toEqual(activePluginAndroid); expect(getActivePlugin(data, '/android/ijk')).toEqual(activePluginAndroid); + + // https://github.com/facebook/docusaurus/issues/6434 + const onePluginAtRoot = { + pluginIosId: { + path: '/', + versions: [], + }, + pluginAndroidId: { + path: '/android', + versions: [], + }, + }; + expect(getActivePlugin(onePluginAtRoot, '/android/foo').pluginId).toEqual( + 'pluginAndroidId', + ); + const onePluginAtRootReversed = { + pluginAndroidId: { + path: '/android', + versions: [], + }, + pluginIosId: { + path: '/', + versions: [], + }, + }; + expect( + getActivePlugin(onePluginAtRootReversed, '/android/foo').pluginId, + ).toEqual('pluginAndroidId'); }); test('getLatestVersion', () => { diff --git a/packages/docusaurus-plugin-content-docs/src/client/docsClientUtils.ts b/packages/docusaurus-plugin-content-docs/src/client/docsClientUtils.ts index 3bfadef48c..3af5af23ae 100644 --- a/packages/docusaurus-plugin-content-docs/src/client/docsClientUtils.ts +++ b/packages/docusaurus-plugin-content-docs/src/client/docsClientUtils.ts @@ -27,14 +27,17 @@ export function getActivePlugin( pathname: string, options: GetActivePluginOptions = {}, ): ActivePlugin | undefined { - const activeEntry = Object.entries(allPluginDatas).find( - ([_id, pluginData]) => - !!matchPath(pathname, { - path: pluginData.path, - exact: false, - strict: false, - }), - ); + const activeEntry = Object.entries(allPluginDatas) + // A quick route sorting: '/android/foo' should match '/android' instead of '/' + .sort((a, b) => b[1].path.localeCompare(a[1].path)) + .find( + ([, pluginData]) => + !!matchPath(pathname, { + path: pluginData.path, + exact: false, + strict: false, + }), + ); const activePlugin: ActivePlugin | undefined = activeEntry ? {pluginId: activeEntry[0], pluginData: activeEntry[1]}