From 7a3c2477992e27c345c2a9e4aea3067810488bc6 Mon Sep 17 00:00:00 2001 From: Ali Zulfiqar Date: Sat, 5 Sep 2026 21:59:37 +0500 Subject: [PATCH] Preserve package names inside npm prerelease versions Signed-off-by: Ali Zulfiqar --- src/packageurl/contrib/url2purl.py | 2 +- tests/contrib/test_url2purl.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/packageurl/contrib/url2purl.py b/src/packageurl/contrib/url2purl.py index 2353b0b..b27fd78 100644 --- a/src/packageurl/contrib/url2purl.py +++ b/src/packageurl/contrib/url2purl.py @@ -176,7 +176,7 @@ def build_npm_download_purl(uri): return base_filename, ext = os.path.splitext(filename) - version = base_filename.replace(name, "") + version = base_filename.removeprefix(name) if version.startswith("-"): version = version[1:] # Removes the "-" prefix diff --git a/tests/contrib/test_url2purl.py b/tests/contrib/test_url2purl.py index f1cc7f3..170d37b 100644 --- a/tests/contrib/test_url2purl.py +++ b/tests/contrib/test_url2purl.py @@ -97,3 +97,10 @@ class TestURL2PURLDataDriven(TestCase): build_tests(clazz=TestURL2PURLDataDriven, regen=False) + + +def test_npm_download_preserves_name_in_prerelease_version(): + for namespace in ("", "@scope/"): + url = f"https://registry.npmjs.org/{namespace}foo/-/foo-1.0.0-foo.1.tgz" + expected_namespace = "%40scope/" if namespace else "" + assert get_purl(url) == f"pkg:npm/{expected_namespace}foo@1.0.0-foo.1"