@@ -513,6 +513,83 @@ def build_swift_download_url(purl):
513513 return f"https://{ namespace } /{ name } /archive/{ version } .zip"
514514
515515
516+ @download_router .route ("pkg:luarocks/.*" )
517+ def build_luarocks_download_url (purl ):
518+ """
519+ Return a LuaRocks download URL from the `purl` string.
520+ """
521+ purl_data = PackageURL .from_string (purl )
522+
523+ qualifiers = purl_data .qualifiers or {}
524+
525+ repository_url = qualifiers .get ("repository_url" , "https://luarocks.org" )
526+
527+ name = purl_data .name
528+ version = purl_data .version
529+
530+ if name and version :
531+ return f"{ repository_url } /{ name } -{ version } .src.rock"
532+
533+
534+ @download_router .route ("pkg:conda/.*" )
535+ def build_conda_download_url (purl ):
536+ """
537+ Resolve a Conda PURL to a real downloadable URL
538+
539+ Supported qualifiers:
540+ - channel: e.g., main, conda-forge (required for deterministic base)
541+ - subdir: e.g., linux-64, osx-arm64, win-64, noarch
542+ - build: exact build string (optional but recommended)
543+ - type: 'conda' or 'tar.bz2' (preference; fallback to whichever exists)
544+ """
545+ p = PackageURL .from_string (purl )
546+ if not p .name or not p .version :
547+ return None
548+
549+ q = p .qualifiers or {}
550+ name = p .name
551+ version = p .version
552+ build = q .get ("build" )
553+ channel = q .get ("channel" ) or "main"
554+ subdir = q .get ("subdir" ) or "noarch"
555+ req_type = q .get ("type" )
556+
557+ def _conda_base_for_channel (channel : str ) -> str :
558+ """
559+ Map a conda channel to its base URL.
560+ - 'main' / 'defaults' -> repo.anaconda.com
561+ - any other channel -> conda.anaconda.org/<channel>
562+ """
563+ ch = (channel or "" ).lower ()
564+ if ch in ("main" , "defaults" ):
565+ return "https://repo.anaconda.com/pkgs/main"
566+ return f"https://conda.anaconda.org/{ ch } "
567+
568+ base = _conda_base_for_channel (channel )
569+
570+ package_identifier = (
571+ f"{ name } -{ version } -{ build } .{ req_type } " if build else f"{ name } -{ version } .{ req_type } "
572+ )
573+
574+ download_url = f"{ base } /{ subdir } /{ package_identifier } "
575+ return download_url
576+
577+
578+ @download_router .route ("pkg:alpm/.*" )
579+ def build_alpm_download_url (purl_str ):
580+ purl = PackageURL .from_string (purl_str )
581+ name = purl .name
582+ version = purl .version
583+ arch = purl .qualifiers .get ("arch" , "any" )
584+
585+ if not name or not version :
586+ return None
587+
588+ first_letter = name [0 ]
589+ url = f"https://archive.archlinux.org/packages/{ first_letter } /{ name } /{ name } -{ version } -{ arch } .pkg.tar.zst"
590+ return url
591+
592+
516593def get_repo_download_url (purl ):
517594 """
518595 Return ``download_url`` if present in ``purl`` qualifiers or
0 commit comments