From 89903b3e26a5f1cb8e2ce64b251be3a478a859d2 Mon Sep 17 00:00:00 2001 From: thedevwonder pod Date: Thu, 29 Jun 2023 19:07:20 +0000 Subject: [PATCH 01/13] fix(plugins): throw error if build folder already exists on initial clean --- .../docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts index a87d2dcfda05..2e96b9e2d328 100644 --- a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts +++ b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts @@ -152,6 +152,15 @@ export default class CleanWebpackPlugin { return; } + if ( + path.basename(path.resolve(this.outputPath)).toLocaleLowerCase() === + 'build' + ) { + throw new Error( + 'build dir already exist. Docusaurus needs this directory to save the output build. Either remove your directory or chose a different build directory', + ); + } + this.initialClean = true; this.removeFiles(this.cleanOnceBeforeBuildPatterns); From be98393aeb50667b86f9b6b65107db7d83497a8a Mon Sep 17 00:00:00 2001 From: thedevwonder pod Date: Thu, 29 Jun 2023 19:38:05 +0000 Subject: [PATCH 02/13] fix: throw an error if the output path name matches the cwd name case-insensitive --- .../docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts index 2e96b9e2d328..6de7818d9afa 100644 --- a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts +++ b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts @@ -153,11 +153,11 @@ export default class CleanWebpackPlugin { } if ( - path.basename(path.resolve(this.outputPath)).toLocaleLowerCase() === - 'build' + path.basename(path.resolve()).toLowerCase() === + path.basename(path.resolve(this.outputPath)) ) { throw new Error( - 'build dir already exist. Docusaurus needs this directory to save the output build. Either remove your directory or chose a different build directory', + 'output dir already exist. Docusaurus needs this directory to save the output build. Either remove your directory or chose a different build directory', ); } From 2293e12ef60f9fa3ee29528be739b03fc42abbd4 Mon Sep 17 00:00:00 2001 From: thedevwonder pod Date: Thu, 29 Jun 2023 19:39:17 +0000 Subject: [PATCH 03/13] fix: add toLowerCase() to match case --- packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts index 6de7818d9afa..3f47a795e69b 100644 --- a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts +++ b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts @@ -154,7 +154,7 @@ export default class CleanWebpackPlugin { if ( path.basename(path.resolve()).toLowerCase() === - path.basename(path.resolve(this.outputPath)) + path.basename(path.resolve(this.outputPath)).toLocaleLowerCase() ) { throw new Error( 'output dir already exist. Docusaurus needs this directory to save the output build. Either remove your directory or chose a different build directory', From 663847735b9803b7a495b17e24b4f71d7c9a0c20 Mon Sep 17 00:00:00 2001 From: thedevwonder pod Date: Thu, 29 Jun 2023 19:39:46 +0000 Subject: [PATCH 04/13] fix: add toLowerCase() to match case --- packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts index 3f47a795e69b..4e72d3bb20ae 100644 --- a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts +++ b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts @@ -154,7 +154,7 @@ export default class CleanWebpackPlugin { if ( path.basename(path.resolve()).toLowerCase() === - path.basename(path.resolve(this.outputPath)).toLocaleLowerCase() + path.basename(path.resolve(this.outputPath)).toLowerCase() ) { throw new Error( 'output dir already exist. Docusaurus needs this directory to save the output build. Either remove your directory or chose a different build directory', From 358a8aeee5af1256812cf8340ba98341a6ba39e5 Mon Sep 17 00:00:00 2001 From: thedevwonder pod Date: Fri, 30 Jun 2023 06:45:29 +0000 Subject: [PATCH 05/13] fix(plugins): add file check using fs --- .../docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts index 4e72d3bb20ae..2040e7d445d6 100644 --- a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts +++ b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts @@ -30,6 +30,7 @@ // More context: https://github.com/facebook/docusaurus/pull/1839 import path from 'path'; +import * as fs from 'fs'; import {sync as delSync} from 'del'; import type {Compiler, Stats} from 'webpack'; @@ -153,8 +154,8 @@ export default class CleanWebpackPlugin { } if ( - path.basename(path.resolve()).toLowerCase() === - path.basename(path.resolve(this.outputPath)).toLowerCase() + // eslint-disable-next-line no-restricted-properties + fs.existsSync(this.outputPath) ) { throw new Error( 'output dir already exist. Docusaurus needs this directory to save the output build. Either remove your directory or chose a different build directory', From 7a23fbf300c916d440394771730c6ed70e15ad3e Mon Sep 17 00:00:00 2001 From: thedevwonder pod Date: Fri, 30 Jun 2023 08:41:30 +0000 Subject: [PATCH 06/13] fix(plugins): use pathExistsSync from fs-extra module to validate path --- packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts index 2040e7d445d6..13281d2187cc 100644 --- a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts +++ b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts @@ -30,7 +30,7 @@ // More context: https://github.com/facebook/docusaurus/pull/1839 import path from 'path'; -import * as fs from 'fs'; +import fs from 'fs-extra'; import {sync as delSync} from 'del'; import type {Compiler, Stats} from 'webpack'; @@ -155,7 +155,7 @@ export default class CleanWebpackPlugin { if ( // eslint-disable-next-line no-restricted-properties - fs.existsSync(this.outputPath) + fs.pathExistsSync(this.outputPath) ) { throw new Error( 'output dir already exist. Docusaurus needs this directory to save the output build. Either remove your directory or chose a different build directory', From 2a7bb199f49ef2d714f8aee2971a89aa44e2ee38 Mon Sep 17 00:00:00 2001 From: Joshua Chen Date: Fri, 30 Jun 2023 16:45:28 +0800 Subject: [PATCH 07/13] Apply suggestions from code review --- .../docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts index 13281d2187cc..e960edde3e40 100644 --- a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts +++ b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts @@ -153,12 +153,10 @@ export default class CleanWebpackPlugin { return; } - if ( - // eslint-disable-next-line no-restricted-properties - fs.pathExistsSync(this.outputPath) - ) { + // eslint-disable-next-line no-restricted-properties + if (fs.pathExistsSync(this.outputPath)) { throw new Error( - 'output dir already exist. Docusaurus needs this directory to save the output build. Either remove your directory or chose a different build directory', + `Output directory ${this.outputPath} already exists. Docusaurus needs this directory to save the build output. Either remove the directory or choose a different build directory via '--out-dir'.`, ); } From 546f8a616cce4376bc55d6829dd9d0d545feda6d Mon Sep 17 00:00:00 2001 From: thedevwonder pod Date: Fri, 30 Jun 2023 08:52:32 +0000 Subject: [PATCH 08/13] fix(plugins): add await fs.pathExists --- .../docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts index e960edde3e40..940e1de5dbdc 100644 --- a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts +++ b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts @@ -148,13 +148,12 @@ export default class CleanWebpackPlugin { * Warning: It is recommended to initially clean your build directory outside * of webpack to minimize unexpected behavior. */ - handleInitial(): void { + async handleInitial(): Promise { if (this.initialClean) { return; } - // eslint-disable-next-line no-restricted-properties - if (fs.pathExistsSync(this.outputPath)) { + if (await fs.pathExists(this.outputPath)) { throw new Error( `Output directory ${this.outputPath} already exists. Docusaurus needs this directory to save the build output. Either remove the directory or choose a different build directory via '--out-dir'.`, ); From 4c427f1fc39638a96008d7ee2ade9d331dcf9a6c Mon Sep 17 00:00:00 2001 From: thedevwonder pod Date: Fri, 30 Jun 2023 08:57:52 +0000 Subject: [PATCH 09/13] fix(plugins): revert back to using pathExistsSync --- .../docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts index 940e1de5dbdc..e960edde3e40 100644 --- a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts +++ b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts @@ -148,12 +148,13 @@ export default class CleanWebpackPlugin { * Warning: It is recommended to initially clean your build directory outside * of webpack to minimize unexpected behavior. */ - async handleInitial(): Promise { + handleInitial(): void { if (this.initialClean) { return; } - if (await fs.pathExists(this.outputPath)) { + // eslint-disable-next-line no-restricted-properties + if (fs.pathExistsSync(this.outputPath)) { throw new Error( `Output directory ${this.outputPath} already exists. Docusaurus needs this directory to save the build output. Either remove the directory or choose a different build directory via '--out-dir'.`, ); From c0aa55c0a878d0f37822eb8b661e0730469a499e Mon Sep 17 00:00:00 2001 From: thedevwonder pod Date: Fri, 30 Jun 2023 11:41:54 +0000 Subject: [PATCH 10/13] fix(plugins): add private validator func to check duplicate name in case-insensitive systems --- .../src/webpack/plugins/CleanWebpackPlugin.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts index e960edde3e40..eb02df1eb3ab 100644 --- a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts +++ b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts @@ -116,6 +116,19 @@ export default class CleanWebpackPlugin { this.removeFiles = this.removeFiles.bind(this); } + private checkIfFileNameIsDuplicate(): boolean { + const dir = path.dirname(this.outputPath); + const baseName = path.basename(this.outputPath).toLowerCase(); + // eslint-disable-next-line no-restricted-properties + const duplicateFiles = fs + .readdirSync(dir) + .filter((fileName) => fileName.toLowerCase() === baseName); + if (duplicateFiles.length > 0) { + return true; + } + return false; + } + apply(compiler: Compiler): void { if (!compiler.options.output.path) { console.warn( @@ -153,8 +166,7 @@ export default class CleanWebpackPlugin { return; } - // eslint-disable-next-line no-restricted-properties - if (fs.pathExistsSync(this.outputPath)) { + if (this.checkIfFileNameIsDuplicate()) { throw new Error( `Output directory ${this.outputPath} already exists. Docusaurus needs this directory to save the build output. Either remove the directory or choose a different build directory via '--out-dir'.`, ); From daa1932ad602f4ccc9d19ad10fa9130bfc0573eb Mon Sep 17 00:00:00 2001 From: thedevwonder pod Date: Fri, 30 Jun 2023 14:38:49 +0000 Subject: [PATCH 11/13] fix(core): change build error message on initial clean up --- packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts index eb02df1eb3ab..b78b3d8fd402 100644 --- a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts +++ b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts @@ -168,7 +168,7 @@ export default class CleanWebpackPlugin { if (this.checkIfFileNameIsDuplicate()) { throw new Error( - `Output directory ${this.outputPath} already exists. Docusaurus needs this directory to save the build output. Either remove the directory or choose a different build directory via '--out-dir'.`, + `Output file ${this.outputPath} already exists. Docusaurus needs this directory to save the build output. Either remove/change the file or choose a different build directory via '--out-dir'.`, ); } From b08a9764166be5b5dc8dafb4c1c7e246dda6a528 Mon Sep 17 00:00:00 2001 From: thedevwonder pod Date: Fri, 30 Jun 2023 15:13:42 +0000 Subject: [PATCH 12/13] fix(core): add file exists check and isFile check synchronously --- .../src/webpack/plugins/CleanWebpackPlugin.ts | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts index b78b3d8fd402..77bfa6b6714c 100644 --- a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts +++ b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts @@ -116,19 +116,6 @@ export default class CleanWebpackPlugin { this.removeFiles = this.removeFiles.bind(this); } - private checkIfFileNameIsDuplicate(): boolean { - const dir = path.dirname(this.outputPath); - const baseName = path.basename(this.outputPath).toLowerCase(); - // eslint-disable-next-line no-restricted-properties - const duplicateFiles = fs - .readdirSync(dir) - .filter((fileName) => fileName.toLowerCase() === baseName); - if (duplicateFiles.length > 0) { - return true; - } - return false; - } - apply(compiler: Compiler): void { if (!compiler.options.output.path) { console.warn( @@ -166,7 +153,12 @@ export default class CleanWebpackPlugin { return; } - if (this.checkIfFileNameIsDuplicate()) { + if ( + // eslint-disable-next-line no-restricted-properties + fs.pathExistsSync(this.outputPath) && + // eslint-disable-next-line no-restricted-properties + fs.statSync(this.outputPath).isFile() + ) { throw new Error( `Output file ${this.outputPath} already exists. Docusaurus needs this directory to save the build output. Either remove/change the file or choose a different build directory via '--out-dir'.`, ); From d86ac5c5cd7ea5708ebee3a091f2f9033426ae67 Mon Sep 17 00:00:00 2001 From: thedevwonder pod Date: Fri, 30 Jun 2023 15:17:21 +0000 Subject: [PATCH 13/13] fix(core): fix build error message --- packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts index 77bfa6b6714c..a619b4b0e0cc 100644 --- a/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts +++ b/packages/docusaurus/src/webpack/plugins/CleanWebpackPlugin.ts @@ -160,7 +160,7 @@ export default class CleanWebpackPlugin { fs.statSync(this.outputPath).isFile() ) { throw new Error( - `Output file ${this.outputPath} already exists. Docusaurus needs this directory to save the build output. Either remove/change the file or choose a different build directory via '--out-dir'.`, + `A file '${this.outputPath}' already exists. Docusaurus needs this directory to save the build output. Either remove/change the file or choose a different build directory via '--out-dir'.`, ); }