Select Git revision
v3.ts 4.21 KiB
import * as semver from 'semver';
import { XmlDocument } from 'xmldoc';
import { logger } from '../../logger';
import * as globalCache from '../../util/cache/global';
import { Http } from '../../util/http';
import { ReleaseResult } from '../common';
import { id } from './common';
const http = new Http(id);
// https://api.nuget.org/v3/index.json is a default official nuget feed
const defaultNugetFeed = 'https://api.nuget.org/v3/index.json';
const cacheNamespace = 'datasource-nuget';
export function getDefaultFeed(): string {
return defaultNugetFeed;
}
export async function getQueryUrl(url: string): Promise<string | null> {
// https://docs.microsoft.com/en-us/nuget/api/search-query-service-resource
const resourceType = 'SearchQueryService';
const cacheKey = `${url}:${resourceType}`;
const cachedResult = await globalCache.get<string>(cacheNamespace, cacheKey);
// istanbul ignore if
if (cachedResult !== undefined) {
return cachedResult;
}
try {
// TODO: fix types
const servicesIndexRaw = await http.getJson<any>(url);
const searchQueryService = servicesIndexRaw.body.resources.find(
(resource) =>
resource['@type'] && resource['@type'].startsWith(resourceType)
);
const searchQueryServiceId = searchQueryService['@id'];
const cacheMinutes = 60;
await globalCache.set(
cacheNamespace,
cacheKey,
searchQueryServiceId,
cacheMinutes
);
return searchQueryServiceId;
} catch (e) {
logger.debug(
{ e },
`nuget registry failure: can't get SearchQueryService form ${url}`
);
return null;
}
}
export async function getReleases(
registryUrl: string,
feedUrl: string,
pkgName: string
): Promise<ReleaseResult | null> {
let queryUrl = `${feedUrl}?q=${pkgName}`;
if (registryUrl.toLowerCase() === defaultNugetFeed.toLowerCase()) {
queryUrl = queryUrl.replace('q=', 'q=PackageId:');
queryUrl += '&semVerLevel=2.0.0&prerelease=true';
}
const dep: ReleaseResult = {
pkgName,
releases: [],
};