From 0049e9439154cc37cf9c4c664387f9210afc393c Mon Sep 17 00:00:00 2001 From: Pranav2612000 Date: Sun, 2 Oct 2022 01:34:16 +0530 Subject: [PATCH 1/2] fix: prevent yarn build from breaking when html slug is used --- .../__fixtures__/build-snap/htmlFile.html | 1 + .../src/__tests__/emitUtils.test.ts | 16 ++++++++++++++++ packages/docusaurus-utils/src/emitUtils.ts | 2 +- .../_blog tests/2022-10-02-html-slug.md | 15 +++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 packages/docusaurus-utils/src/__tests__/__fixtures__/build-snap/htmlFile.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__/emitUtils.test.ts b/packages/docusaurus-utils/src/__tests__/emitUtils.test.ts index 55ffa2bb9d17..075c01ad8280 100644 --- a/packages/docusaurus-utils/src/__tests__/emitUtils.test.ts +++ b/packages/docusaurus-utils/src/__tests__/emitUtils.test.ts @@ -73,6 +73,22 @@ 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'); + }); // Can it ever happen? it('throws if file does not exist', async () => { await expect( diff --git a/packages/docusaurus-utils/src/emitUtils.ts b/packages/docusaurus-utils/src/emitUtils.ts index b0c9a3ab27b7..b685f043b608 100644 --- a/packages/docusaurus-utils/src/emitUtils.ts +++ b/packages/docusaurus-utils/src/emitUtils.ts @@ -81,7 +81,7 @@ export async function readOutputHTMLFile( const withTrailingSlashPath = path.join(outDir, permalink, 'index.html'); const withoutTrailingSlashPath = path.join( outDir, - `${permalink.replace(/\/$/, '')}.html`, + `${permalink.replace(/\/$/, '').replace(/.html$/, '')}.html`, ); const HTMLPath = await findAsyncSequential( [ 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" + + +``` From 260c6a36851330ac9b32b3daedc0e06146d4f4b4 Mon Sep 17 00:00:00 2001 From: sebastienlorber Date: Thu, 6 Oct 2022 15:47:40 +0200 Subject: [PATCH 2/2] fix edge case --- .../weird.html.folder/nestedHtmlFile.html | 1 + .../src/__tests__/emitUtils.test.ts | 18 ++++++++++++- packages/docusaurus-utils/src/emitUtils.ts | 26 ++++++++++--------- 3 files changed, 32 insertions(+), 13 deletions(-) create mode 100644 packages/docusaurus-utils/src/__tests__/__fixtures__/build-snap/weird.html.folder/nestedHtmlFile.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 075c01ad8280..1883a4a9a679 100644 --- a/packages/docusaurus-utils/src/__tests__/emitUtils.test.ts +++ b/packages/docusaurus-utils/src/__tests__/emitUtils.test.ts @@ -89,6 +89,22 @@ describe('readOutputHTMLFile', () => { ).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( @@ -98,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 b685f043b608..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(/\/$/, '').replace(/.html$/, '')}.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);