fix(shell-completion): give correct suggestions when command line ends with a space (#10607)

* fix(shell-completion): give correct suggestions when command line ends with a space

fixes an issue where if you tried to complete any part of any subcommand
with a space before <TAB> (eg: `pnpm run <TAB>`, `pnpm rm react <TAB>`),
pnpm would give you suggestions for the root command, as if you had
typed `pnpm <TAB>`

close #7964
close #5426

---------

Co-authored-by: Zoltan Kochan <z@kochan.io>
This commit is contained in:
sadan4
2026-02-25 05:37:48 -05:00
committed by GitHub
parent 2e8816e83b
commit a2591e8cda
2 changed files with 17 additions and 4 deletions

View File

@@ -0,0 +1,5 @@
---
"@pnpm/plugin-commands-completion": patch
---
Give correct suggestions when command line ends with a space. #[10607](https://github.com/pnpm/pnpm/pull/10607/changes)

View File

@@ -26,10 +26,7 @@ export function createCompletionServer (
const env = tabtab.parseEnv(process.env)
if (!env.complete) return
// Parse only words that are before the pointer and finished.
// Finished means that there's at least one space between the word and pointer
const finishedArgv = env.partial.slice(0, -env.lastPartial.length)
const inputArgv = splitCmd(finishedArgv).slice(1)
const inputArgv = splitCmd(stripPartialWord(env)).slice(1)
// We cannot autocomplete what a user types after "pnpm test --"
if (inputArgv.includes('--')) return
const { params, options, cmd } = await opts.parseCliArgs(inputArgv)
@@ -48,3 +45,14 @@ export function createCompletionServer (
)
}
}
/**
* Returns the portion of the command line that consists of fully typed words,
*/
function stripPartialWord (env: { partial: string, lastPartial: string }): string {
if (env.lastPartial.length > 0) {
// stripping any word the user is currently typing.
return env.partial.slice(0, -env.lastPartial.length)
}
return env.partial
}