mirror of
https://github.com/facebook/docusaurus.git
synced 2025-08-03 00:39:45 +02:00
chore: release Docusaurus v3.1 (#9705)
Co-authored-by: Joshua Chen <sidachen2003@gmail.com> Co-authored-by: sebastienlorber <lorber.sebastien@gmail.com> Co-authored-by: Sébastien Lorber <slorber@users.noreply.github.com> Co-authored-by: Ivan Mar (sOkam!) <7308253+heysokam@users.noreply.github.com> Co-authored-by: c0h1b4 <dwidman@gmail.com> Co-authored-by: Janessa Garrow <janessa.garrow@gmail.com> Co-authored-by: ozaki <29860391+OzakIOne@users.noreply.github.com> Co-authored-by: axmmisaka <6500159+axmmisaka@users.noreply.github.com> Co-authored-by: Tatsunori Uchino <tats.u@live.jp> Co-authored-by: Simen Bekkhus <sbekkhus91@gmail.com> fix(i18n): complete translations for theme-common.json Brazilian Portuguese (pt-BR) (#9477) fix(content-blog): add baseUrl for author.image_url (#9581) fix(type-aliases): add `title` prop for imported inline SVG React components (#9612) fix(utils): Markdown link replacement with <> but no spaces (#9617) fix(live-codeblock): stabilize react-live transformCode callback, fix editor/preview desync (#9631) fix(cli): output help when no conventional config + no subcommand (#9648) fix CI job (#9604) fix Lint Autofix workflow (#9632) fix(pwa-plugin): upgrade workbox (#9668) fix(create-docusaurus): fix init template code blocks, and little improvements (#9696) fix(theme): allow empty code blocks and live playgrounds (#9704)
This commit is contained in:
parent
a2e05d2118
commit
7b1b89041f
140 changed files with 3187 additions and 1707 deletions
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@docusaurus/plugin-content-blog",
|
||||
"version": "3.0.1",
|
||||
"version": "3.1.0",
|
||||
"description": "Blog plugin for Docusaurus.",
|
||||
"main": "lib/index.js",
|
||||
"types": "src/plugin-content-blog.d.ts",
|
||||
|
@ -19,13 +19,13 @@
|
|||
},
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@docusaurus/core": "3.0.1",
|
||||
"@docusaurus/logger": "3.0.1",
|
||||
"@docusaurus/mdx-loader": "3.0.1",
|
||||
"@docusaurus/types": "3.0.1",
|
||||
"@docusaurus/utils": "3.0.1",
|
||||
"@docusaurus/utils-common": "3.0.1",
|
||||
"@docusaurus/utils-validation": "3.0.1",
|
||||
"@docusaurus/core": "3.1.0",
|
||||
"@docusaurus/logger": "3.1.0",
|
||||
"@docusaurus/mdx-loader": "3.1.0",
|
||||
"@docusaurus/types": "3.1.0",
|
||||
"@docusaurus/utils": "3.1.0",
|
||||
"@docusaurus/utils-common": "3.1.0",
|
||||
"@docusaurus/utils-validation": "3.1.0",
|
||||
"cheerio": "^1.0.0-rc.12",
|
||||
"feed": "^4.2.2",
|
||||
"fs-extra": "^11.1.1",
|
||||
|
|
|
@ -19,6 +19,7 @@ describe('getBlogPostAuthors', () => {
|
|||
getBlogPostAuthors({
|
||||
frontMatter: {},
|
||||
authorsMap: undefined,
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toEqual([]);
|
||||
expect(
|
||||
|
@ -27,6 +28,7 @@ describe('getBlogPostAuthors', () => {
|
|||
authors: [],
|
||||
},
|
||||
authorsMap: undefined,
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toEqual([]);
|
||||
});
|
||||
|
@ -38,6 +40,7 @@ describe('getBlogPostAuthors', () => {
|
|||
author: 'Sébastien Lorber',
|
||||
},
|
||||
authorsMap: undefined,
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toEqual([{name: 'Sébastien Lorber'}]);
|
||||
expect(
|
||||
|
@ -46,6 +49,7 @@ describe('getBlogPostAuthors', () => {
|
|||
authorTitle: 'maintainer',
|
||||
},
|
||||
authorsMap: undefined,
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toEqual([{title: 'maintainer'}]);
|
||||
expect(
|
||||
|
@ -54,8 +58,27 @@ describe('getBlogPostAuthors', () => {
|
|||
authorImageURL: 'https://github.com/slorber.png',
|
||||
},
|
||||
authorsMap: undefined,
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toEqual([{imageURL: 'https://github.com/slorber.png'}]);
|
||||
expect(
|
||||
getBlogPostAuthors({
|
||||
frontMatter: {
|
||||
authorImageURL: '/img/slorber.png',
|
||||
},
|
||||
authorsMap: undefined,
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toEqual([{imageURL: '/img/slorber.png'}]);
|
||||
expect(
|
||||
getBlogPostAuthors({
|
||||
frontMatter: {
|
||||
authorImageURL: '/img/slorber.png',
|
||||
},
|
||||
authorsMap: undefined,
|
||||
baseUrl: '/baseURL',
|
||||
}),
|
||||
).toEqual([{imageURL: '/baseURL/img/slorber.png'}]);
|
||||
expect(
|
||||
getBlogPostAuthors({
|
||||
frontMatter: {
|
||||
|
@ -68,6 +91,7 @@ describe('getBlogPostAuthors', () => {
|
|||
authorURL: 'https://github.com/slorber2',
|
||||
},
|
||||
authorsMap: undefined,
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toEqual([
|
||||
{
|
||||
|
@ -86,8 +110,69 @@ describe('getBlogPostAuthors', () => {
|
|||
authors: 'slorber',
|
||||
},
|
||||
authorsMap: {slorber: {name: 'Sébastien Lorber'}},
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toEqual([{key: 'slorber', name: 'Sébastien Lorber'}]);
|
||||
expect(
|
||||
getBlogPostAuthors({
|
||||
frontMatter: {
|
||||
authors: 'slorber',
|
||||
},
|
||||
authorsMap: {
|
||||
slorber: {
|
||||
name: 'Sébastien Lorber',
|
||||
imageURL: 'https://github.com/slorber.png',
|
||||
},
|
||||
},
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toEqual([
|
||||
{
|
||||
key: 'slorber',
|
||||
name: 'Sébastien Lorber',
|
||||
imageURL: 'https://github.com/slorber.png',
|
||||
},
|
||||
]);
|
||||
expect(
|
||||
getBlogPostAuthors({
|
||||
frontMatter: {
|
||||
authors: 'slorber',
|
||||
},
|
||||
authorsMap: {
|
||||
slorber: {
|
||||
name: 'Sébastien Lorber',
|
||||
imageURL: '/img/slorber.png',
|
||||
},
|
||||
},
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toEqual([
|
||||
{
|
||||
key: 'slorber',
|
||||
name: 'Sébastien Lorber',
|
||||
imageURL: '/img/slorber.png',
|
||||
},
|
||||
]);
|
||||
expect(
|
||||
getBlogPostAuthors({
|
||||
frontMatter: {
|
||||
authors: 'slorber',
|
||||
},
|
||||
authorsMap: {
|
||||
slorber: {
|
||||
name: 'Sébastien Lorber',
|
||||
imageURL: '/img/slorber.png',
|
||||
},
|
||||
},
|
||||
baseUrl: '/baseUrl',
|
||||
}),
|
||||
).toEqual([
|
||||
{
|
||||
key: 'slorber',
|
||||
name: 'Sébastien Lorber',
|
||||
imageURL: '/baseUrl/img/slorber.png',
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
it('can read authors string[]', () => {
|
||||
|
@ -100,6 +185,7 @@ describe('getBlogPostAuthors', () => {
|
|||
slorber: {name: 'Sébastien Lorber', title: 'maintainer'},
|
||||
yangshun: {name: 'Yangshun Tay'},
|
||||
},
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toEqual([
|
||||
{key: 'slorber', name: 'Sébastien Lorber', title: 'maintainer'},
|
||||
|
@ -114,6 +200,7 @@ describe('getBlogPostAuthors', () => {
|
|||
authors: {name: 'Sébastien Lorber', title: 'maintainer'},
|
||||
},
|
||||
authorsMap: undefined,
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toEqual([{name: 'Sébastien Lorber', title: 'maintainer'}]);
|
||||
});
|
||||
|
@ -128,6 +215,7 @@ describe('getBlogPostAuthors', () => {
|
|||
],
|
||||
},
|
||||
authorsMap: undefined,
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toEqual([
|
||||
{name: 'Sébastien Lorber', title: 'maintainer'},
|
||||
|
@ -153,6 +241,7 @@ describe('getBlogPostAuthors', () => {
|
|||
slorber: {name: 'Sébastien Lorber', title: 'maintainer'},
|
||||
yangshun: {name: 'Yangshun Tay', title: 'Yangshun title original'},
|
||||
},
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toEqual([
|
||||
{key: 'slorber', name: 'Sébastien Lorber', title: 'maintainer'},
|
||||
|
@ -173,6 +262,7 @@ describe('getBlogPostAuthors', () => {
|
|||
authors: 'slorber',
|
||||
},
|
||||
authorsMap: undefined,
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toThrowErrorMatchingInlineSnapshot(`
|
||||
"Can't reference blog post authors by a key (such as 'slorber') because no authors map file could be loaded.
|
||||
|
@ -187,6 +277,7 @@ describe('getBlogPostAuthors', () => {
|
|||
authors: 'slorber',
|
||||
},
|
||||
authorsMap: {},
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toThrowErrorMatchingInlineSnapshot(`
|
||||
"Can't reference blog post authors by a key (such as 'slorber') because no authors map file could be loaded.
|
||||
|
@ -205,6 +296,7 @@ describe('getBlogPostAuthors', () => {
|
|||
yangshun: {name: 'Yangshun Tay'},
|
||||
jmarcey: {name: 'Joel Marcey'},
|
||||
},
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toThrowErrorMatchingInlineSnapshot(`
|
||||
"Blog author with key "slorber" not found in the authors map file.
|
||||
|
@ -225,6 +317,7 @@ describe('getBlogPostAuthors', () => {
|
|||
yangshun: {name: 'Yangshun Tay'},
|
||||
jmarcey: {name: 'Joel Marcey'},
|
||||
},
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toThrowErrorMatchingInlineSnapshot(`
|
||||
"Blog author with key "slorber" not found in the authors map file.
|
||||
|
@ -245,6 +338,7 @@ describe('getBlogPostAuthors', () => {
|
|||
yangshun: {name: 'Yangshun Tay'},
|
||||
jmarcey: {name: 'Joel Marcey'},
|
||||
},
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toThrowErrorMatchingInlineSnapshot(`
|
||||
"Blog author with key "slorber" not found in the authors map file.
|
||||
|
@ -262,6 +356,7 @@ describe('getBlogPostAuthors', () => {
|
|||
author: 'Yangshun Tay',
|
||||
},
|
||||
authorsMap: undefined,
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toThrowErrorMatchingInlineSnapshot(`
|
||||
"To declare blog post authors, use the 'authors' front matter in priority.
|
||||
|
@ -275,6 +370,7 @@ describe('getBlogPostAuthors', () => {
|
|||
author_title: 'legacy title',
|
||||
},
|
||||
authorsMap: {slorber: {name: 'Sébastien Lorber'}},
|
||||
baseUrl: '/',
|
||||
}),
|
||||
).toThrowErrorMatchingInlineSnapshot(`
|
||||
"To declare blog post authors, use the 'authors' front matter in priority.
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
import {jest} from '@jest/globals';
|
||||
import path from 'path';
|
||||
import fs from 'fs-extra';
|
||||
import {DEFAULT_PARSE_FRONT_MATTER} from '@docusaurus/utils';
|
||||
import {DEFAULT_OPTIONS} from '../options';
|
||||
import {generateBlogPosts} from '../blogUtils';
|
||||
import {createBlogFeedFiles} from '../feed';
|
||||
|
@ -31,6 +32,8 @@ const DefaultI18N: I18n = {
|
|||
},
|
||||
};
|
||||
|
||||
const markdown = {parseFrontMatter: DEFAULT_PARSE_FRONT_MATTER};
|
||||
|
||||
function getBlogContentPaths(siteDir: string): BlogContentPaths {
|
||||
return {
|
||||
contentPath: path.resolve(siteDir, 'blog'),
|
||||
|
@ -72,6 +75,7 @@ describe.each(['atom', 'rss', 'json'])('%s', (feedType) => {
|
|||
baseUrl: '/',
|
||||
url: 'https://docusaurus.io',
|
||||
favicon: 'image/favicon.ico',
|
||||
markdown,
|
||||
};
|
||||
const outDir = path.join(siteDir, 'build-snap');
|
||||
|
||||
|
@ -110,6 +114,7 @@ describe.each(['atom', 'rss', 'json'])('%s', (feedType) => {
|
|||
baseUrl: '/myBaseUrl/',
|
||||
url: 'https://docusaurus.io',
|
||||
favicon: 'image/favicon.ico',
|
||||
markdown,
|
||||
};
|
||||
|
||||
// Build is quite difficult to mock, so we built the blog beforehand and
|
||||
|
@ -152,6 +157,7 @@ describe.each(['atom', 'rss', 'json'])('%s', (feedType) => {
|
|||
baseUrl: '/myBaseUrl/',
|
||||
url: 'https://docusaurus.io',
|
||||
favicon: 'image/favicon.ico',
|
||||
markdown,
|
||||
};
|
||||
|
||||
// Build is quite difficult to mock, so we built the blog beforehand and
|
||||
|
@ -204,6 +210,7 @@ describe.each(['atom', 'rss', 'json'])('%s', (feedType) => {
|
|||
baseUrl: '/myBaseUrl/',
|
||||
url: 'https://docusaurus.io',
|
||||
favicon: 'image/favicon.ico',
|
||||
markdown,
|
||||
};
|
||||
|
||||
// Build is quite difficult to mock, so we built the blog beforehand and
|
||||
|
|
|
@ -16,6 +16,7 @@ import type {
|
|||
LoadContext,
|
||||
I18n,
|
||||
Validate,
|
||||
MarkdownConfig,
|
||||
} from '@docusaurus/types';
|
||||
import type {
|
||||
BlogPost,
|
||||
|
@ -24,6 +25,24 @@ import type {
|
|||
EditUrlFunction,
|
||||
} from '@docusaurus/plugin-content-blog';
|
||||
|
||||
const markdown: MarkdownConfig = {
|
||||
format: 'mdx',
|
||||
mermaid: true,
|
||||
mdx1Compat: {
|
||||
comments: true,
|
||||
headingIds: true,
|
||||
admonitions: true,
|
||||
},
|
||||
parseFrontMatter: async (params) => {
|
||||
// Reuse the default parser
|
||||
const result = await params.defaultParseFrontMatter(params);
|
||||
if (result.frontMatter.title === 'Complex Slug') {
|
||||
result.frontMatter.custom_frontMatter = 'added by parseFrontMatter';
|
||||
}
|
||||
return result;
|
||||
},
|
||||
};
|
||||
|
||||
function findByTitle(
|
||||
blogPosts: BlogPost[],
|
||||
title: string,
|
||||
|
@ -81,6 +100,7 @@ const getPlugin = async (
|
|||
title: 'Hello',
|
||||
baseUrl: '/',
|
||||
url: 'https://docusaurus.io',
|
||||
markdown,
|
||||
} as DocusaurusConfig;
|
||||
return pluginContentBlog(
|
||||
{
|
||||
|
@ -242,6 +262,7 @@ describe('blog plugin', () => {
|
|||
slug: '/hey/my super path/héllô',
|
||||
title: 'Complex Slug',
|
||||
tags: ['date', 'complex'],
|
||||
custom_frontMatter: 'added by parseFrontMatter',
|
||||
},
|
||||
tags: [
|
||||
{
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
import {getDataFileData} from '@docusaurus/utils';
|
||||
import {getDataFileData, normalizeUrl} from '@docusaurus/utils';
|
||||
import {Joi, URISchema} from '@docusaurus/utils-validation';
|
||||
import type {BlogContentPaths} from './types';
|
||||
import type {
|
||||
|
@ -68,17 +68,37 @@ export async function getAuthorsMap(params: {
|
|||
type AuthorsParam = {
|
||||
frontMatter: BlogPostFrontMatter;
|
||||
authorsMap: AuthorsMap | undefined;
|
||||
baseUrl: string;
|
||||
};
|
||||
|
||||
function normalizeImageUrl({
|
||||
imageURL,
|
||||
baseUrl,
|
||||
}: {
|
||||
imageURL: string | undefined;
|
||||
baseUrl: string;
|
||||
}) {
|
||||
return imageURL?.startsWith('/')
|
||||
? normalizeUrl([baseUrl, imageURL])
|
||||
: imageURL;
|
||||
}
|
||||
|
||||
// Legacy v1/early-v2 front matter fields
|
||||
// We may want to deprecate those in favor of using only frontMatter.authors
|
||||
function getFrontMatterAuthorLegacy(
|
||||
frontMatter: BlogPostFrontMatter,
|
||||
): Author | undefined {
|
||||
function getFrontMatterAuthorLegacy({
|
||||
baseUrl,
|
||||
frontMatter,
|
||||
}: {
|
||||
baseUrl: string;
|
||||
frontMatter: BlogPostFrontMatter;
|
||||
}): Author | undefined {
|
||||
const name = frontMatter.author;
|
||||
const title = frontMatter.author_title ?? frontMatter.authorTitle;
|
||||
const url = frontMatter.author_url ?? frontMatter.authorURL;
|
||||
const imageURL = frontMatter.author_image_url ?? frontMatter.authorImageURL;
|
||||
const imageURL = normalizeImageUrl({
|
||||
imageURL: frontMatter.author_image_url ?? frontMatter.authorImageURL,
|
||||
baseUrl,
|
||||
});
|
||||
|
||||
if (name || title || url || imageURL) {
|
||||
return {
|
||||
|
@ -148,14 +168,26 @@ ${Object.keys(authorsMap)
|
|||
return frontMatterAuthors.map(toAuthor);
|
||||
}
|
||||
|
||||
function fixAuthorImageBaseURL(
|
||||
authors: Author[],
|
||||
{baseUrl}: {baseUrl: string},
|
||||
) {
|
||||
return authors.map((author) => ({
|
||||
...author,
|
||||
imageURL: normalizeImageUrl({imageURL: author.imageURL, baseUrl}),
|
||||
}));
|
||||
}
|
||||
|
||||
export function getBlogPostAuthors(params: AuthorsParam): Author[] {
|
||||
const authorLegacy = getFrontMatterAuthorLegacy(params.frontMatter);
|
||||
const authorLegacy = getFrontMatterAuthorLegacy(params);
|
||||
const authors = getFrontMatterAuthors(params);
|
||||
|
||||
const updatedAuthors = fixAuthorImageBaseURL(authors, params);
|
||||
|
||||
if (authorLegacy) {
|
||||
// Technically, we could allow mixing legacy/authors front matter, but do we
|
||||
// really want to?
|
||||
if (authors.length > 0) {
|
||||
if (updatedAuthors.length > 0) {
|
||||
throw new Error(
|
||||
`To declare blog post authors, use the 'authors' front matter in priority.
|
||||
Don't mix 'authors' with other existing 'author_*' front matter. Choose one or the other, not both at the same time.`,
|
||||
|
@ -164,5 +196,5 @@ Don't mix 'authors' with other existing 'author_*' front matter. Choose one or t
|
|||
return [authorLegacy];
|
||||
}
|
||||
|
||||
return authors;
|
||||
return updatedAuthors;
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ import _ from 'lodash';
|
|||
import logger from '@docusaurus/logger';
|
||||
import readingTime from 'reading-time';
|
||||
import {
|
||||
parseMarkdownString,
|
||||
parseMarkdownFile,
|
||||
normalizeUrl,
|
||||
aliasedSitePath,
|
||||
getEditUrl,
|
||||
|
@ -29,7 +29,7 @@ import {
|
|||
} from '@docusaurus/utils';
|
||||
import {validateBlogPostFrontMatter} from './frontMatter';
|
||||
import {type AuthorsMap, getAuthorsMap, getBlogPostAuthors} from './authors';
|
||||
import type {LoadContext} from '@docusaurus/types';
|
||||
import type {LoadContext, ParseFrontMatter} from '@docusaurus/types';
|
||||
import type {
|
||||
PluginOptions,
|
||||
ReadingTimeFunction,
|
||||
|
@ -180,10 +180,19 @@ function formatBlogPostDate(
|
|||
}
|
||||
}
|
||||
|
||||
async function parseBlogPostMarkdownFile(blogSourceAbsolute: string) {
|
||||
const markdownString = await fs.readFile(blogSourceAbsolute, 'utf-8');
|
||||
async function parseBlogPostMarkdownFile({
|
||||
filePath,
|
||||
parseFrontMatter,
|
||||
}: {
|
||||
filePath: string;
|
||||
parseFrontMatter: ParseFrontMatter;
|
||||
}) {
|
||||
const fileContent = await fs.readFile(filePath, 'utf-8');
|
||||
try {
|
||||
const result = parseMarkdownString(markdownString, {
|
||||
const result = await parseMarkdownFile({
|
||||
filePath,
|
||||
fileContent,
|
||||
parseFrontMatter,
|
||||
removeContentTitle: true,
|
||||
});
|
||||
return {
|
||||
|
@ -191,7 +200,7 @@ async function parseBlogPostMarkdownFile(blogSourceAbsolute: string) {
|
|||
frontMatter: validateBlogPostFrontMatter(result.frontMatter),
|
||||
};
|
||||
} catch (err) {
|
||||
logger.error`Error while parsing blog post file path=${blogSourceAbsolute}.`;
|
||||
logger.error`Error while parsing blog post file path=${filePath}.`;
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
@ -207,7 +216,10 @@ async function processBlogSourceFile(
|
|||
authorsMap?: AuthorsMap,
|
||||
): Promise<BlogPost | undefined> {
|
||||
const {
|
||||
siteConfig: {baseUrl},
|
||||
siteConfig: {
|
||||
baseUrl,
|
||||
markdown: {parseFrontMatter},
|
||||
},
|
||||
siteDir,
|
||||
i18n,
|
||||
} = context;
|
||||
|
@ -228,7 +240,10 @@ async function processBlogSourceFile(
|
|||
const blogSourceAbsolute = path.join(blogDirPath, blogSourceRelative);
|
||||
|
||||
const {frontMatter, content, contentTitle, excerpt} =
|
||||
await parseBlogPostMarkdownFile(blogSourceAbsolute);
|
||||
await parseBlogPostMarkdownFile({
|
||||
filePath: blogSourceAbsolute,
|
||||
parseFrontMatter,
|
||||
});
|
||||
|
||||
const aliasedSource = aliasedSitePath(blogSourceAbsolute, siteDir);
|
||||
|
||||
|
@ -319,7 +334,7 @@ async function processBlogSourceFile(
|
|||
routeBasePath,
|
||||
tagsRouteBasePath,
|
||||
]);
|
||||
const authors = getBlogPostAuthors({authorsMap, frontMatter});
|
||||
const authors = getBlogPostAuthors({authorsMap, frontMatter, baseUrl});
|
||||
|
||||
return {
|
||||
id: slug,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue