Skip to content

Commit bb4185a

Browse files
committed
feat: Don't encode : in the name component
1 parent 719de7e commit bb4185a

File tree

3 files changed

+56
-35
lines changed

3 files changed

+56
-35
lines changed

src/encode.js

+7
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ const { isNonEmptyString } = require('./strings')
1010

1111
const { encodeURIComponent } = globalThis
1212

13+
function encodeName(name) {
14+
return isNonEmptyString(name)
15+
? encodeURIComponent(name).replace(/%3A/g, ':')
16+
: ''
17+
}
18+
1319
function encodeNamespace(namespace) {
1420
return isNonEmptyString(namespace)
1521
? encodeURIComponent(namespace)
@@ -63,6 +69,7 @@ function replacePlusSignWithPercentEncodedSpace(str) {
6369
}
6470

6571
module.exports = {
72+
encodeName,
6673
encodeNamespace,
6774
encodeVersion,
6875
encodeQualifiers,

src/purl-component.js

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict'
22

33
const {
4+
encodeName,
45
encodeNamespace,
56
encodeVersion,
67
encodeQualifiers,
@@ -66,6 +67,7 @@ module.exports = {
6667
PurlComponent: createHelpersNamespaceObject(
6768
{
6869
encode: {
70+
name: encodeName,
6971
namespace: encodeNamespace,
7072
version: encodeVersion,
7173
qualifiers: encodeQualifiers,

test/data/contrib-tests.json

+47-35
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
[
22
{
3-
"description": "scheme is lowercased",
4-
"purl": "PkG:type/foo/bar@1.0.0",
5-
"canonical_purl": "pkg:type/foo/bar@1.0.0",
6-
"type": "type",
7-
"namespace": "foo",
8-
"name": "bar",
9-
"version": "1.0.0",
10-
"qualifiers": null,
3+
"description": "debian can have debian versions as part of version with plus sign",
4+
"purl": "pkg:deb/debian/libssl1.1@1.1.1n-0+deb10u3?arch=amd64&distro=debian-10",
5+
"canonical_purl": "pkg:deb/debian/libssl1.1@1.1.1n-0+deb10u3?arch=amd64&distro=debian-10",
6+
"type": "deb",
7+
"namespace": "debian",
8+
"name": "libssl1.1",
9+
"version": "1.1.1n-0+deb10u3",
10+
"qualifiers": {"arch": "amd64", "distro": "debian-10"},
1111
"subpath": null,
1212
"is_invalid": false
1313
},
@@ -23,18 +23,6 @@
2323
"subpath": null,
2424
"is_invalid": false
2525
},
26-
{
27-
"description": "debian can have debian versions as part of version with plus sign",
28-
"purl": "pkg:deb/debian/[email protected]+deb10u3?arch=amd64&distro=debian-10",
29-
"canonical_purl": "pkg:deb/debian/[email protected]+deb10u3?arch=amd64&distro=debian-10",
30-
"type": "deb",
31-
"namespace": "debian",
32-
"name": "libssl1.1",
33-
"version": "1.1.1n-0+deb10u3",
34-
"qualifiers": {"arch": "amd64", "distro": "debian-10"},
35-
"subpath": null,
36-
"is_invalid": false
37-
},
3826
{
3927
"description": "valid go purl with namespace that has more than one forward slash",
4028
"purl": "pkg:golang/github.com/cncf/xds/[email protected]",
@@ -47,6 +35,18 @@
4735
"subpath": null,
4836
"is_invalid": false
4937
},
38+
{
39+
"description": "maven requires a namespace",
40+
"purl": "pkg:maven/[email protected]",
41+
"canonical_purl": "pkg:maven/[email protected]",
42+
"type": "maven",
43+
"namespace": null,
44+
"name": null,
45+
"version": null,
46+
"qualifiers": null,
47+
"subpath": null,
48+
"is_invalid": true
49+
},
5050
{
5151
"description": "validates pub name (valid)",
5252
"purl": "pkg:pub/[email protected]",
@@ -59,6 +59,18 @@
5959
"subpath": null,
6060
"is_invalid": false
6161
},
62+
{
63+
"description": "scheme is lowercased",
64+
"purl": "PkG:type/foo/[email protected]",
65+
"canonical_purl": "pkg:type/foo/[email protected]",
66+
"type": "type",
67+
"namespace": "foo",
68+
"name": "bar",
69+
"version": "1.0.0",
70+
"qualifiers": null,
71+
"subpath": null,
72+
"is_invalid": false
73+
},
6274
{
6375
"description": "namespace can contain special characters",
6476
"purl": "pkg:type/%40namespace%40%3F%23/[email protected]",
@@ -108,25 +120,25 @@
108120
"is_invalid": false
109121
},
110122
{
111-
"description": "maven requires a namespace",
112-
"purl": "pkg:maven/[email protected]",
113-
"canonical_purl": "pkg:maven/[email protected]",
114-
"type": "maven",
115-
"namespace": null,
116-
"name": null,
117-
"version": null,
123+
"description": "leading and trailing slashes '/' are not significant and should be stripped in the canonical form",
124+
"purl": "pkg:type//github.com///ll////[email protected]",
125+
"canonical_purl": "pkg:type/github.com/ll/[email protected]",
126+
"type": "type",
127+
"namespace": "github.com/ll",
128+
"name": "xlog",
129+
"version": "v1.0.0",
118130
"qualifiers": null,
119131
"subpath": null,
120-
"is_invalid": true
132+
"is_invalid": false
121133
},
122134
{
123-
"description": "leading and trailing slashes '/' are not significant and should be stripped in the canonical form",
124-
"purl": "pkg:golang//github.com///ll////xlog@v2.0.0",
125-
"canonical_purl": "pkg:golang/github.com/ll/xlog@v2.0.0",
126-
"type": "golang",
127-
"namespace": "github.com/ll",
128-
"name": "xlog",
129-
"version": "v2.0.0",
135+
"description": "the colon ':' does not need to be encoded as '%3A'",
136+
"purl": "pkg:type/fo:o/ba:r@v1.0.0",
137+
"canonical_purl": "pkg:type/fo:o/ba:r@v1.0.0",
138+
"type": "type",
139+
"namespace": "fo:o",
140+
"name": "ba:r",
141+
"version": "v1.0.0",
130142
"qualifiers": null,
131143
"subpath": null,
132144
"is_invalid": false

0 commit comments

Comments
 (0)