cli/azd/pkg/tools/npm/npm.go (84 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package npm
import (
"context"
"fmt"
"github.com/azure/azure-dev/cli/azd/pkg/exec"
"github.com/azure/azure-dev/cli/azd/pkg/tools"
"github.com/blang/semver/v4"
)
var _ tools.ExternalTool = (*Cli)(nil)
type Cli struct {
commandRunner exec.CommandRunner
}
func NewCli(commandRunner exec.CommandRunner) *Cli {
return &Cli{
commandRunner: commandRunner,
}
}
func (cli *Cli) versionInfoNode() tools.VersionInfo {
return tools.VersionInfo{
MinimumVersion: semver.Version{
Major: 18,
Minor: 0,
Patch: 0},
UpdateCommand: "Visit https://nodejs.org/en/ to upgrade",
}
}
func (cli *Cli) CheckInstalled(ctx context.Context) error {
err := tools.ToolInPath("npm")
if err != nil {
return err
}
//check node version
nodeRes, err := tools.ExecuteCommand(ctx, cli.commandRunner, "node", "--version")
if err != nil {
return fmt.Errorf("checking %s version: %w", cli.Name(), err)
}
nodeSemver, err := tools.ExtractVersion(nodeRes)
if err != nil {
return fmt.Errorf("converting to semver version fails: %w", err)
}
updateDetailNode := cli.versionInfoNode()
if nodeSemver.Compare(updateDetailNode.MinimumVersion) == -1 {
return &tools.ErrSemver{ToolName: "Node.js", VersionInfo: updateDetailNode}
}
return nil
}
func (cli *Cli) InstallUrl() string {
return "https://nodejs.org/"
}
func (cli *Cli) Name() string {
return "npm CLI"
}
func (cli *Cli) Install(ctx context.Context, project string) error {
runArgs := exec.
NewRunArgs("npm", "install").
WithCwd(project)
_, err := cli.commandRunner.Run(ctx, runArgs)
if err != nil {
return fmt.Errorf("failed to install project %s: %w", project, err)
}
return nil
}
func (cli *Cli) RunScript(ctx context.Context, projectPath string, scriptName string) error {
runArgs := exec.
NewRunArgs("npm", "run", scriptName, "--if-present").
WithCwd(projectPath)
_, err := cli.commandRunner.Run(ctx, runArgs)
if err != nil {
return fmt.Errorf("failed to run NPM script %s, %w", scriptName, err)
}
return nil
}
func (cli *Cli) Prune(ctx context.Context, projectPath string, production bool) error {
runArgs := exec.
NewRunArgs("npm", "prune").
WithCwd(projectPath)
if production {
runArgs = runArgs.AppendParams("--production")
}
_, err := cli.commandRunner.Run(ctx, runArgs)
if err != nil {
return fmt.Errorf("failed pruning NPM packages, %w", err)
}
return nil
}