gowebbuild/npmproxy.go
2024-11-06 10:43:05 +01:00

88 lines
2.0 KiB
Go

package main
import (
"context"
"fmt"
"os"
"path/filepath"
"strings"
"github.com/trading-peter/gowebbuild/npmproxy"
"github.com/urfave/cli/v2"
)
func proxyAction(ctx *cli.Context) error {
cfgPath, err := filepath.Abs(ctx.String("c"))
if err != nil {
return err
}
projectDir := filepath.Dir(cfgPath)
os.Chdir(projectDir)
opts := readCfg(cfgPath)
return runProxy(ctx.Context, projectDir, opts)
}
func runProxy(ctx context.Context, projectDir string, opts []options) error {
overrides := []NpmProxyOverride{}
for _, o := range opts {
overrides = append(overrides, o.NpmProxy.Overrides...)
}
if len(overrides) == 0 {
return nil
}
fmt.Printf("Found %d npm overrides. Starting proxy server.\n", len(overrides))
// if fs.IsFile(filepath.Join(projectDir, ".npmrc")) {
// return fmt.Errorf(".npmrc file already exists in project root.")
// }
freePort := findFreePort(10000, 20000)
freePortInternal := findFreePort(20001, 30000)
if freePort == -1 || freePortInternal == -1 {
return fmt.Errorf("Failed to find free ports for proxy setup.")
}
list := []npmproxy.Override{}
npmrcRules := []string{
";CREATED BY GOWEBBUILD. DO NOT EDIT.",
";This file is used by the npm proxy server.",
";It is used to override the default registry for specific package namespaces.",
";This file will be removed after the proxy server is stopped.",
}
for _, o := range overrides {
list = append(list, npmproxy.Override{
Namespace: o.Namespace,
Upstream: o.Upstream,
PackageRoot: o.PackageRoot,
})
npmrcRules = append(npmrcRules, fmt.Sprintf("%s:registry=http://localhost:%d", o.Namespace, freePort))
}
err := os.WriteFile(filepath.Join(projectDir, ".npmrc"), []byte(strings.Join(npmrcRules, "\n")), 0644)
if err != nil {
return err
}
defer os.Remove(filepath.Join(projectDir, ".npmrc"))
proxy := npmproxy.New(
list,
projectDir,
npmproxy.WithPort(freePort),
npmproxy.WithInternalPort(freePortInternal),
)
proxy.Start(ctx)
fmt.Println("Stopped npm proxy server")
return nil
}