package lib import ( "encoding/json" "fmt" "net/http" ) type PackageResponse struct { Name string `json:"name"` Version string `json:"version"` Versions map[string]PackageRelease `json:"versions"` } func GetPackageInfo(name string) (PackageResponse, error) { url := fmt.Sprintf("https://registry.npmjs.com/%s", name) var pr PackageResponse req, _ := http.NewRequest(http.MethodGet, url, nil) req.Header.Set("Accept", "application/json") resp, err := http.DefaultClient.Do(req) if err != nil { return pr, fmt.Errorf("could not get package info: %w", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return pr, fmt.Errorf("Got a non 200 status code '%s': %v", resp.Status, resp.StatusCode) } if err := json.NewDecoder(resp.Body).Decode(&pr); err != nil { return pr, fmt.Errorf("could not decode json payload: %w", err) } return pr, nil } type PackageRelease struct { Name string `json:"name"` VersionNumber string `json:"version"` ID string `json:"_id"` Dependencies map[string]string `json:"dependencies"` DevDependencies map[string]string `json:"devDependencies"` OptionalDependencies map[string]string `json:"optionalDependencies"` Dist Distribution `json:"dist"` } func (v PackageRelease) TarURL() string { return fmt.Sprintf("https://registry.npmjs.org/%s/-/%[1]s-%s.tgz", v.Name, v.VersionNumber) } type Distribution struct { Sum string `json:"shasum"` Tarball string `json:"tarball"` }