mirror of
https://github.com/safedep/pmg.git
synced 2026-08-03 07:24:09 +02:00
+25
-22
@@ -20,46 +20,49 @@ import (
|
|||||||
var (
|
var (
|
||||||
packageName string
|
packageName string
|
||||||
action string
|
action string
|
||||||
silentScan bool
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewNpmCommand() *cobra.Command {
|
func NewNpmCommand() *cobra.Command {
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "npm [action] [package]",
|
Use: "npm [action] [package]",
|
||||||
Short: "Scan packages from npm registry",
|
Short: "Scan packages from npm registry",
|
||||||
Args: cobra.MinimumNArgs(2),
|
DisableFlagParsing: true,
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
action = args[0]
|
npmPath, err := utils.GetExecutablePath("npm")
|
||||||
packageName = args[1]
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "npm not found: %v\n", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
validActions := map[string]bool{"install": true, "i": true, "add": true}
|
// Check if it's an install command that needs scanning
|
||||||
if validActions[action] {
|
if len(args) >= 2 && utils.IsInstallCommand("npm", args[0]) {
|
||||||
err := wrapNpm()
|
// Verify required environment variables before proceeding
|
||||||
if err != nil {
|
if err := utils.ValidateEnvVars(); err != nil {
|
||||||
log.Errorf("Failed to wrap npm: %v", err)
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
action = args[0]
|
||||||
|
packageName = args[1]
|
||||||
|
|
||||||
|
if err := wrapNpm(); err != nil {
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// For non-install actions, just pass through to npm
|
// For non-install commands, pass through to npm
|
||||||
npmPath, err := utils.GetExecutablePath("npm")
|
if err := utils.ExecCmd(npmPath, args, []string{}); err != nil {
|
||||||
if err != nil {
|
os.Exit(1)
|
||||||
return fmt.Errorf("npm not found: %w", err)
|
|
||||||
}
|
}
|
||||||
|
os.Exit(0)
|
||||||
return utils.ExecCmd(npmPath, args, []string{})
|
return nil
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
cmd.Flags().BoolVarP(&silentScan, "silent", "s", false,
|
|
||||||
"Silent scan to prevent rendering UI")
|
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
func wrapNpm() error {
|
func wrapNpm() error {
|
||||||
if !silentScan {
|
ui.StartProgressWriter()
|
||||||
ui.StartProgressWriter()
|
|
||||||
}
|
|
||||||
var progressTracker ui.ProgressTracker
|
var progressTracker ui.ProgressTracker
|
||||||
|
|
||||||
progressTracker = ui.TrackProgress(fmt.Sprintf("Scanning %s ", packageName), 1)
|
progressTracker = ui.TrackProgress(fmt.Sprintf("Scanning %s ", packageName), 1)
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ func main() {
|
|||||||
cmd.AddCommand(ecosystems.NewNpmCommand())
|
cmd.AddCommand(ecosystems.NewNpmCommand())
|
||||||
|
|
||||||
if err := cmd.Execute(); err != nil {
|
if err := cmd.Execute(); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
)
|
)
|
||||||
@@ -10,8 +9,10 @@ func ExecCmd(name string, args, env []string) error {
|
|||||||
cmd := exec.Command(name, args...)
|
cmd := exec.Command(name, args...)
|
||||||
cmd.Env = append(os.Environ(), env...)
|
cmd.Env = append(os.Environ(), env...)
|
||||||
|
|
||||||
if err := cmd.Run(); err != nil {
|
// Connect to standard streams
|
||||||
return fmt.Errorf("error running cmd %s: %s\n", name, err.Error())
|
cmd.Stdout = os.Stdout
|
||||||
}
|
cmd.Stderr = os.Stderr
|
||||||
return nil
|
cmd.Stdin = os.Stdin
|
||||||
|
|
||||||
|
return cmd.Run()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
package utils
|
package utils
|
||||||
|
|
||||||
import "os"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
func ApiKey() string {
|
func ApiKey() string {
|
||||||
return os.Getenv("SAFEDEP_API_KEY")
|
return os.Getenv("SAFEDEP_API_KEY")
|
||||||
@@ -13,3 +17,35 @@ func TenantDomain() string {
|
|||||||
func NpmAuthToken() string {
|
func NpmAuthToken() string {
|
||||||
return os.Getenv("NPM_AUTH_TOKEN")
|
return os.Getenv("NPM_AUTH_TOKEN")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ValidateEnvVars() error {
|
||||||
|
apiKey := ApiKey()
|
||||||
|
tenantId := TenantDomain()
|
||||||
|
var missingVars []string
|
||||||
|
|
||||||
|
if apiKey == "" {
|
||||||
|
missingVars = append(missingVars, "SAFEDEP_API_KEY")
|
||||||
|
}
|
||||||
|
if tenantId == "" {
|
||||||
|
missingVars = append(missingVars, "SAFEDEP_TENANT_ID")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(missingVars) > 0 {
|
||||||
|
return fmt.Errorf(`
|
||||||
|
SafeDep configuration incomplete
|
||||||
|
|
||||||
|
Missing environment variables:
|
||||||
|
%s
|
||||||
|
|
||||||
|
To enable package scanning:
|
||||||
|
1. Export these variables in your terminal:
|
||||||
|
export %s=your_api_key
|
||||||
|
export %s=your_tenant_id
|
||||||
|
2. Or add them to your shell profile file
|
||||||
|
|
||||||
|
For more information, visit: https://docs.safedep.io/cloud/quickstart
|
||||||
|
`, strings.Join(missingVars, "\n "), missingVars[0], missingVars[len(missingVars)-1])
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -33,3 +33,22 @@ func ParsePackageInfo(input string) (packageName, version string, err error) {
|
|||||||
|
|
||||||
return "", "", fmt.Errorf("invalid format: expected 'package' OR 'package@version', got '%s'", input)
|
return "", "", fmt.Errorf("invalid format: expected 'package' OR 'package@version', got '%s'", input)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func IsInstallCommand(pkgManager, cmd string) bool {
|
||||||
|
validActions := map[string]map[string]bool{
|
||||||
|
"npm": {
|
||||||
|
"install": true,
|
||||||
|
"i": true,
|
||||||
|
"add": true,
|
||||||
|
},
|
||||||
|
"pnpm": {
|
||||||
|
"install": true,
|
||||||
|
"i": true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if actions, exists := validActions[pkgManager]; exists {
|
||||||
|
return actions[cmd]
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user