feat(sitemap): remove trailingSlash option; respect noIndex config (#6248)

This commit is contained in:
Joshua Chen 2022-01-06 00:56:17 +08:00 committed by GitHub
parent 37b70e3ab4
commit 8fe1ddf46a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 23 additions and 57 deletions

View file

@ -19,7 +19,6 @@ describe('createSitemap', () => {
{ {
changefreq: EnumChangefreq.DAILY, changefreq: EnumChangefreq.DAILY,
priority: 0.7, priority: 0.7,
trailingSlash: false,
}, },
); );
expect(sitemap).toContain( expect(sitemap).toContain(
@ -43,7 +42,6 @@ describe('createSitemap', () => {
{ {
changefreq: EnumChangefreq.DAILY, changefreq: EnumChangefreq.DAILY,
priority: 0.7, priority: 0.7,
trailingSlash: false,
}, },
); );
expect(sitemap).not.toContain('404'); expect(sitemap).not.toContain('404');
@ -105,23 +103,4 @@ describe('createSitemap', () => {
expect(sitemap).toContain('<loc>https://example.com/nested/test</loc>'); expect(sitemap).toContain('<loc>https://example.com/nested/test</loc>');
expect(sitemap).toContain('<loc>https://example.com/nested/test2</loc>'); expect(sitemap).toContain('<loc>https://example.com/nested/test2</loc>');
}); });
test('add trailing slash (deprecated plugin option)', async () => {
const sitemap = await createSitemap(
{
url: 'https://example.com',
} as DocusaurusConfig,
['/', '/test', '/nested/test', '/nested/test2/'],
{
changefreq: EnumChangefreq.DAILY,
priority: 0.7,
trailingSlash: true,
},
);
expect(sitemap).toContain('<loc>https://example.com/</loc>');
expect(sitemap).toContain('<loc>https://example.com/test/</loc>');
expect(sitemap).toContain('<loc>https://example.com/nested/test/</loc>');
expect(sitemap).toContain('<loc>https://example.com/nested/test2/</loc>');
});
}); });

View file

@ -28,15 +28,9 @@ describe('normalizeSitemapPluginOptions', () => {
const userOptions = { const userOptions = {
changefreq: 'yearly', changefreq: 'yearly',
priority: 0.9, priority: 0.9,
trailingSlash: false,
}; };
const {value, warning} = await PluginOptionSchema.validate(userOptions); const {value} = await PluginOptionSchema.validate(userOptions);
expect(value).toEqual(userOptions); expect(value).toEqual(userOptions);
expect(warning?.details?.length).toEqual(1);
expect(warning?.details[0].message).toMatchInlineSnapshot(
`"Option \\"trailingSlash\\" of the sitemap plugin is deprecated: Please use the new Docusaurus global trailingSlash config instead, and the sitemaps plugin will use it."`,
);
}); });
test('should reject out-of-range priority inputs', () => { test('should reject out-of-range priority inputs', () => {

View file

@ -8,7 +8,6 @@
import {SitemapStream, streamToPromise} from 'sitemap'; import {SitemapStream, streamToPromise} from 'sitemap';
import type {Options} from '@docusaurus/plugin-sitemap'; import type {Options} from '@docusaurus/plugin-sitemap';
import type {DocusaurusConfig} from '@docusaurus/types'; import type {DocusaurusConfig} from '@docusaurus/types';
import {addTrailingSlash} from '@docusaurus/utils';
import {applyTrailingSlash} from '@docusaurus/utils-common'; import {applyTrailingSlash} from '@docusaurus/utils-common';
export default async function createSitemap( export default async function createSitemap(
@ -22,28 +21,16 @@ export default async function createSitemap(
} }
const {changefreq, priority} = options; const {changefreq, priority} = options;
const sitemapStream = new SitemapStream({ const sitemapStream = new SitemapStream({hostname});
hostname,
});
function applySitemapTrailingSlash(routePath: string): string {
// kept for retrocompatibility
// TODO remove deprecated trailingSlash option before 2022
if (options.trailingSlash) {
return addTrailingSlash(routePath);
} else {
return applyTrailingSlash(routePath, {
trailingSlash: siteConfig.trailingSlash,
baseUrl: siteConfig.baseUrl,
});
}
}
routesPaths routesPaths
.filter((route) => !route.endsWith('404.html')) .filter((route) => !route.endsWith('404.html'))
.map((routePath) => .forEach((routePath) =>
sitemapStream.write({ sitemapStream.write({
url: applySitemapTrailingSlash(routePath), url: applyTrailingSlash(routePath, {
trailingSlash: siteConfig.trailingSlash,
baseUrl: siteConfig.baseUrl,
}),
changefreq, changefreq,
priority, priority,
}), }),
@ -51,9 +38,7 @@ export default async function createSitemap(
sitemapStream.end(); sitemapStream.end();
const generatedSitemap = await streamToPromise(sitemapStream).then((sm) => const generatedSitemap = (await streamToPromise(sitemapStream)).toString();
sm.toString(),
);
return generatedSitemap; return generatedSitemap;
} }

View file

@ -26,6 +26,9 @@ export default function pluginSitemap(
name: 'docusaurus-plugin-sitemap', name: 'docusaurus-plugin-sitemap',
async postBuild({siteConfig, routesPaths, outDir}: Props) { async postBuild({siteConfig, routesPaths, outDir}: Props) {
if (siteConfig.noIndex) {
return;
}
// Generate sitemap. // Generate sitemap.
const generatedSitemap = await createSitemap( const generatedSitemap = await createSitemap(
siteConfig, siteConfig,

View file

@ -10,5 +10,4 @@ import type {EnumChangefreq} from 'sitemap';
export type Options = { export type Options = {
changefreq?: EnumChangefreq; changefreq?: EnumChangefreq;
priority?: number; priority?: number;
trailingSlash?: boolean;
}; };

View file

@ -12,7 +12,6 @@ import type {Options} from '@docusaurus/plugin-sitemap';
export const DEFAULT_OPTIONS: Required<Options> = { export const DEFAULT_OPTIONS: Required<Options> = {
changefreq: EnumChangefreq.WEEKLY, changefreq: EnumChangefreq.WEEKLY,
priority: 0.5, priority: 0.5,
trailingSlash: false,
}; };
export const PluginOptionSchema = Joi.object({ export const PluginOptionSchema = Joi.object({
@ -25,10 +24,8 @@ export const PluginOptionSchema = Joi.object({
.valid(...Object.values(EnumChangefreq)) .valid(...Object.values(EnumChangefreq))
.default(DEFAULT_OPTIONS.changefreq), .default(DEFAULT_OPTIONS.changefreq),
priority: Joi.number().min(0).max(1).default(DEFAULT_OPTIONS.priority), priority: Joi.number().min(0).max(1).default(DEFAULT_OPTIONS.priority),
trailingSlash: Joi.bool().default(false).warning('deprecate.error', { trailingSlash: Joi.forbidden().messages({
msg: 'Please use the new Docusaurus global trailingSlash config instead, and the sitemaps plugin will use it.', 'any.unknown':
'Please use the new Docusaurus global trailingSlash config instead, and the sitemaps plugin will use it.',
}), }),
}).messages({
'deprecate.error':
'Option {#label} of the sitemap plugin is deprecated: {#msg}',
}); });

View file

@ -42,6 +42,15 @@ Accepted fields:
</APITable> </APITable>
:::info
This plugin also respects some site config:
- [`noIndex`](../docusaurus.config.js.md#noindex): results in no sitemap generated
- [`trailingSlash`](../docusaurus.config.js.md#trailing-slash): determines if the URLs in the sitemap have trailing slashes
:::
### Example configuration {#ex-config} ### Example configuration {#ex-config}
You can configure this plugin through preset options or plugin options. You can configure this plugin through preset options or plugin options.