Skip to content

Commit

Permalink
feat(docs): allow to configure noIndex per doc version (#7963)
Browse files Browse the repository at this point in the history
  • Loading branch information
slorber committed Sep 1, 2022
1 parent c458f28 commit 5edb652
Show file tree
Hide file tree
Showing 12 changed files with 103 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -901,6 +901,7 @@ exports[`simple website content: data 1`] = `
"label": "Next",
"banner": null,
"badge": false,
"noIndex": false,
"className": "docs-version-current",
"isLast": true,
"docsSidebars": {
Expand Down Expand Up @@ -2608,6 +2609,7 @@ exports[`versioned website (community) content: data 1`] = `
"label": "1.0.0",
"banner": null,
"badge": true,
"noIndex": false,
"className": "docs-version-1.0.0",
"isLast": true,
"docsSidebars": {
Expand Down Expand Up @@ -2635,6 +2637,7 @@ exports[`versioned website (community) content: data 1`] = `
"label": "Next",
"banner": "unreleased",
"badge": true,
"noIndex": false,
"className": "docs-version-current",
"isLast": false,
"docsSidebars": {
Expand Down Expand Up @@ -3477,6 +3480,7 @@ exports[`versioned website content: data 1`] = `
"label": "1.0.0",
"banner": "unmaintained",
"badge": true,
"noIndex": false,
"className": "docs-version-1.0.0",
"isLast": false,
"docsSidebars": {
Expand Down Expand Up @@ -3544,6 +3548,7 @@ exports[`versioned website content: data 1`] = `
"label": "1.0.1",
"banner": null,
"badge": true,
"noIndex": true,
"className": "docs-version-1.0.1",
"isLast": true,
"docsSidebars": {
Expand Down Expand Up @@ -3599,6 +3604,7 @@ exports[`versioned website content: data 1`] = `
"label": "Next",
"banner": "unreleased",
"badge": true,
"noIndex": false,
"className": "docs-version-current",
"isLast": false,
"docsSidebars": {
Expand Down Expand Up @@ -3674,6 +3680,7 @@ exports[`versioned website content: data 1`] = `
"label": "withSlugs",
"banner": "unmaintained",
"badge": true,
"noIndex": false,
"className": "docs-version-withSlugs",
"isLast": false,
"docsSidebars": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,11 @@ describe('versioned website', () => {
options: {
routeBasePath,
sidebarPath,
versions: {
'1.0.1': {
noIndex: true,
},
},
},
});
const plugin = await pluginContentDocs(context, options);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ describe('normalizeDocsPluginOptions', () => {
version1: {
path: 'hello',
label: 'world',
noIndex: true,
},
},
sidebarCollapsible: false,
Expand Down
1 change: 1 addition & 0 deletions packages/docusaurus-plugin-content-docs/src/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ const VersionOptionsSchema = Joi.object({
banner: Joi.string().equal('none', 'unreleased', 'unmaintained').optional(),
badge: Joi.boolean().optional(),
className: Joi.string().optional(),
noIndex: Joi.boolean().optional(),
});

const VersionsOptionsSchema = Joi.object()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,25 @@ declare module '@docusaurus/plugin-content-docs' {
// TODO support custom version banner?
// {type: "error", content: "html content"}
export type VersionBanner = 'unreleased' | 'unmaintained';

export type VersionOptions = {
/**
* The base path of the version, will be appended to `baseUrl` +
* `routeBasePath`.
*/
path?: string;
/** The label of the version to be used in badges, dropdowns, etc. */
label?: string;
/** The banner to show at the top of a doc of that version. */
banner?: 'none' | VersionBanner;
/** Show a badge with the version label at the top of each doc. */
badge?: boolean;
/** Prevents search engines from indexing this version */
noIndex?: boolean;
/** Add a custom class name to the <html> element of each doc. */
className?: string;
};

export type VersionsOptions = {
/**
* The version navigated to in priority and displayed by default for docs
Expand All @@ -144,23 +163,7 @@ declare module '@docusaurus/plugin-content-docs' {
/** Include the current version of your docs. */
includeCurrentVersion: boolean;
/** Independent customization of each version's properties. */
versions: {
[versionName: string]: {
/**
* The base path of the version, will be appended to `baseUrl` +
* `routeBasePath`.
*/
path?: string;
/** The label of the version to be used in badges, dropdowns, etc. */
label?: string;
/** The banner to show at the top of a doc of that version. */
banner?: 'none' | VersionBanner;
/** Show a badge with the version label at the top of each doc. */
badge?: boolean;
/** Add a custom class name to the <html> element of each doc. */
className?: string;
};
};
versions: {[versionName: string]: VersionOptions};
};
export type SidebarOptions = {
/**
Expand Down Expand Up @@ -263,6 +266,8 @@ declare module '@docusaurus/plugin-content-docs' {
banner: VersionBanner | null;
/** Show a badge with the version label at the top of each doc. */
badge: boolean;
/** Prevents search engines from indexing this version */
noIndex: boolean;
/** Add a custom class name to the <html> element of each doc. */
className: string;
/**
Expand Down Expand Up @@ -500,7 +505,7 @@ declare module '@docusaurus/plugin-content-docs' {

export type PropVersionMetadata = Pick<
VersionMetadata,
'label' | 'banner' | 'badge' | 'className' | 'isLast'
'label' | 'banner' | 'badge' | 'className' | 'isLast' | 'noIndex'
> & {
/** ID of the docs plugin this version belongs to. */
pluginId: string;
Expand Down
1 change: 1 addition & 0 deletions packages/docusaurus-plugin-content-docs/src/props.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ export function toVersionMetadataProp(
label: loadedVersion.label,
banner: loadedVersion.banner,
badge: loadedVersion.badge,
noIndex: loadedVersion.noIndex,
className: loadedVersion.className,
isLast: loadedVersion.isLast,
docsSidebars: toSidebarsProp(loadedVersion),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ describe('readVersionsMetadata', () => {
path: '/docs',
banner: null,
badge: false,
noIndex: false,
className: 'docs-version-current',
};
return {simpleSiteDir, defaultOptions, defaultContext, vCurrent};
Expand Down Expand Up @@ -218,6 +219,7 @@ describe('readVersionsMetadata', () => {
path: '/docs/next',
banner: 'unreleased',
badge: true,
noIndex: false,
className: 'docs-version-current',
};

Expand All @@ -242,6 +244,7 @@ describe('readVersionsMetadata', () => {
path: '/docs',
banner: null,
badge: true,
noIndex: false,
className: 'docs-version-1.0.1',
};

Expand All @@ -266,6 +269,7 @@ describe('readVersionsMetadata', () => {
path: '/docs/1.0.0',
banner: 'unmaintained',
badge: true,
noIndex: false,
className: 'docs-version-1.0.0',
};

Expand All @@ -290,6 +294,7 @@ describe('readVersionsMetadata', () => {
path: '/docs/withSlugs',
banner: 'unmaintained',
badge: true,
noIndex: false,
className: 'docs-version-withSlugs',
};

Expand Down Expand Up @@ -657,6 +662,7 @@ describe('readVersionsMetadata', () => {
path: '/communityBasePath/next',
banner: 'unreleased',
badge: true,
noIndex: false,
className: 'docs-version-current',
};

Expand All @@ -681,6 +687,7 @@ describe('readVersionsMetadata', () => {
path: '/communityBasePath',
banner: null,
badge: true,
noIndex: false,
className: 'docs-version-1.0.0',
};

Expand Down
8 changes: 8 additions & 0 deletions packages/docusaurus-plugin-content-docs/src/versions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,13 @@ export function getVersionBadge({
return options.versions[versionName]?.badge ?? defaultVersionBadge;
}

export function getVersionNoIndex({
versionName,
options,
}: VersionContext): VersionMetadata['noIndex'] {
return options.versions[versionName]?.noIndex ?? false;
}

function getVersionClassName({
versionName,
options,
Expand Down Expand Up @@ -179,6 +186,7 @@ async function createVersionMetadata(
label: getVersionLabel(context),
banner: getVersionBanner(context),
badge: getVersionBadge(context),
noIndex: getVersionNoIndex(context),
className: getVersionClassName(context),
path: routePath,
tagsPath: normalizeUrl([routePath, options.tagsBasePath]),
Expand Down
32 changes: 25 additions & 7 deletions packages/docusaurus-theme-classic/src/theme/DocPage/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@

import React from 'react';
import clsx from 'clsx';
import {HtmlClassNameProvider, ThemeClassNames} from '@docusaurus/theme-common';
import {
HtmlClassNameProvider,
ThemeClassNames,
PageMetadata,
} from '@docusaurus/theme-common';
import {
docVersionSearchTag,
DocsSidebarProvider,
Expand All @@ -19,13 +23,8 @@ import NotFound from '@theme/NotFound';
import SearchMetadata from '@theme/SearchMetadata';
import type {Props} from '@theme/DocPage';

export default function DocPage(props: Props): JSX.Element {
function DocPageMetadata(props: Props): JSX.Element {
const {versionMetadata} = props;
const currentDocRouteMetadata = useDocRouteMetadata(props);
if (!currentDocRouteMetadata) {
return <NotFound />;
}
const {docElement, sidebarName, sidebarItems} = currentDocRouteMetadata;
return (
<>
<SearchMetadata
Expand All @@ -35,6 +34,25 @@ export default function DocPage(props: Props): JSX.Element {
versionMetadata.version,
)}
/>
<PageMetadata>
{versionMetadata.noIndex && (
<meta name="robots" content="noindex, nofollow" />
)}
</PageMetadata>
</>
);
}

export default function DocPage(props: Props): JSX.Element {
const {versionMetadata} = props;
const currentDocRouteMetadata = useDocRouteMetadata(props);
if (!currentDocRouteMetadata) {
return <NotFound />;
}
const {docElement, sidebarName, sidebarItems} = currentDocRouteMetadata;
return (
<>
<DocPageMetadata {...props} />
<HtmlClassNameProvider
className={clsx(
// TODO: it should be removed from here
Expand Down
5 changes: 5 additions & 0 deletions website/_dogfooding/dogfooding.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ const dogfoodingPluginInstances = [
id: 'docs-tests',
routeBasePath: '/tests/docs',
sidebarPath: '_dogfooding/docs-tests-sidebars.js',
versions: {
current: {
noIndex: true,
},
},

// Using a _ prefix to test against an edge case regarding MDX partials: https://github.com/facebook/docusaurus/discussions/5181#discussioncomment-1018079
path: '_dogfooding/_docs tests',
Expand Down
34 changes: 18 additions & 16 deletions website/docs/api/plugins/plugin-content-docs.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,23 +142,25 @@ type CategoryIndexMatcher = (param: {
#### `VersionsConfig` {#VersionsConfig}

```ts
type VersionsConfig = {
[versionName: string]: {
/**
* The base path of the version, will be appended to `baseUrl` +
* `routeBasePath`.
*/
path?: string;
/** The label of the version to be used in badges, dropdowns, etc. */
label?: string;
/** The banner to show at the top of a doc of that version. */
banner?: 'none' | 'unreleased' | 'unmaintained';
/** Show a badge with the version label at the top of each doc. */
badge?: boolean;
/** Add a custom class name to the <html> element of each doc */
className?: string;
};
type VersionConfig = {
/**
* The base path of the version, will be appended to `baseUrl` +
* `routeBasePath`.
*/
path?: string;
/** The label of the version to be used in badges, dropdowns, etc. */
label?: string;
/** The banner to show at the top of a doc of that version. */
banner?: 'none' | 'unreleased' | 'unmaintained';
/** Show a badge with the version label at the top of each doc. */
badge?: boolean;
/** Prevents search engines from indexing this version */
noIndex?: boolean;
/** Add a custom class name to the <html> element of each doc */
className?: string;
};

type VersionsConfig = {[versionName: string]: VersionConfig};
```

### Example configuration {#ex-config}
Expand Down
3 changes: 2 additions & 1 deletion website/docusaurus.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,8 @@ const config = {
}
: undefined,
sitemap: {
ignorePatterns: ['/tests/**'],
// Note: /tests/docs already has noIndex: true
ignorePatterns: ['/tests/{blog,pages}/**'],
},
}),
],
Expand Down

0 comments on commit 5edb652

Please sign in to comment.