diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.ts b/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.ts index 0aa725b0bf..35f7431905 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.ts +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.ts @@ -394,4 +394,15 @@ describe('loadBlog', () => { truncated: false, }); }); + + test('test ascending sort direction of blog post', async () => { + const siteDir = path.join(__dirname, '__fixtures__', 'website'); + const normalOrder = await getBlogPosts(siteDir); + const reversedOrder = await getBlogPosts(siteDir, { + sortPosts: 'ascending', + }); + expect(normalOrder.reverse().map((x) => x.metadata.date)).toEqual( + reversedOrder.map((x) => x.metadata.date), + ); + }); }); diff --git a/packages/docusaurus-plugin-content-blog/src/blogUtils.ts b/packages/docusaurus-plugin-content-blog/src/blogUtils.ts index 39c98ecea3..7d250d4d1d 100644 --- a/packages/docusaurus-plugin-content-blog/src/blogUtils.ts +++ b/packages/docusaurus-plugin-content-blog/src/blogUtils.ts @@ -294,6 +294,9 @@ export async function generateBlogPosts( (a, b) => b.metadata.date.getTime() - a.metadata.date.getTime(), ); + if (options.sortPosts === 'ascending') { + return blogPosts.reverse(); + } return blogPosts; } diff --git a/packages/docusaurus-plugin-content-blog/src/pluginOptionSchema.ts b/packages/docusaurus-plugin-content-blog/src/pluginOptionSchema.ts index 00ede624e0..e231ea36bf 100644 --- a/packages/docusaurus-plugin-content-blog/src/pluginOptionSchema.ts +++ b/packages/docusaurus-plugin-content-blog/src/pluginOptionSchema.ts @@ -42,6 +42,7 @@ export const DEFAULT_OPTIONS: PluginOptions = { editLocalizedFiles: false, authorsMapPath: 'authors.yml', readingTime: ({content, defaultReadingTime}) => defaultReadingTime({content}), + sortPosts: 'descending', }; export const PluginOptionSchema = Joi.object({ @@ -115,4 +116,7 @@ export const PluginOptionSchema = Joi.object({ }).default(DEFAULT_OPTIONS.feedOptions), authorsMapPath: Joi.string().default(DEFAULT_OPTIONS.authorsMapPath), readingTime: Joi.function().default(() => DEFAULT_OPTIONS.readingTime), + sortPosts: Joi.string() + .valid('descending', 'ascending') + .default(DEFAULT_OPTIONS.sortPosts), }); diff --git a/packages/docusaurus-plugin-content-blog/src/types.ts b/packages/docusaurus-plugin-content-blog/src/types.ts index e8990d5437..15d129bcca 100644 --- a/packages/docusaurus-plugin-content-blog/src/types.ts +++ b/packages/docusaurus-plugin-content-blog/src/types.ts @@ -96,6 +96,7 @@ export type PluginOptions = RemarkAndRehypePluginOptions & { admonitions: Record; authorsMapPath: string; readingTime: ReadingTimeFunctionOption; + sortPosts: 'ascending' | 'descending'; }; // Options, as provided in the user config (before normalization) diff --git a/website/docs/api/plugins/plugin-content-blog.md b/website/docs/api/plugins/plugin-content-blog.md index f769ab10b3..cc08420d03 100644 --- a/website/docs/api/plugins/plugin-content-blog.md +++ b/website/docs/api/plugins/plugin-content-blog.md @@ -59,6 +59,7 @@ Accepted fields: | `feedOptions.description` | `string` | \`${siteConfig.title} Blog\` | Description of the feed. | | `feedOptions.copyright` | `string` | `undefined` | Copyright message. | | `feedOptions.language` | `string` (See [documentation](http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes) for possible values) | `undefined` | Language metadata of the feed. | +| `sortPosts` | 'descending' \| 'ascending' | `'descending'` | Governs the direction of blog post sorting. |