Skip to content
Snippets Groups Projects
Select Git revision
  • 0345b40a181134236d65ccebd450efd46700deb9
  • master default
2 results

v3.ts

Blame
  • 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: [],
      };