@@ -32,6 +32,7 @@ import (
3232 huggingfaceCommands "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/huggingface"
3333 "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/mvn"
3434 "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/npm"
35+ "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/pnpm"
3536 containerutils "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/ocicontainer"
3637 "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/terraform"
3738 "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/yarn"
@@ -67,6 +68,7 @@ import (
6768 "github.com/jfrog/jfrog-cli/docs/buildtools/mvnconfig"
6869 "github.com/jfrog/jfrog-cli/docs/buildtools/npmcommand"
6970 "github.com/jfrog/jfrog-cli/docs/buildtools/npmconfig"
71+ "github.com/jfrog/jfrog-cli/docs/buildtools/pnpmcommand"
7072 nugetdocs "github.com/jfrog/jfrog-cli/docs/buildtools/nuget"
7173 "github.com/jfrog/jfrog-cli/docs/buildtools/nugetconfig"
7274 "github.com/jfrog/jfrog-cli/docs/buildtools/pipconfig"
@@ -436,6 +438,17 @@ func GetCommands() []cli.Command {
436438 return cliutils .CreateConfigCmd (c , project .Pnpm )
437439 },
438440 },
441+ {
442+ Name : "pnpm" ,
443+ Flags : cliutils .GetCommandFlags (cliutils .Pnpm ),
444+ Usage : pnpmcommand .GetDescription (),
445+ HelpName : corecommon .CreateUsage ("pnpm" , pnpmcommand .GetDescription (), pnpmcommand .Usage ),
446+ UsageText : pnpmcommand .GetArguments (),
447+ SkipFlagParsing : true ,
448+ BashComplete : corecommon .CreateBashCompletionFunc ("install" , "i" , "publish" , "p" ),
449+ Category : buildToolsCategory ,
450+ Action : pnpmCmd ,
451+ },
439452 {
440453 Name : "docker" ,
441454 Flags : cliutils .GetCommandFlags (cliutils .Docker ),
@@ -490,7 +503,7 @@ func GetCommands() []cli.Command {
490503 Aliases : []string {"hf" },
491504 HelpName : corecommon .CreateUsage ("hugging-face" , huggingface .GetDescription (), huggingface .Usage ),
492505 Description : huggingface .GetDescription (),
493- Hidden : true ,
506+ Hidden : false ,
494507 Category : buildToolsCategory ,
495508 Action : func (c * cli.Context ) error {
496509 if c .Args ().Present () {
@@ -799,6 +812,64 @@ func YarnCmd(c *cli.Context) error {
799812 return commands .Exec (yarnCmd )
800813}
801814
815+ func pnpmCmd (c * cli.Context ) error {
816+ if show , err := cliutils .ShowCmdHelpIfNeeded (c , c .Args ()); show || err != nil {
817+ return err
818+ }
819+ if c .NArg () < 1 {
820+ return cliutils .WrongNumberOfArgumentsHandler (c )
821+ }
822+ args := cliutils .ExtractCommand (c )
823+ cmdName , filteredArgs := getCommandName (args )
824+
825+ // Extract JFrog-specific flags (--build-name, --build-number, --project, --module, --server-id)
826+ // once, so both supported commands and native pass-through use cleaned args.
827+ serverDetails , cleanArgs , buildConfiguration , err := extractPnpmOptionsFromArgs (filteredArgs )
828+ if err != nil {
829+ return err
830+ }
831+
832+ switch cmdName {
833+ case "install" , "i" , "publish" :
834+ pnpmCommand , err := pnpm .NewCommand (cmdName , cleanArgs , buildConfiguration , serverDetails )
835+ if err != nil {
836+ return err
837+ }
838+ return commands .Exec (pnpmCommand )
839+ default :
840+ return runNativePackageManagerCmd ("pnpm" , append ([]string {cmdName }, cleanArgs ... ))
841+ }
842+ }
843+
844+ // runNativePackageManagerCmd runs a package manager command directly, passing through stdio.
845+ func runNativePackageManagerCmd (binary string , args []string ) error {
846+ cmd := exec .Command (binary , args ... )
847+ cmd .Stdin = os .Stdin
848+ cmd .Stdout = os .Stdout
849+ cmd .Stderr = os .Stderr
850+ return cmd .Run ()
851+ }
852+
853+ // extractPnpmOptionsFromArgs extracts all JFrog CLI options from pnpm command args.
854+ // Returns server details, cleaned args (with JFrog flags removed), and build configuration.
855+ func extractPnpmOptionsFromArgs (args []string ) (serverDetails * coreConfig.ServerDetails , cleanArgs []string , buildConfig * build.BuildConfiguration , err error ) {
856+ cleanArgs = append ([]string (nil ), args ... )
857+ var serverID string
858+ cleanArgs , serverID , err = coreutils .ExtractServerIdFromCommand (cleanArgs )
859+ if err != nil {
860+ return nil , nil , nil , fmt .Errorf ("failed to extract server ID: %w" , err )
861+ }
862+ serverDetails , err = coreConfig .GetSpecificConfig (serverID , true , true )
863+ if err != nil {
864+ return nil , nil , nil , fmt .Errorf ("failed to get server configuration for ID '%s': %w" , serverID , err )
865+ }
866+ cleanArgs , buildConfig , err = build .ExtractBuildDetailsFromArgs (cleanArgs )
867+ if err != nil {
868+ return nil , nil , nil , err
869+ }
870+ return serverDetails , cleanArgs , buildConfig , nil
871+ }
872+
802873func NugetCmd (c * cli.Context ) error {
803874 if show , err := cliutils .ShowCmdHelpIfNeeded (c , c .Args ()); show || err != nil {
804875 return err
@@ -1070,7 +1141,7 @@ func buildCmd(c *cli.Context) error {
10701141 }
10711142
10721143 // Extract build configuration and arguments
1073- _ , rtDetails , _ , _ , _ , cleanArgs , buildConfiguration , err := extractDockerOptionsFromArgs (c .Args ())
1144+ _ , rtDetails , _ , skipLogin , _ , cleanArgs , buildConfiguration , err := extractDockerOptionsFromArgs (c .Args ())
10741145 if err != nil {
10751146 return err
10761147 }
@@ -1079,10 +1150,11 @@ func buildCmd(c *cli.Context) error {
10791150 return err
10801151 }
10811152
1082- // Login to the docker registry
1083- err = loginCmd (c )
1084- if err != nil {
1085- return err
1153+ if ! skipLogin {
1154+ err = loginCmd (c )
1155+ if err != nil {
1156+ return err
1157+ }
10861158 }
10871159
10881160 dockerOptions := strategies.DockerBuildOptions {
@@ -1852,12 +1924,8 @@ func pythonCmd(c *cli.Context, projectType project.ProjectType) error {
18521924 log .Info (fmt .Sprintf ("Publishing to repository: %s (from --repository flag)" , deployerRepo ))
18531925 }
18541926
1855- // Execute native poetry command directly (similar to Maven FlexPack)
18561927 log .Info (fmt .Sprintf ("Running Poetry %s." , cmdName ))
1857- poetryCmd := exec .Command ("poetry" , append ([]string {cmdName }, poetryArgs ... )... )
1858- poetryCmd .Stdout = os .Stdout
1859- poetryCmd .Stderr = os .Stderr
1860- if err := poetryCmd .Run (); err != nil {
1928+ if err := runNativePackageManagerCmd ("poetry" , append ([]string {cmdName }, poetryArgs ... )); err != nil {
18611929 return fmt .Errorf ("poetry %s failed: %w" , cmdName , err )
18621930 }
18631931
0 commit comments