Skip to content

Commit 169c08e

Browse files
eleitheleithlunny
authored
support binary deploy in npm packages (#21589)
backport of #21372 for v1.17.4 ------------------- npm package.json supports binary packaging: https://docs.npmjs.com/cli/v8/configuring-npm/package-json#bin the npm registry documents that the binary references will be attached to the abbreviated version object: https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#abbreviated-version-object unfortunately their api documentation leaves this out: https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#abbreviated-version-objectdoc which is likely to be the reason this was left out in gitea's initial implementation this response is critical for npm to install the binary in the .bin folder so as to be included on the users default bin path, resulting in immediate access to any binaries provided by the package i have tested upload and installing through npm and can confirm the npm registry now responds with bin in the version metadata and results in the binary being available after install. this fixes #21303 Co-authored-by: eleith <[email protected]> Co-authored-by: Lunny Xiao <[email protected]>
1 parent d5856fe commit 169c08e

File tree

5 files changed

+17
-1
lines changed

5 files changed

+17
-1
lines changed

Diff for: integrations/api_packages_npm_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ func TestPackageNpm(t *testing.T) {
3434
packageTag2 := "release"
3535
packageAuthor := "KN4CK3R"
3636
packageDescription := "Test Description"
37+
packageBinName := "cli"
38+
packageBinPath := "./cli.sh"
3739

3840
data := "H4sIAAAAAAAA/ytITM5OTE/VL4DQelnF+XkMVAYGBgZmJiYK2MRBwNDcSIHB2NTMwNDQzMwAqA7IMDUxA9LUdgg2UFpcklgEdAql5kD8ogCnhwio5lJQUMpLzE1VslJQcihOzi9I1S9JLS7RhSYIJR2QgrLUouLM/DyQGkM9Az1D3YIiqExKanFyUWZBCVQ2BKhVwQVJDKwosbQkI78IJO/tZ+LsbRykxFXLNdA+HwWjYBSMgpENACgAbtAACAAA"
3941
upload := `{
@@ -51,6 +53,9 @@ func TestPackageNpm(t *testing.T) {
5153
"author": {
5254
"name": "` + packageAuthor + `"
5355
},
56+
"bin": {
57+
"` + packageBinName + `": "` + packageBinPath + `"
58+
},
5459
"dist": {
5560
"integrity": "sha512-yA4FJsVhetynGfOC1jFf79BuS+jrHbm0fhh+aHzCQkOaOBXKf9oBnC4a6DnLLnEsHQDRLYd00cwj8sCXpC+wIg==",
5661
"shasum": "aaa7eaf852a948b0aa05afeda35b1badca155d90"
@@ -150,6 +155,7 @@ func TestPackageNpm(t *testing.T) {
150155
assert.Equal(t, packageName, pmv.Name)
151156
assert.Equal(t, packageDescription, pmv.Description)
152157
assert.Equal(t, packageAuthor, pmv.Author.Name)
158+
assert.Equal(t, packageBinPath, pmv.Bin[packageBinName])
153159
assert.Equal(t, "sha512-yA4FJsVhetynGfOC1jFf79BuS+jrHbm0fhh+aHzCQkOaOBXKf9oBnC4a6DnLLnEsHQDRLYd00cwj8sCXpC+wIg==", pmv.Dist.Integrity)
154160
assert.Equal(t, "aaa7eaf852a948b0aa05afeda35b1badca155d90", pmv.Dist.Shasum)
155161
assert.Equal(t, fmt.Sprintf("%s%s/-/%s/%s", setting.AppURL, root[1:], packageVersion, filename), pmv.Dist.Tarball)

Diff for: modules/packages/npm/creator.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ type PackageMetadata struct {
6666
License string `json:"license,omitempty"`
6767
}
6868

69-
// PackageMetadataVersion https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#version
69+
// PackageMetadataVersion documentation: https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#version
70+
// PackageMetadataVersion response: https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#abbreviated-version-object
7071
type PackageMetadataVersion struct {
7172
ID string `json:"_id"`
7273
Name string `json:"name"`
@@ -80,6 +81,7 @@ type PackageMetadataVersion struct {
8081
Dependencies map[string]string `json:"dependencies,omitempty"`
8182
DevDependencies map[string]string `json:"devDependencies,omitempty"`
8283
PeerDependencies map[string]string `json:"peerDependencies,omitempty"`
84+
Bin map[string]string `json:"bin,omitempty"`
8385
OptionalDependencies map[string]string `json:"optionalDependencies,omitempty"`
8486
Readme string `json:"readme,omitempty"`
8587
Dist PackageDistribution `json:"dist"`
@@ -192,6 +194,7 @@ func ParsePackage(r io.Reader) (*Package, error) {
192194
DevelopmentDependencies: meta.DevDependencies,
193195
PeerDependencies: meta.PeerDependencies,
194196
OptionalDependencies: meta.OptionalDependencies,
197+
Bin: meta.Bin,
195198
Readme: meta.Readme,
196199
},
197200
}

Diff for: modules/packages/npm/creator_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ func TestParsePackage(t *testing.T) {
2323
packageVersion := "1.0.1-pre"
2424
packageTag := "latest"
2525
packageAuthor := "KN4CK3R"
26+
packageBin := "gitea"
2627
packageDescription := "Test Description"
2728
data := "H4sIAAAAAAAA/ytITM5OTE/VL4DQelnF+XkMVAYGBgZmJiYK2MRBwNDcSIHB2NTMwNDQzMwAqA7IMDUxA9LUdgg2UFpcklgEdAql5kD8ogCnhwio5lJQUMpLzE1VslJQcihOzi9I1S9JLS7RhSYIJR2QgrLUouLM/DyQGkM9Az1D3YIiqExKanFyUWZBCVQ2BKhVwQVJDKwosbQkI78IJO/tZ+LsbRykxFXLNdA+HwWjYBSMgpENACgAbtAACAAA"
2829
integrity := "sha512-yA4FJsVhetynGfOC1jFf79BuS+jrHbm0fhh+aHzCQkOaOBXKf9oBnC4a6DnLLnEsHQDRLYd00cwj8sCXpC+wIg=="
@@ -236,6 +237,9 @@ func TestParsePackage(t *testing.T) {
236237
Dependencies: map[string]string{
237238
"package": "1.2.0",
238239
},
240+
Bin: map[string]string{
241+
"bin": packageBin,
242+
},
239243
Dist: PackageDistribution{
240244
Integrity: integrity,
241245
},
@@ -264,6 +268,7 @@ func TestParsePackage(t *testing.T) {
264268
assert.Equal(t, packageDescription, p.Metadata.Description)
265269
assert.Equal(t, packageDescription, p.Metadata.Readme)
266270
assert.Equal(t, packageAuthor, p.Metadata.Author)
271+
assert.Equal(t, packageBin, p.Metadata.Bin["bin"])
267272
assert.Equal(t, "MIT", p.Metadata.License)
268273
assert.Equal(t, "https://gitea.io/", p.Metadata.ProjectURL)
269274
assert.Contains(t, p.Metadata.Dependencies, "package")

Diff for: modules/packages/npm/metadata.go

+1
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@ type Metadata struct {
2020
DevelopmentDependencies map[string]string `json:"development_dependencies,omitempty"`
2121
PeerDependencies map[string]string `json:"peer_dependencies,omitempty"`
2222
OptionalDependencies map[string]string `json:"optional_dependencies,omitempty"`
23+
Bin map[string]string `json:"bin,omitempty"`
2324
Readme string `json:"readme,omitempty"`
2425
}

Diff for: routers/api/packages/npm/api.go

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ func createPackageMetadataVersion(registryURL string, pd *packages_model.Package
6767
PeerDependencies: metadata.PeerDependencies,
6868
OptionalDependencies: metadata.OptionalDependencies,
6969
Readme: metadata.Readme,
70+
Bin: metadata.Bin,
7071
Dist: npm_module.PackageDistribution{
7172
Shasum: pd.Files[0].Blob.HashSHA1,
7273
Integrity: "sha512-" + base64.StdEncoding.EncodeToString(hashBytes),

0 commit comments

Comments
 (0)