From 442a974aaa95b34c528763f434425d7f324ab30a Mon Sep 17 00:00:00 2001 From: Sahil Bansal Date: Mon, 16 Feb 2026 16:55:23 +0530 Subject: [PATCH] Fix npm global flag usage (#166) * fix global flag usage * add comment * Update packagemanager/npm_test.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Sahil Bansal * Update packagemanager/npm_test.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Sahil Bansal --------- Signed-off-by: Sahil Bansal Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packagemanager/npm.go | 3 +++ packagemanager/npm_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/packagemanager/npm.go b/packagemanager/npm.go index 31b0a84..58cebff 100644 --- a/packagemanager/npm.go +++ b/packagemanager/npm.go @@ -121,6 +121,9 @@ func (npm *npmPackageManager) ParseCommand(args []string) (*ParsedCommand, error flagSet.StringArrayVarP(&devPackages, "dev", "D", nil, "Install dev packages") } + // Known only to prevent UnknownFlags mode from swallowing the next package arg. + flagSet.BoolP("global", "g", false, "Install packages globally") + err := flagSet.Parse(installArgs) if err != nil { return &ParsedCommand{Command: command}, nil diff --git a/packagemanager/npm_test.go b/packagemanager/npm_test.go index 2f14911..a04632b 100644 --- a/packagemanager/npm_test.go +++ b/packagemanager/npm_test.go @@ -136,6 +136,41 @@ func TestNpmParseCommand(t *testing.T) { assert.Equal(t, false, parsedCommand.IsManifestInstall) // with no package name, npm won’t add or install anything new }, }, + { + name: "npm install with global flag with single package", + command: "npm install -g prettier", + assert: func(t *testing.T, parsedCommand *ParsedCommand, err error) { + assert.NoError(t, err) + assert.Equal(t, 1, len(parsedCommand.InstallTargets)) + assert.Equal(t, false, parsedCommand.IsManifestInstall) + assert.Equal(t, "prettier", parsedCommand.InstallTargets[0].PackageVersion.Package.Name) + }, + }, + { + name: "npm install with global flag with multiple packages", + command: "npm install -g prettier eslint", + assert: func(t *testing.T, parsedCommand *ParsedCommand, err error) { + assert.NoError(t, err) + assert.Equal(t, 2, len(parsedCommand.InstallTargets)) + assert.Equal(t, false, parsedCommand.IsManifestInstall) + assert.Equal(t, "prettier", parsedCommand.InstallTargets[0].PackageVersion.Package.Name) + assert.Equal(t, "eslint", parsedCommand.InstallTargets[1].PackageVersion.Package.Name) + }, + }, + { + name: "npm install with global and dev flags with multiple packages", + command: "npm install -g --save-dev prettier eslint", + assert: func(t *testing.T, parsedCommand *ParsedCommand, err error) { + assert.NoError(t, err) + assert.Equal(t, 2, len(parsedCommand.InstallTargets)) + assert.Equal(t, false, parsedCommand.IsManifestInstall) + var pkgs []string + for _, target := range parsedCommand.InstallTargets { + pkgs = append(pkgs, target.PackageVersion.Package.Name) + } + assert.ElementsMatch(t, []string{"prettier", "eslint"}, pkgs) + }, + }, } for _, tc := range cases {