@@ -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+
774842func 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
0 commit comments