const parse = require('github-url-from-git'); const got = require('got'); const xmlParser = require('fast-xml-parser'); const { isVersion, sortVersions } = require('../versioning/semver'); module.exports = { getPkgReleases, }; async function getPkgReleases(purl) { const { fullname: name } = purl; logger.trace(`nuget.getPkgReleases(${name})`); const pkgUrl = `https://api.nuget.org/v3-flatcontainer/${name.toLowerCase()}/index.json`; try { const res = (await got(pkgUrl, { json: true, retry: 5, })).body; const dep = { name, }; dep.releases = (res.versions || []) .filter(isVersion) .sort(sortVersions) .map(version => ({ version })); // look up nuspec for latest release to get repository const url = `https://api.nuget.org/v3-flatcontainer/${name.toLowerCase()}/${res.versions.pop()}/${name.toLowerCase()}.nuspec`; try { const result = await got(url); const nuspec = xmlParser.parse(result.body, { ignoreAttributes: false }); if (nuspec) { const repositoryUrl = parse( nuspec.package.metadata.repository['@_url'] ); if (repositoryUrl) { dep.repositoryUrl = repositoryUrl; } } } catch (err) /* istanbul ignore next */ { logger.debug({ dependency: name }, 'Error looking up nuspec'); } logger.trace({ dep }, 'dep'); return dep; } catch (err) { if (err.statusCode === 404 || err.code === 'ENOTFOUND') { logger.info({ dependency: name }, `Dependency lookup failure: not found`); logger.debug({ err, }); return null; } logger.warn({ err, name }, 'nuget registry failure: Unknown error'); return null; } }