diff --git a/packages/docusaurus-plugin-content-blog/package.json b/packages/docusaurus-plugin-content-blog/package.json index b3443bb34b3b..70c698ab9f08 100644 --- a/packages/docusaurus-plugin-content-blog/package.json +++ b/packages/docusaurus-plugin-content-blog/package.json @@ -40,6 +40,7 @@ "@docusaurus/utils-common": "3.9.2", "@docusaurus/utils-validation": "3.9.2", "cheerio": "1.0.0-rc.12", + "combine-promises": "^1.1.0", "feed": "^4.2.2", "fs-extra": "^11.1.1", "lodash": "^4.17.21", diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/feed.test.ts b/packages/docusaurus-plugin-content-blog/src/__tests__/feed.test.ts index b4f26041b365..9085b4a89365 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/feed.test.ts +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/feed.test.ts @@ -13,7 +13,10 @@ import { DEFAULT_VCS_CONFIG, } from '@docusaurus/utils'; import {fromPartial} from '@total-typescript/shoehorn'; -import {normalizePluginOptions} from '@docusaurus/utils-validation'; +import { + normalizePluginOptions, + getTagsFile, +} from '@docusaurus/utils-validation'; import tree from 'tree-node-cli'; import {DEFAULT_OPTIONS, validateOptions} from '../options'; import {generateBlogPosts} from '../blogUtils'; @@ -84,10 +87,13 @@ async function testGenerateFeeds( baseUrl: '/', }); + const tagsFile = await getTagsFile({contentPaths, tags: options.tags}); + const blogPosts = await generateBlogPosts( contentPaths, context, options, + tagsFile, authorsMap, ); diff --git a/packages/docusaurus-plugin-content-blog/src/blogUtils.ts b/packages/docusaurus-plugin-content-blog/src/blogUtils.ts index 8ebb7b928820..4c9b4c46e908 100644 --- a/packages/docusaurus-plugin-content-blog/src/blogUtils.ts +++ b/packages/docusaurus-plugin-content-blog/src/blogUtils.ts @@ -26,7 +26,7 @@ import { normalizeTags, aliasedSitePathToRelativePath, } from '@docusaurus/utils'; -import {getTagsFile} from '@docusaurus/utils-validation'; + import {validateBlogPostFrontMatter} from './frontMatter'; import {getBlogPostAuthors} from './authors'; import {reportAuthorsProblems} from './authorsProblems'; @@ -388,6 +388,7 @@ export async function generateBlogPosts( contentPaths: BlogContentPaths, context: LoadContext, options: PluginOptions, + tagsFile: TagsFile | null, authorsMap?: AuthorsMap, ): Promise { const {include, exclude} = options; @@ -401,10 +402,6 @@ export async function generateBlogPosts( ignore: exclude, }); - // TODO this should be done outside of this function - // directly in plugin loadContent() - const tagsFile = await getTagsFile({contentPaths, tags: options.tags}); - async function doProcessBlogSourceFile(blogSourceFile: string) { try { return await processBlogSourceFile( diff --git a/packages/docusaurus-plugin-content-blog/src/index.ts b/packages/docusaurus-plugin-content-blog/src/index.ts index 7037731add1f..53fe1a5a05f0 100644 --- a/packages/docusaurus-plugin-content-blog/src/index.ts +++ b/packages/docusaurus-plugin-content-blog/src/index.ts @@ -7,6 +7,8 @@ import path from 'path'; import logger from '@docusaurus/logger'; +import combinePromises from 'combine-promises'; + import { normalizeUrl, docuHash, @@ -20,7 +22,10 @@ import { resolveMarkdownLinkPathname, getLocaleConfig, } from '@docusaurus/utils'; -import {getTagsFilePathsToWatch} from '@docusaurus/utils-validation'; +import { + getTagsFilePathsToWatch, + getTagsFile, +} from '@docusaurus/utils-validation'; import {createMDXLoaderItem} from '@docusaurus/mdx-loader'; import { getBlogTags, @@ -227,22 +232,32 @@ export default async function pluginContentBlog( const baseBlogUrl = normalizeUrl([baseUrl, routeBasePath]); const blogTagsListPath = normalizeUrl([baseBlogUrl, tagsBasePath]); - const authorsMap = await getAuthorsMap({ - contentPaths, - authorsMapPath, - authorsBaseRoutePath: normalizeUrl([ + async function getAuthorsMapChecked() { + const result = await getAuthorsMap({ + contentPaths, + authorsMapPath, + authorsBaseRoutePath: normalizeUrl([ + baseUrl, + routeBasePath, + authorsBasePath, + ]), baseUrl, - routeBasePath, - authorsBasePath, - ]), - baseUrl, + }); + checkAuthorsMapPermalinkCollisions(result); + return result; + } + + // Read all the input files in parallel + const {authorsMap, tagsFile} = await combinePromises({ + authorsMap: getAuthorsMapChecked(), + tagsFile: getTagsFile({contentPaths, tags: options.tags}), }); - checkAuthorsMapPermalinkCollisions(authorsMap); let blogPosts = await generateBlogPosts( contentPaths, context, options, + tagsFile, authorsMap, ); blogPosts = await applyProcessBlogPosts({