fix: dynamically locate command path in argv for flags() offset#9295
Draft
fix: dynamically locate command path in argv for flags() offset#9295
Conversation
Global flags before the command name (e.g., npm --registry url trust list) shifted command positions in argv, causing flags() to miscalculate the nopt offset with its fixed 2+depth formula. Now flags() accepts the full commandPath array and searches for the contiguous command sequence in argv, correctly skipping any preceding global flags. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
When global flags like
--registryappear before the command name in argv (e.g.,npm --registry http://... trust list), the subcommand parser miscalculated the offset into argv. It used a fixed2 + depthoffset assuming commands always start at position 2, but global flags push command names to higher positions. This caused subcommand names to be treated as unknown positional arguments.Changes
lib/base-cmd.js: Changedflags(depth)toflags(commandPath)and added#findCommandOffset()which searches for the full contiguous command path sequence inconfig.argv, correctly skipping any preceding global flags.lib/npm.js: Updated call site to pass thecommandPatharray instead ofcommandPath.length.test/lib/base-cmd.js: Added 3 new test cases: