Skip to content

Commit ed2d229

Browse files
committed
RTECO-935 - Support pnpm command for jfrog-cli
1 parent 98e042f commit ed2d229

6 files changed

Lines changed: 92 additions & 9 deletions

File tree

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,6 @@ node_modules
3535

3636
# Class files
3737
*.class
38-
**/testdata/**/bin
38+
**/testdata/**/bin
39+
40+
.cursor

buildtools/cli.go

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
huggingfaceCommands "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/huggingface"
3232
"github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/mvn"
3333
"github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/npm"
34+
pnpmcmd "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/pnpm"
3435
containerutils "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/ocicontainer"
3536
"github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/terraform"
3637
"github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/yarn"
@@ -64,6 +65,7 @@ import (
6465
"github.com/jfrog/jfrog-cli/docs/buildtools/mvnconfig"
6566
"github.com/jfrog/jfrog-cli/docs/buildtools/npmcommand"
6667
"github.com/jfrog/jfrog-cli/docs/buildtools/npmconfig"
68+
"github.com/jfrog/jfrog-cli/docs/buildtools/pnpmcommand"
6769
nugetdocs "github.com/jfrog/jfrog-cli/docs/buildtools/nuget"
6870
"github.com/jfrog/jfrog-cli/docs/buildtools/nugetconfig"
6971
"github.com/jfrog/jfrog-cli/docs/buildtools/pipconfig"
@@ -431,6 +433,17 @@ func GetCommands() []cli.Command {
431433
return cliutils.CreateConfigCmd(c, project.Pnpm)
432434
},
433435
},
436+
{
437+
Name: "pnpm",
438+
Flags: cliutils.GetCommandFlags(cliutils.Pnpm),
439+
Usage: pnpmcommand.GetDescription(),
440+
HelpName: corecommon.CreateUsage("pnpm", pnpmcommand.GetDescription(), pnpmcommand.Usage),
441+
UsageText: pnpmcommand.GetArguments(),
442+
SkipFlagParsing: true,
443+
BashComplete: corecommon.CreateBashCompletionFunc("install", "i", "publish", "p"),
444+
Category: buildToolsCategory,
445+
Action: pnpmCmd,
446+
},
434447
{
435448
Name: "docker",
436449
Flags: cliutils.GetCommandFlags(cliutils.Docker),
@@ -771,6 +784,61 @@ func YarnCmd(c *cli.Context) error {
771784
return commands.Exec(yarnCmd)
772785
}
773786

787+
func pnpmCmd(c *cli.Context) error {
788+
if show, err := cliutils.ShowCmdHelpIfNeeded(c, c.Args()); show || err != nil {
789+
return err
790+
}
791+
if c.NArg() < 1 {
792+
return cliutils.WrongNumberOfArgumentsHandler(c)
793+
}
794+
args := cliutils.ExtractCommand(c)
795+
cmdName, filteredArgs := getCommandName(args)
796+
797+
switch cmdName {
798+
case "install", "i", "publish", "p":
799+
serverDetails, cleanArgs, buildConfiguration, err := extractPnpmOptionsFromArgs(filteredArgs)
800+
if err != nil {
801+
return err
802+
}
803+
pnpmCommand, err := pnpmcmd.NewCommand(cmdName, cleanArgs, buildConfiguration, serverDetails)
804+
if err != nil {
805+
return err
806+
}
807+
return commands.Exec(pnpmCommand)
808+
default:
809+
return runNativePackageManagerCmd("pnpm", append([]string{cmdName}, filteredArgs...))
810+
}
811+
}
812+
813+
// runNativePackageManagerCmd runs a package manager command directly, passing through stdio.
814+
func runNativePackageManagerCmd(binary string, args []string) error {
815+
cmd := exec.Command(binary, args...)
816+
cmd.Stdin = os.Stdin
817+
cmd.Stdout = os.Stdout
818+
cmd.Stderr = os.Stderr
819+
return cmd.Run()
820+
}
821+
822+
// extractPnpmOptionsFromArgs extracts all JFrog CLI options from pnpm command args.
823+
// Returns server details, cleaned args (with JFrog flags removed), and build configuration.
824+
func extractPnpmOptionsFromArgs(args []string) (serverDetails *coreConfig.ServerDetails, cleanArgs []string, buildConfig *build.BuildConfiguration, err error) {
825+
cleanArgs = append([]string(nil), args...)
826+
var serverID string
827+
cleanArgs, serverID, err = coreutils.ExtractServerIdFromCommand(cleanArgs)
828+
if err != nil {
829+
return nil, nil, nil, fmt.Errorf("failed to extract server ID: %w", err)
830+
}
831+
serverDetails, err = coreConfig.GetSpecificConfig(serverID, true, true)
832+
if err != nil {
833+
return nil, nil, nil, fmt.Errorf("failed to get server configuration for ID '%s': %w", serverID, err)
834+
}
835+
cleanArgs, buildConfig, err = build.ExtractBuildDetailsFromArgs(cleanArgs)
836+
if err != nil {
837+
return nil, nil, nil, err
838+
}
839+
return serverDetails, cleanArgs, buildConfig, nil
840+
}
841+
774842
func NugetCmd(c *cli.Context) error {
775843
if show, err := cliutils.ShowCmdHelpIfNeeded(c, c.Args()); show || err != nil {
776844
return err
@@ -1790,12 +1858,8 @@ func pythonCmd(c *cli.Context, projectType project.ProjectType) error {
17901858
log.Info(fmt.Sprintf("Publishing to repository: %s (from --repository flag)", deployerRepo))
17911859
}
17921860

1793-
// Execute native poetry command directly (similar to Maven FlexPack)
17941861
log.Info(fmt.Sprintf("Running Poetry %s.", cmdName))
1795-
poetryCmd := exec.Command("poetry", append([]string{cmdName}, poetryArgs...)...)
1796-
poetryCmd.Stdout = os.Stdout
1797-
poetryCmd.Stderr = os.Stderr
1798-
if err := poetryCmd.Run(); err != nil {
1862+
if err := runNativePackageManagerCmd("poetry", append([]string{cmdName}, poetryArgs...)); err != nil {
17991863
return fmt.Errorf("poetry %s failed: %w", cmdName, err)
18001864
}
18011865

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package pnpmcommand
2+
3+
var Usage = []string{"pnpm <pnpm arguments> [command options]"}
4+
5+
func GetDescription() string {
6+
return "Run pnpm command."
7+
}
8+
9+
func GetArguments() string {
10+
return ` install, i Run pnpm install.
11+
publish, p Packs and deploys the pnpm package to the designated npm repository.
12+
help, h`
13+
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ require (
248248

249249
//replace github.com/jfrog/jfrog-cli-core/v2 => ../jfrog-cli-core
250250

251-
// replace github.com/jfrog/jfrog-cli-artifactory => github.com/fluxxBot/jfrog-cli-artifactory v0.0.0-20260130044429-464a5025d08a
251+
replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260311125605-d3731795ec05
252252

253253
//replace github.com/jfrog/build-info-go => github.com/fluxxBot/build-info-go v1.10.10-0.20260105070825-d3f36f619ba5
254254

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -419,8 +419,8 @@ github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYL
419419
github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w=
420420
github.com/jfrog/jfrog-cli-application v1.0.2-0.20260216085810-1ade6c26b3df h1:raSyae8/h1y8HtzFLf7vZZj91fP/qD94AX+biwBJiqs=
421421
github.com/jfrog/jfrog-cli-application v1.0.2-0.20260216085810-1ade6c26b3df/go.mod h1:xum2HquWO5uExa/A7MQs3TgJJVEeoqTR+6Z4mfBr1Xw=
422-
github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260310063831-ad6064f2f373 h1:9rgBl0MuJfPX6khjwai0jqwOOCkytTH0DOEcmih1PRQ=
423-
github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260310063831-ad6064f2f373/go.mod h1:zjbDerW+Pin6VExtlgwRtpnvtI/ySJTnmqnOwXbsrmc=
422+
github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260311125605-d3731795ec05 h1:TN9XIVdj0nV/VaRqAijezreez6wxtv5qDGQqCc2SSsQ=
423+
github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260311125605-d3731795ec05/go.mod h1:zjbDerW+Pin6VExtlgwRtpnvtI/ySJTnmqnOwXbsrmc=
424424
github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260225195817-bc599cec3973 h1:awB01Y4m0cWzmXuR3waf5IQnoQxDlbUmqT+FMWOpjbs=
425425
github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260225195817-bc599cec3973/go.mod h1:yhi+XpiEx18a3t8CZ6M2VpAf3EGqKpBhTzoPBTFe0dk=
426426
github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20260202100913-d9ee9476845a h1:lTOAhUjKcOmM/0Kbj4V+I/VHPlW7YNAhIEVpGnCM5mI=

utils/cliutils/commandsflags.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ const (
5656
Npm = "npm"
5757
NpmInstallCi = "npm-install-ci"
5858
NpmPublish = "npm-publish"
59+
Pnpm = "pnpm"
5960
PnpmConfig = "pnpm-config"
6061
YarnConfig = "yarn-config"
6162
Yarn = "yarn"
@@ -1933,6 +1934,9 @@ var commandFlags = map[string][]string{
19331934
PnpmConfig: {
19341935
global, serverIdResolve, repoResolve,
19351936
},
1937+
Pnpm: {
1938+
BuildName, BuildNumber, module, Project,
1939+
},
19361940
YarnConfig: {
19371941
global, serverIdResolve, repoResolve,
19381942
},

0 commit comments

Comments
 (0)