diff --git a/.changeset/shy-humans-arrive.md b/.changeset/shy-humans-arrive.md new file mode 100644 index 0000000000..81918007cc --- /dev/null +++ b/.changeset/shy-humans-arrive.md @@ -0,0 +1,5 @@ +--- +"@pnpm/parse-cli-args": patch +--- + +The `--help` option should not convert the command to `help` if the command is unknown. So `pnpm eslint -h` is not parsed as `pnpm help eslint`. diff --git a/packages/parse-cli-args/src/index.ts b/packages/parse-cli-args/src/index.ts index 47557d4bb3..3d71ef91d4 100644 --- a/packages/parse-cli-args/src/index.ts +++ b/packages/parse-cli-args/src/index.ts @@ -48,16 +48,6 @@ export default async function parseCliArgs ( inputArgv, 0 ) - if (noptExploratoryResults['help']) { - return { - argv: noptExploratoryResults.argv, - cmd: 'help', - options: {}, - params: noptExploratoryResults.argv.remain, - unknownOptions: new Map(), - fallbackCommandUsed: false, - } - } const recursiveCommandUsed = RECURSIVE_CMDS.has(noptExploratoryResults.argv.remain[0]) let commandName = getCommandName(noptExploratoryResults.argv.remain) @@ -67,6 +57,15 @@ export default async function parseCliArgs ( cmd = opts.fallbackCommand! commandName = opts.fallbackCommand! inputArgv.unshift(opts.fallbackCommand!) + } else if (noptExploratoryResults['help']) { + return { + argv: noptExploratoryResults.argv, + cmd: 'help', + options: {}, + params: noptExploratoryResults.argv.remain, + unknownOptions: new Map(), + fallbackCommandUsed: false, + } } const types = { ...opts.universalOptionsTypes, diff --git a/packages/parse-cli-args/test/index.ts b/packages/parse-cli-args/test/index.ts index 81b6b6ac26..1fa42c9d42 100644 --- a/packages/parse-cli-args/test/index.ts +++ b/packages/parse-cli-args/test/index.ts @@ -158,6 +158,16 @@ test('if a help option is used, set cmd to "help"', async () => { expect(cmd).toBe('help') }) +test('if a help option is used with an unknown command, do not set cmd to "help"', async () => { + const { cmd, fallbackCommandUsed } = await parseCliArgs({ + ...DEFAULT_OPTS, + getCommandLongName: () => null, + fallbackCommand: 'run', + }, ['eslint', '--help']) + expect(cmd).toBe('run') + expect(fallbackCommandUsed).toBeTruthy() +}) + test('no command', async () => { const { cmd } = await parseCliArgs({ ...DEFAULT_OPTS,