@@ -4,6 +4,22 @@ import * as os from 'node:os';
44import * as path from 'node:path' ;
55import { s as semverExports } from './semver.mjs' ;
66
7+ var NugetServiceType = /* @__PURE__ */ ( ( NugetServiceType2 ) => {
8+ NugetServiceType2 [ "Catalog" ] = "Catalog" ;
9+ NugetServiceType2 [ "PackageBaseAddress" ] = "PackageBaseAddress" ;
10+ NugetServiceType2 [ "PackageDetailsUriTemplate" ] = "PackageDetailsUriTemplate" ;
11+ NugetServiceType2 [ "PackagePublish" ] = "PackagePublish" ;
12+ NugetServiceType2 [ "ReadmeUriTemplate" ] = "ReadmeUriTemplate" ;
13+ NugetServiceType2 [ "RegistrationsBaseUrl" ] = "RegistrationsBaseUrl" ;
14+ NugetServiceType2 [ "ReportAbuseUriTemplate" ] = "ReportAbuseUriTemplate" ;
15+ NugetServiceType2 [ "RepositorySignatures" ] = "RepositorySignatures" ;
16+ NugetServiceType2 [ "SearchAutocompleteService" ] = "SearchAutocompleteService" ;
17+ NugetServiceType2 [ "SearchQueryService" ] = "SearchQueryService" ;
18+ NugetServiceType2 [ "SymbolPackagePublish" ] = "SymbolPackagePublish" ;
19+ NugetServiceType2 [ "VulnerabilityInfo" ] = "VulnerabilityInfo" ;
20+ return NugetServiceType2 ;
21+ } ) ( NugetServiceType || { } ) ;
22+
723class ArgumentsBuilder {
824 args = [ ] ;
925 isWindows = os . platform ( ) === "win32" ;
@@ -167,7 +183,6 @@ class DotnetTool {
167183 constructor ( buildAgent ) {
168184 this . buildAgent = buildAgent ;
169185 }
170- static nugetRoot = "https://azuresearch-usnc.nuget.org/query" ;
171186 disableTelemetry ( ) {
172187 this . buildAgent . info ( "Disable Telemetry" ) ;
173188 this . buildAgent . setVariable ( "DOTNET_CLI_TELEMETRY_OPTOUT" , "true" ) ;
@@ -318,23 +333,58 @@ class DotnetTool {
318333 }
319334 return path . normalize ( workDir ) ;
320335 }
321- async queryLatestMatch ( toolName , versionSpec , includePrerelease ) {
322- this . buildAgent . info (
323- `Querying tool versions for ${ toolName } ${ versionSpec ? `@${ versionSpec } ` : "" } ${ includePrerelease ? "including pre-releases" : "" } `
324- ) ;
336+ async getQueryServices ( ) {
337+ const builder = new ArgumentsBuilder ( ) . addArgument ( "nuget" ) . addArgument ( "list" ) . addArgument ( "source" ) . addKeyValue ( "format" , "short" ) ;
338+ const result = await this . execute ( "dotnet" , builder . build ( ) ) ;
339+ const nugetSources = [
340+ ...( result . stdout ?? "" ) . matchAll ( / ^ E (?< index > .+ ) / gm)
341+ ] . map ( ( m ) => m . groups . index ) ;
342+ if ( ! nugetSources . length ) {
343+ this . buildAgent . error ( "Failed to fetch an enabled package source for dotnet." ) ;
344+ return [ ] ;
345+ }
346+ const sources = [ ] ;
347+ for ( const nugetSource of nugetSources ) {
348+ const nugetIndex = await fetch ( nugetSource ) ;
349+ if ( ! nugetIndex ?. ok ) {
350+ this . buildAgent . warn ( `Failed to fetch data from NuGet source ${ nugetSource } .` ) ;
351+ continue ;
352+ }
353+ const resources = ( await nugetIndex . json ( ) ) ?. resources ;
354+ const serviceUrl = resources ?. find ( ( s ) => s [ "@type" ] . startsWith ( NugetServiceType . SearchQueryService ) ) ?. [ "@id" ] ;
355+ if ( ! serviceUrl ) {
356+ this . buildAgent . warn ( `Could not find a ${ NugetServiceType . SearchQueryService } in NuGet source ${ nugetSource } ` ) ;
357+ continue ;
358+ }
359+ sources . push ( serviceUrl ) ;
360+ }
361+ return sources ;
362+ }
363+ async queryVersionsFromNugetSource ( serviceUrl , toolName , includePrerelease ) {
325364 const toolNameParam = encodeURIComponent ( toolName . toLowerCase ( ) ) ;
326365 const prereleaseParam = includePrerelease ? "true" : "false" ;
327- const downloadPath = `${ DotnetTool . nugetRoot } ?q=${ toolNameParam } &prerelease=${ prereleaseParam } &semVerLevel=2.0.0&take=1` ;
366+ const downloadPath = `${ serviceUrl } ?q=${ toolNameParam } &prerelease=${ prereleaseParam } &semVerLevel=2.0.0&take=1` ;
328367 const response = await fetch ( downloadPath ) ;
329368 if ( ! response || ! response . ok ) {
330- this . buildAgent . info ( `failed to query latest version for ${ toolName } from ${ downloadPath } . Status code: ${ response ? response . status : "unknown" } ` ) ;
331- return null ;
369+ this . buildAgent . warn ( `failed to query latest version for ${ toolName } from ${ downloadPath } . Status code: ${ response ? response . status : "unknown" } ` ) ;
370+ return [ ] ;
332371 }
333372 const { data } = await response . json ( ) ;
334373 const versions = data [ 0 ] . versions . map ( ( x ) => x . version ) ;
335- if ( ! versions || ! versions . length ) {
374+ return versions ?? [ ] ;
375+ }
376+ async queryLatestMatch ( toolName , versionSpec , includePrerelease ) {
377+ this . buildAgent . info (
378+ `Querying tool versions for ${ toolName } ${ versionSpec ? `@${ versionSpec } ` : "" } ${ includePrerelease ? "including pre-releases" : "" } `
379+ ) ;
380+ const queryServices = await this . getQueryServices ( ) ;
381+ if ( ! queryServices . length ) {
336382 return null ;
337383 }
384+ let versions = ( await Promise . all (
385+ queryServices . map ( async ( service ) => await this . queryVersionsFromNugetSource ( service , toolName , includePrerelease ) )
386+ ) ) . flat ( ) ;
387+ versions = [ ...new Set ( versions ) ] ;
338388 this . buildAgent . debug ( `got versions: ${ versions . join ( ", " ) } ` ) ;
339389 const version = semverExports . maxSatisfying ( versions , versionSpec , { includePrerelease } ) ;
340390 if ( version ) {
0 commit comments