From ac09b9d7cd2a70a428bb57bcbfbd89811755e6db Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Mon, 15 Jan 2018 11:53:02 +0100
Subject: [PATCH] feat: cache npm results in memory per-run
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

We currently use got’s inbuilt caching for npmjs, however it still results in a roundtrip/304 even when cached. The when using presets is that a package like renovate-config-default gets looked up 10+ times unnecessarily. With this feature we assume that npm lookups don’t change for the duration of a run, and even if they did then we’d prefer the reliability of using the first lookup.

Closes #1389
---
 lib/manager/npm/registry.js         | 14 ++++++++++++++
 lib/workers/repository/init/apis.js |  1 +
 2 files changed, 15 insertions(+)

diff --git a/lib/manager/npm/registry.js b/lib/manager/npm/registry.js
index fb8ae67fdd..38a7879d19 100644
--- a/lib/manager/npm/registry.js
+++ b/lib/manager/npm/registry.js
@@ -10,15 +10,24 @@ const parse = require('github-url-from-git');
 module.exports = {
   setNpmrc,
   getDependency,
+  resetMemCache,
   resetCache,
 };
 
 let map = new Map();
 
+let memcache = {};
+
 let npmrc = null;
 
+function resetMemCache() {
+  logger.debug('resetMemCache()');
+  memcache = {};
+}
+
 function resetCache() {
   map = new Map();
+  resetMemCache();
 }
 
 function setNpmrc(input) {
@@ -31,6 +40,10 @@ function setNpmrc(input) {
 
 async function getDependency(name) {
   logger.trace(`getDependency(${name})`);
+  if (memcache[name]) {
+    logger.debug('Returning cached result');
+    return memcache[name];
+  }
   const scope = name.split('/')[0];
   let regUrl;
   try {
@@ -84,6 +97,7 @@ async function getDependency(name) {
       };
     });
     logger.trace({ dep }, 'dep');
+    memcache[name] = dep;
     return dep;
   } catch (err) {
     if (err.statusCode === 401) {
diff --git a/lib/workers/repository/init/apis.js b/lib/workers/repository/init/apis.js
index 5652443e9e..3cf04ce584 100644
--- a/lib/workers/repository/init/apis.js
+++ b/lib/workers/repository/init/apis.js
@@ -26,6 +26,7 @@ async function initApis(input, token) {
   config = await assignPlatform(config);
   config = await getPlatformConfig(config);
   config.npmrc = config.npmrc || (await platform.getFile('.npmrc'));
+  npmApi.resetMemCache();
   npmApi.setNpmrc(config.npmrc);
   return config;
 }
-- 
GitLab