You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

api.go 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package npm
  4. import (
  5. "encoding/base64"
  6. "encoding/hex"
  7. "fmt"
  8. "net/url"
  9. "sort"
  10. packages_model "code.gitea.io/gitea/models/packages"
  11. npm_module "code.gitea.io/gitea/modules/packages/npm"
  12. "code.gitea.io/gitea/modules/setting"
  13. )
  14. func createPackageMetadataResponse(registryURL string, pds []*packages_model.PackageDescriptor) *npm_module.PackageMetadata {
  15. sort.Slice(pds, func(i, j int) bool {
  16. return pds[i].SemVer.LessThan(pds[j].SemVer)
  17. })
  18. versions := make(map[string]*npm_module.PackageMetadataVersion)
  19. distTags := make(map[string]string)
  20. for _, pd := range pds {
  21. versions[pd.SemVer.String()] = createPackageMetadataVersion(registryURL, pd)
  22. for _, pvp := range pd.VersionProperties {
  23. if pvp.Name == npm_module.TagProperty {
  24. distTags[pvp.Value] = pd.Version.Version
  25. }
  26. }
  27. }
  28. latest := pds[len(pds)-1]
  29. metadata := latest.Metadata.(*npm_module.Metadata)
  30. return &npm_module.PackageMetadata{
  31. ID: latest.Package.Name,
  32. Name: latest.Package.Name,
  33. DistTags: distTags,
  34. Description: metadata.Description,
  35. Readme: metadata.Readme,
  36. Homepage: metadata.ProjectURL,
  37. Author: npm_module.User{Name: metadata.Author},
  38. License: metadata.License,
  39. Versions: versions,
  40. Repository: metadata.Repository,
  41. }
  42. }
  43. func createPackageMetadataVersion(registryURL string, pd *packages_model.PackageDescriptor) *npm_module.PackageMetadataVersion {
  44. hashBytes, _ := hex.DecodeString(pd.Files[0].Blob.HashSHA512)
  45. metadata := pd.Metadata.(*npm_module.Metadata)
  46. return &npm_module.PackageMetadataVersion{
  47. ID: fmt.Sprintf("%s@%s", pd.Package.Name, pd.Version.Version),
  48. Name: pd.Package.Name,
  49. Version: pd.Version.Version,
  50. Description: metadata.Description,
  51. Author: npm_module.User{Name: metadata.Author},
  52. Homepage: metadata.ProjectURL,
  53. License: metadata.License,
  54. Dependencies: metadata.Dependencies,
  55. BundleDependencies: metadata.BundleDependencies,
  56. DevDependencies: metadata.DevelopmentDependencies,
  57. PeerDependencies: metadata.PeerDependencies,
  58. OptionalDependencies: metadata.OptionalDependencies,
  59. Readme: metadata.Readme,
  60. Bin: metadata.Bin,
  61. Dist: npm_module.PackageDistribution{
  62. Shasum: pd.Files[0].Blob.HashSHA1,
  63. Integrity: "sha512-" + base64.StdEncoding.EncodeToString(hashBytes),
  64. Tarball: fmt.Sprintf("%s/%s/-/%s/%s", registryURL, url.QueryEscape(pd.Package.Name), url.PathEscape(pd.Version.Version), url.PathEscape(pd.Files[0].File.LowerName)),
  65. },
  66. }
  67. }
  68. func createPackageSearchResponse(pds []*packages_model.PackageDescriptor, total int64) *npm_module.PackageSearch {
  69. objects := make([]*npm_module.PackageSearchObject, 0, len(pds))
  70. for _, pd := range pds {
  71. metadata := pd.Metadata.(*npm_module.Metadata)
  72. scope := metadata.Scope
  73. if scope == "" {
  74. scope = "unscoped"
  75. }
  76. objects = append(objects, &npm_module.PackageSearchObject{
  77. Package: &npm_module.PackageSearchPackage{
  78. Scope: scope,
  79. Name: metadata.Name,
  80. Version: pd.Version.Version,
  81. Date: pd.Version.CreatedUnix.AsLocalTime(),
  82. Description: metadata.Description,
  83. Author: npm_module.User{Name: metadata.Author},
  84. Publisher: npm_module.User{Name: pd.Owner.Name},
  85. Maintainers: []npm_module.User{}, // npm cli needs this field
  86. Keywords: metadata.Keywords,
  87. Links: &npm_module.PackageSearchPackageLinks{
  88. Registry: setting.AppURL + "api/packages/" + pd.Owner.Name + "/npm",
  89. Homepage: metadata.ProjectURL,
  90. },
  91. },
  92. })
  93. }
  94. return &npm_module.PackageSearch{
  95. Objects: objects,
  96. Total: total,
  97. }
  98. }