From 087a32971fe022a8d94c0b106d82ed24f98ef1bc Mon Sep 17 00:00:00 2001
From: Ashiq Firoz <64600806+ashiq-firoz@users.noreply.github.com>
Date: Thu, 8 Aug 2024 19:16:51 +0530
Subject: [PATCH] fix(cli): Fix bad docusaurus CLI behavior on for --version,
 -V, --help, -h (#10368)

Co-authored-by: sebastien <lorber.sebastien@gmail.com>
---
 packages/docusaurus/bin/docusaurus.mjs | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/packages/docusaurus/bin/docusaurus.mjs b/packages/docusaurus/bin/docusaurus.mjs
index 7429f4f4156e..11ac62cadbfb 100755
--- a/packages/docusaurus/bin/docusaurus.mjs
+++ b/packages/docusaurus/bin/docusaurus.mjs
@@ -222,7 +222,8 @@ cli
 
 cli.arguments('<command>').action((cmd) => {
   cli.outputHelp();
-  logger.error`    Unknown command name=${cmd}.`;
+  logger.error`Unknown Docusaurus CLI command name=${cmd}.`;
+  process.exit(1);
 });
 
 // === The above is the commander configuration ===
@@ -247,24 +248,24 @@ function isInternalCommand(command) {
   );
 }
 
-// process.argv always looks like this:
-// [
-//   '/path/to/node',
-//   '/path/to/docusaurus.mjs',
-//   '<subcommand>',
-//   ...subcommandArgs
-// ]
+/**
+ * @param {string | undefined} command
+ */
+function isExternalCommand(command) {
+  return !!(command && !isInternalCommand(command) && !command.startsWith('-'));
+}
 
-// There is no subcommand
-// TODO: can we use commander to handle this case?
-if (process.argv.length < 3 || process.argv[2]?.startsWith('--')) {
+// No command? We print the help message because Commander doesn't
+// Note argv looks like this: ['../node','../docusaurus.mjs','<command>',...rest]
+if (process.argv.length < 3) {
   cli.outputHelp();
+  logger.error`Please provide a Docusaurus CLI command.`;
   process.exit(1);
 }
 
 // There is an unrecognized subcommand
 // Let plugins extend the CLI before parsing
-if (!isInternalCommand(process.argv[2])) {
+if (isExternalCommand(process.argv[2])) {
   // TODO: in this step, we must assume default site structure because there's
   // no way to know the siteDir/config yet. Maybe the root cli should be
   // responsible for parsing these arguments?