diff --git a/server/build.go b/server/build.go index 709234304..88c9dcec5 100644 --- a/server/build.go +++ b/server/build.go @@ -67,7 +67,24 @@ func (task *BuildTask) Build() (esm *ESMBuild, err error) { if cfg.NpmToken != "" { rcFilePath := path.Join(task.wd, ".npmrc") if !fileExists(rcFilePath) { - err = os.WriteFile(rcFilePath, []byte("_authToken=${ESM_NPM_TOKEN}"), 0644) + var output bytes.Buffer + + if cfg.NpmRegistryScope != "" && cfg.NpmRegistry != "" { + output.WriteString(fmt.Sprintf("%s:registry=%s\n", cfg.NpmRegistryScope, cfg.NpmRegistry)) + } else if cfg.NpmRegistryScope == "" && cfg.NpmRegistry != "" { + output.WriteString(fmt.Sprintf("registry=%s\n", cfg.NpmRegistry)) + } + + if cfg.NpmRegistry != "" && cfg.NpmToken != "" { + var tokenReg string + tokenReg, err = removeHttpPrefix(cfg.NpmRegistry) + if err != nil { + log.Errorf("Invalid npm registry in config: %v", err) + return + } + output.WriteString(fmt.Sprintf("%s:_authToken=${ESM_NPM_TOKEN}\n", tokenReg)) + } + err = os.WriteFile(rcFilePath, output.Bytes(), 0644) if err != nil { log.Errorf("Failed to create .npmrc file: %v", err) return diff --git a/server/config/config.go b/server/config/config.go index 9c6a9d4f0..659cb6160 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -26,6 +26,7 @@ type Config struct { BasePath string `json:"basePath,omitempty"` NpmRegistry string `json:"npmRegistry,omitempty"` NpmToken string `json:"npmToken,omitempty"` + NpmRegistryScope string `json:"npmRegistryScope,omitempty"` AuthSecret string `json:"authSecret,omitempty"` NoCompress bool `json:"noCompress,omitempty"` } diff --git a/server/npm.go b/server/npm.go index f44add48d..c55c5689b 100644 --- a/server/npm.go +++ b/server/npm.go @@ -199,6 +199,13 @@ func fetchPackageInfo(name string, version string) (info NpmPackage, err error) }() url := cfg.NpmRegistry + name + if cfg.NpmRegistryScope != "" { + isInScope := strings.HasPrefix(name, cfg.NpmRegistryScope) + if !isInScope { + url = "https://registry.npmjs.org/" + name + } + } + if isFullVersion { url += "/" + version } @@ -374,7 +381,6 @@ func pnpmInstall(wd string, packages ...string) (err error) { args, "--ignore-scripts", "--loglevel", "error", - "--registry", cfg.NpmRegistry, ) start := time.Now() cmd := exec.Command("pnpm", args...) diff --git a/server/utils.go b/server/utils.go index f6964c6c9..d1fecf47d 100644 --- a/server/utils.go +++ b/server/utils.go @@ -4,6 +4,7 @@ import ( "context" "encoding/base64" "errors" + "fmt" "net" "net/http" "os" @@ -285,3 +286,12 @@ func restorePurgeTimers(npmDir string) { } log.Debugf("Restored %d purge timers", len(pkgs)) } + +func removeHttpPrefix(s string) (string, error) { + for i, v := range s { + if v == ':' { + return s[i+1:], nil + } + } + return "", fmt.Errorf("Colon not found in string: %s", s) +}