diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/authors.test.ts b/packages/docusaurus-plugin-content-blog/src/__tests__/authors.test.ts index 365336cd6c..38e15c8acb 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/authors.test.ts +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/authors.test.ts @@ -353,15 +353,27 @@ describe('validateAuthorsMap', () => { }); }); - test('reject author without name', () => { + test('accept author with only image', () => { const authorsMap: AuthorsMap = { slorber: { - image_url: 'https://github.com/slorber.png', + imageURL: 'https://github.com/slorber.png', + url: 'https://github.com/slorber', + }, + }; + expect(validateAuthorsMap(authorsMap)).toEqual(authorsMap); + }); + + test('reject author without name or image', () => { + const authorsMap: AuthorsMap = { + slorber: { + title: 'foo', }, }; expect(() => validateAuthorsMap(authorsMap), - ).toThrowErrorMatchingInlineSnapshot(`"\\"slorber.name\\" is required"`); + ).toThrowErrorMatchingInlineSnapshot( + `"\\"slorber\\" must contain at least one of [name, imageURL]"`, + ); }); test('reject undefined author', () => { diff --git a/packages/docusaurus-plugin-content-blog/src/authors.ts b/packages/docusaurus-plugin-content-blog/src/authors.ts index cab9f5363e..7abbf14bbf 100644 --- a/packages/docusaurus-plugin-content-blog/src/authors.ts +++ b/packages/docusaurus-plugin-content-blog/src/authors.ts @@ -20,12 +20,13 @@ export type AuthorsMap = Record; const AuthorsMapSchema = Joi.object().pattern( Joi.string(), Joi.object({ - name: Joi.string().required(), + name: Joi.string(), url: URISchema, imageURL: URISchema, title: Joi.string(), }) .rename('image_url', 'imageURL') + .or('name', 'imageURL') .unknown() .required(), ); @@ -63,7 +64,6 @@ function getFrontMatterAuthorLegacy( const url = frontMatter.author_url ?? frontMatter.authorURL; const imageURL = frontMatter.author_image_url ?? frontMatter.authorImageURL; - // Shouldn't we require at least an author name? if (name || title || url || imageURL) { return { name, diff --git a/packages/docusaurus-plugin-content-blog/src/blogFrontMatter.ts b/packages/docusaurus-plugin-content-blog/src/blogFrontMatter.ts index b1eba293ee..3f667ba4aa 100644 --- a/packages/docusaurus-plugin-content-blog/src/blogFrontMatter.ts +++ b/packages/docusaurus-plugin-content-blog/src/blogFrontMatter.ts @@ -21,7 +21,7 @@ const BlogPostFrontMatterAuthorSchema = Joi.object({ url: URISchema, imageURL: Joi.string(), }) - .or('key', 'name') + .or('key', 'name', 'imageURL') .rename('image_url', 'imageURL', {alias: true}); const FrontMatterAuthorErrorMessage = diff --git a/packages/docusaurus-theme-classic/src/theme/BlogPostAuthors/index.tsx b/packages/docusaurus-theme-classic/src/theme/BlogPostAuthors/index.tsx index 99ea9cadea..4e36a71425 100644 --- a/packages/docusaurus-theme-classic/src/theme/BlogPostAuthors/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/BlogPostAuthors/index.tsx @@ -21,10 +21,20 @@ export default function BlogPostAuthors({ if (authorsCount === 0) { return null; } + const imageOnly = authors.every(({name}) => !name); return ( -
+
{authors.map((author, idx) => ( -
+