fix: resolves issues #3 and #4

This commit is contained in:
Sahilb315
2025-04-29 22:52:14 +05:30
parent 4f13dfbb40
commit cc0a6eddbc
5 changed files with 87 additions and 29 deletions
+20 -17
View File
@@ -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 {
npmPath, err := utils.GetExecutablePath("npm")
if err != nil {
fmt.Fprintf(os.Stderr, "npm not found: %v\n", err)
return err
}
// Check if it's an install command that needs scanning
if len(args) >= 2 && utils.IsInstallCommand("npm", args[0]) {
// Verify required environment variables before proceeding
if err := utils.ValidateEnvVars(); err != nil {
return err
}
action = args[0] action = args[0]
packageName = args[1] packageName = args[1]
validActions := map[string]bool{"install": true, "i": true, "add": true} if err := wrapNpm(); err != nil {
if validActions[action] {
err := wrapNpm()
if err != nil {
log.Errorf("Failed to wrap npm: %v", err)
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)
-1
View File
@@ -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)
} }
} }
+6 -5
View File
@@ -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()
} }
+37 -1
View File
@@ -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
}
+19
View File
@@ -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
}