fix(sitemap): complete gracefully when all pages have noIndex meta (#7774)

This commit is contained in:
Joshua Chen 2022-07-14 08:59:01 +08:00 committed by GitHub
parent 665c3117af
commit c3d2e0d30b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 47 additions and 5 deletions

View file

@ -172,4 +172,39 @@ describe('createSitemap', () => {
expect(sitemap).not.toContain('/noindex');
});
it('does not generate anything for all pages with noindex', async () => {
const sitemap = await createSitemap(
{
url: 'https://example.com',
trailingSlash: false,
} as DocusaurusConfig,
['/', '/noindex'],
{
'/': {
meta: {
// @ts-expect-error: bad lib def
toComponent: () => [
React.createElement('meta', {name: 'robots', content: 'noindex'}),
],
},
},
'/noindex': {
meta: {
// @ts-expect-error: bad lib def
toComponent: () => [
React.createElement('meta', {name: 'robots', content: 'noindex'}),
],
},
},
},
{
changefreq: EnumChangefreq.DAILY,
priority: 0.7,
ignorePatterns: [],
},
);
expect(sitemap).toBeNull();
});
});

View file

@ -18,7 +18,7 @@ export default async function createSitemap(
routesPaths: string[],
head: {[location: string]: HelmetServerState},
options: PluginOptions,
): Promise<string> {
): Promise<string | null> {
const {url: hostname} = siteConfig;
if (!hostname) {
throw new Error('URL in docusaurus.config.js cannot be empty/undefined.');
@ -27,9 +27,7 @@ export default async function createSitemap(
const ignoreMatcher = createMatcher(ignorePatterns);
const sitemapStream = new SitemapStream({hostname});
function routeShouldBeIncluded(route: string) {
const includedRoutes = routesPaths.filter((route) => {
if (route.endsWith('404.html') || ignoreMatcher(route)) {
return false;
}
@ -40,9 +38,15 @@ export default async function createSitemap(
return !meta?.some(
(tag) => tag.props.name === 'robots' && tag.props.content === 'noindex',
);
});
if (includedRoutes.length === 0) {
return null;
}
routesPaths.filter(routeShouldBeIncluded).forEach((routePath) =>
const sitemapStream = new SitemapStream({hostname});
includedRoutes.forEach((routePath) =>
sitemapStream.write({
url: applyTrailingSlash(routePath, {
trailingSlash: siteConfig.trailingSlash,

View file

@ -30,6 +30,9 @@ export default function pluginSitemap(
head,
options,
);
if (!generatedSitemap) {
return;
}
// Write sitemap file.
const sitemapPath = path.join(outDir, options.filename);