From efbd0cbd40d0ee28e442e505d4eec3819c99fa64 Mon Sep 17 00:00:00 2001 From: Pranav Joglekar Date: Thu, 6 Oct 2022 19:49:05 +0530 Subject: [PATCH] fix(content-blog): make RSS feed generation work with slugs with .html extension (#8158) Co-authored-by: sebastienlorber --- .../__fixtures__/build-snap/htmlFile.html | 1 + .../weird.html.folder/nestedHtmlFile.html | 1 + .../src/__tests__/emitUtils.test.ts | 34 ++++++++++++++++++- packages/docusaurus-utils/src/emitUtils.ts | 26 +++++++------- .../_blog tests/2022-10-02-html-slug.md | 15 ++++++++ 5 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 packages/docusaurus-utils/src/__tests__/__fixtures__/build-snap/htmlFile.html create mode 100644 packages/docusaurus-utils/src/__tests__/__fixtures__/build-snap/weird.html.folder/nestedHtmlFile.html create mode 100644 website/_dogfooding/_blog tests/2022-10-02-html-slug.md diff --git a/packages/docusaurus-utils/src/__tests__/__fixtures__/build-snap/htmlFile.html b/packages/docusaurus-utils/src/__tests__/__fixtures__/build-snap/htmlFile.html new file mode 100644 index 000000000000..41226a554edc --- /dev/null +++ b/packages/docusaurus-utils/src/__tests__/__fixtures__/build-snap/htmlFile.html @@ -0,0 +1 @@ +htmlFile.html diff --git a/packages/docusaurus-utils/src/__tests__/__fixtures__/build-snap/weird.html.folder/nestedHtmlFile.html b/packages/docusaurus-utils/src/__tests__/__fixtures__/build-snap/weird.html.folder/nestedHtmlFile.html new file mode 100644 index 000000000000..4388af2498ca --- /dev/null +++ b/packages/docusaurus-utils/src/__tests__/__fixtures__/build-snap/weird.html.folder/nestedHtmlFile.html @@ -0,0 +1 @@ +nestedHtmlFile.html diff --git a/packages/docusaurus-utils/src/__tests__/emitUtils.test.ts b/packages/docusaurus-utils/src/__tests__/emitUtils.test.ts index 55ffa2bb9d17..1883a4a9a679 100644 --- a/packages/docusaurus-utils/src/__tests__/emitUtils.test.ts +++ b/packages/docusaurus-utils/src/__tests__/emitUtils.test.ts @@ -73,6 +73,38 @@ describe('readOutputHTMLFile', () => { ).then(String), ).resolves.toBe('file\n'); }); + it('reads file ending in .html', async () => { + await expect( + readOutputHTMLFile( + '/htmlFile.html', + path.join(__dirname, '__fixtures__/build-snap'), + false, + ).then(String), + ).resolves.toBe('htmlFile.html\n'); + await expect( + readOutputHTMLFile( + '/htmlFile.html', + path.join(__dirname, '__fixtures__/build-snap'), + undefined, + ).then(String), + ).resolves.toBe('htmlFile.html\n'); + }); + it('reads file ending in .html in folder containing .html', async () => { + await expect( + readOutputHTMLFile( + '/weird.html.folder/nestedHtmlFile.html', + path.join(__dirname, '__fixtures__/build-snap'), + undefined, + ).then(String), + ).resolves.toBe('nestedHtmlFile.html\n'); + await expect( + readOutputHTMLFile( + '/weird.html.folder/nestedHtmlFile.html', + path.join(__dirname, '__fixtures__/build-snap'), + undefined, + ).then(String), + ).resolves.toBe('nestedHtmlFile.html\n'); + }); // Can it ever happen? it('throws if file does not exist', async () => { await expect( @@ -82,7 +114,7 @@ describe('readOutputHTMLFile', () => { undefined, ).then(String), ).rejects.toThrowErrorMatchingInlineSnapshot( - `"Expected output HTML file to be found at /packages/docusaurus-utils/src/__tests__/__fixtures__/build-snap/nonExistent/index.html."`, + `"Expected output HTML file to be found at /packages/docusaurus-utils/src/__tests__/__fixtures__/build-snap/nonExistent/index.html for permalink /nonExistent."`, ); }); }); diff --git a/packages/docusaurus-utils/src/emitUtils.ts b/packages/docusaurus-utils/src/emitUtils.ts index b0c9a3ab27b7..ecce1f34861c 100644 --- a/packages/docusaurus-utils/src/emitUtils.ts +++ b/packages/docusaurus-utils/src/emitUtils.ts @@ -79,20 +79,22 @@ export async function readOutputHTMLFile( trailingSlash: boolean | undefined, ): Promise { const withTrailingSlashPath = path.join(outDir, permalink, 'index.html'); - const withoutTrailingSlashPath = path.join( - outDir, - `${permalink.replace(/\/$/, '')}.html`, - ); - const HTMLPath = await findAsyncSequential( - [ - trailingSlash !== false && withTrailingSlashPath, - trailingSlash !== true && withoutTrailingSlashPath, - ].filter((p): p is string => Boolean(p)), - fs.pathExists, - ); + const withoutTrailingSlashPath = (() => { + const basePath = path.join(outDir, permalink.replace(/\/$/, '')); + const htmlSuffix = /\.html?$/i.test(basePath) ? '' : '.html'; + return `${basePath}${htmlSuffix}`; + })(); + + const possibleHtmlPaths = [ + trailingSlash !== false && withTrailingSlashPath, + trailingSlash !== true && withoutTrailingSlashPath, + ].filter((p): p is string => Boolean(p)); + + const HTMLPath = await findAsyncSequential(possibleHtmlPaths, fs.pathExists); + if (!HTMLPath) { throw new Error( - `Expected output HTML file to be found at ${withTrailingSlashPath}.`, + `Expected output HTML file to be found at ${withTrailingSlashPath} for permalink ${permalink}.`, ); } return fs.readFile(HTMLPath); diff --git a/website/_dogfooding/_blog tests/2022-10-02-html-slug.md b/website/_dogfooding/_blog tests/2022-10-02-html-slug.md new file mode 100644 index 000000000000..0cae900592ff --- /dev/null +++ b/website/_dogfooding/_blog tests/2022-10-02-html-slug.md @@ -0,0 +1,15 @@ +--- +title: A post with html slug +tags: [paginated-tag] +slug: /x/y/z.html +--- + +# Hmmm! + +This is a blog post with an html slug! + +```mdx-code-block +import Partial from "./_partial.mdx" + + +```