56 lines
1.6 KiB
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"`
|
|
}
|