@@ -23,9 +23,6 @@ pub enum RegistryError {
2323
2424 #[ error( "HTTP error for package '{url}': {status}" ) ]
2525 HttpError { url : String , status : StatusCode } ,
26-
27- #[ error( "Failed to load .npmrc config: {0}" ) ]
28- NpmrcLoadError ( #[ from] npmrc_config_rs:: Error ) ,
2926}
3027
3128/// Registry responses such as https://registry.npmjs.org/colors
@@ -60,18 +57,10 @@ pub struct LiveRegistryClient {
6057#[ async_trait:: async_trait]
6158impl RegistryClient for LiveRegistryClient {
6259 async fn fetch ( & self , update_url : & UpdateUrl ) -> Result < AllPackageVersions , RegistryError > {
63- // Build full URL from package name using .npmrc config
64- let registry_base = self . registry_url ( & update_url. package_name ) ;
65- let full_url = registry_base
66- . join ( & update_url. package_name )
67- . map_err ( |e| RegistryError :: FetchError {
68- url : update_url. package_name . clone ( ) ,
69- source : Box :: new ( e) ,
70- } ) ?;
60+ let ( full_url, registry_base) = self . resolve_url ( & update_url. package_name ) ?;
7161 let url_str = full_url. to_string ( ) ;
7262
73- // Build request with auth if credentials exist
74- let mut req = self . client . get ( full_url. clone ( ) ) . header ( ACCEPT , "application/json" ) ;
63+ let mut req = self . client . get ( full_url) . header ( ACCEPT , "application/json" ) ;
7564 if let Some ( creds) = self . npmrc . credentials_for ( & registry_base) {
7665 req = match & creds {
7766 Credentials :: Token { token, .. } => req. bearer_auth ( token) ,
@@ -94,10 +83,7 @@ impl RegistryClient for LiveRegistryClient {
9483 let versions = package_meta
9584 . versions
9685 . into_iter ( )
97- . filter ( |( _, metadata) | {
98- // Filter out deprecated versions by checking if "deprecated" field exists
99- metadata. get ( "deprecated" ) . is_none ( )
100- } )
86+ . filter ( |( _, metadata) | metadata. get ( "deprecated" ) . is_none ( ) )
10187 . map ( |( version, _) | version)
10288 . collect ( ) ;
10389 Ok ( AllPackageVersions {
@@ -121,25 +107,31 @@ impl RegistryClient for LiveRegistryClient {
121107}
122108
123109impl LiveRegistryClient {
124- pub fn new ( ) -> Result < Self , RegistryError > {
125- let npmrc = NpmrcConfig :: load ( ) ?;
126- Ok ( LiveRegistryClient {
110+ pub fn new ( npmrc : NpmrcConfig ) -> Self {
111+ LiveRegistryClient {
127112 client : Client :: builder ( )
128113 . connect_timeout ( Duration :: from_secs ( 5 ) )
129114 . timeout ( Duration :: from_secs ( 30 ) )
130115 . build ( )
131116 . expect ( "Failed to build reqwest client" ) ,
132117 npmrc,
133- } )
118+ }
134119 }
135120
136- /// Resolve registry URL for a package, with JSR fallback
137- pub fn registry_url ( & self , package_name : & str ) -> Url {
138- let url = self . npmrc . registry_for ( package_name) ;
139- // Fallback: @jsr/* uses npm.jsr.io if not explicitly configured
140- if package_name. starts_with ( "@jsr/" ) && url. host_str ( ) == Some ( "registry.npmjs.org" ) {
141- return Url :: parse ( "https://npm.jsr.io/" ) . unwrap ( ) ;
121+ /// Resolve the full registry URL for a package name.
122+ ///
123+ /// Uses .npmrc scoped registry config, with a fallback to npm.jsr.io
124+ /// for @jsr/* packages that have no explicit registry configured.
125+ /// Returns (full_url, registry_base) so callers can look up credentials.
126+ pub fn resolve_url ( & self , package_name : & str ) -> Result < ( Url , Url ) , RegistryError > {
127+ let mut registry_base = self . npmrc . registry_for ( package_name) ;
128+ if package_name. starts_with ( "@jsr/" ) && registry_base. host_str ( ) == Some ( "registry.npmjs.org" ) {
129+ registry_base = Url :: parse ( "https://npm.jsr.io/" ) . unwrap ( ) ;
142130 }
143- url
131+ let full_url = registry_base. join ( package_name) . map_err ( |e| RegistryError :: FetchError {
132+ url : package_name. to_string ( ) ,
133+ source : Box :: new ( e) ,
134+ } ) ?;
135+ Ok ( ( full_url, registry_base) )
144136 }
145137}
0 commit comments