diff --git a/lib/datasource/nuget/v3.js b/lib/datasource/nuget/v3.js index dee96f9cfab4bb57aa5859754817474879f1d510..ec1bba090117bfac363dfe4ae80bfc33e84e6fab 100644 --- a/lib/datasource/nuget/v3.js +++ b/lib/datasource/nuget/v3.js @@ -10,6 +10,7 @@ module.exports = { // 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'; function getDefaultFeed() { return defaultNugetFeed; @@ -17,6 +18,15 @@ function getDefaultFeed() { async function getQueryUrl(url) { // https://docs.microsoft.com/en-us/nuget/api/search-query-service-resource + const resourceType = 'SearchQueryService'; + const cacheKey = `${url}:${resourceType}`; + const cachedResult = await renovateCache.get(cacheNamespace, cacheKey); + + // istanbul ignore if + if (cachedResult) { + return cachedResult; + } + try { const servicesIndexRaw = await got(url, { json: true, platform: 'nuget' }); if (servicesIndexRaw.statusCode !== 200) { @@ -27,9 +37,18 @@ async function getQueryUrl(url) { return null; } const searchQueryService = servicesIndexRaw.body.resources.find( - resource => resource['@type'] === 'SearchQueryService' + resource => resource['@type'] === resourceType + ); + const searchQueryServiceId = searchQueryService['@id']; + + const cacheMinutes = 60; + await renovateCache.set( + cacheNamespace, + cacheKey, + searchQueryServiceId, + cacheMinutes ); - return searchQueryService['@id']; + return searchQueryServiceId; } catch (e) { logger.debug( { e }, diff --git a/test/datasource/nuget.spec.js b/test/datasource/nuget.spec.js index 918e30907d38c6d6437219c8b7c7b99bd7a64e42..e1cc3abee454a59204838159c25b18f16d64e154 100644 --- a/test/datasource/nuget.spec.js +++ b/test/datasource/nuget.spec.js @@ -65,6 +65,7 @@ const configV3NotNugetOrg = { }; describe('datasource/nuget', () => { + beforeEach(() => global.renovateCache.rmAll()); describe('getPkgReleases', () => { beforeEach(() => { jest.resetAllMocks();