gpm/lib/api.go

56 lines
1.6 KiB
Go

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"`
}