From a697f1de960fdecc527567a4c2557c56985500c7 Mon Sep 17 00:00:00 2001 From: garry00107 Date: Sun, 1 Feb 2026 18:35:23 +0530 Subject: [PATCH 1/2] refactor(content-blog): decouple getTagsFile from generateBlogPosts --- .../src/__tests__/feed.test.ts | 8 +++++++- packages/docusaurus-plugin-content-blog/src/blogUtils.ts | 7 ++----- packages/docusaurus-plugin-content-blog/src/index.ts | 7 ++++++- 3 files changed, 15 insertions(+), 7 deletions(-) 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..c3fb35fae6a8 100644 --- a/packages/docusaurus-plugin-content-blog/src/index.ts +++ b/packages/docusaurus-plugin-content-blog/src/index.ts @@ -20,7 +20,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, @@ -239,10 +242,12 @@ export default async function pluginContentBlog( }); checkAuthorsMapPermalinkCollisions(authorsMap); + const tagsFile = await getTagsFile({contentPaths, tags: options.tags}); let blogPosts = await generateBlogPosts( contentPaths, context, options, + tagsFile, authorsMap, ); blogPosts = await applyProcessBlogPosts({ From 642014077a99bb9d3ec1b5da0255a6a50e480dee Mon Sep 17 00:00:00 2001 From: sebastien Date: Fri, 6 Feb 2026 12:09:59 +0100 Subject: [PATCH 2/2] read blog authors/tags in parallel --- .../package.json | 1 + .../src/index.ts | 30 ++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) 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/index.ts b/packages/docusaurus-plugin-content-blog/src/index.ts index c3fb35fae6a8..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, @@ -230,19 +232,27 @@ 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); - const tagsFile = await getTagsFile({contentPaths, tags: options.tags}); let blogPosts = await generateBlogPosts( contentPaths, context,