From 19e35ffee0af8bea522a1172b4c6aed68f23c790 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Thu, 3 May 2018 18:09:18 +0200
Subject: [PATCH] refactor: return object from extract (#1914)

---
 lib/manager/bazel/extract.js                  | 11 ++++---
 lib/manager/buildkite/extract.js              |  6 ++--
 lib/manager/circleci/extract.js               |  6 ++--
 lib/manager/docker-compose/extract.js         |  9 ++++--
 lib/manager/docker/extract.js                 |  8 +++--
 lib/manager/meteor/extract.js                 | 22 +++++++++-----
 lib/manager/npm/extract.js                    |  3 +-
 lib/manager/nvm/extract.js                    |  8 ++---
 lib/manager/pip_requirements/extract.js       |  9 ++++--
 lib/manager/travis/extract.js                 | 13 ++++----
 lib/workers/package-file/dep-type.js          |  8 ++++-
 test/manager/bazel/extract.spec.js            |  8 ++---
 .../__snapshots__/extract.spec.js.snap        |  3 --
 test/manager/buildkite/extract.spec.js        |  7 +++--
 .../__snapshots__/extract.spec.js.snap        |  4 ---
 test/manager/circleci/extract.spec.js         |  7 +++--
 .../__snapshots__/extract.spec.js.snap        |  6 ----
 test/manager/docker-compose/extract.spec.js   |  7 +++--
 .../docker/__snapshots__/extract.spec.js.snap | 15 ----------
 test/manager/docker/extract.spec.js           | 30 +++++++++----------
 test/manager/npm/extract.spec.js              | 16 +++++-----
 .../nvm/__snapshots__/extract.spec.js.snap    |  1 -
 test/manager/nvm/extract.spec.js              |  2 +-
 .../__snapshots__/extract.spec.js.snap        |  1 -
 test/manager/pip_requirements/extract.spec.js |  5 +++-
 test/manager/travis/extract.spec.js           |  4 +--
 test/workers/package-file/dep-type.spec.js    | 18 +++++------
 27 files changed, 123 insertions(+), 114 deletions(-)

diff --git a/lib/manager/bazel/extract.js b/lib/manager/bazel/extract.js
index 8c14509047..b5111bb069 100644
--- a/lib/manager/bazel/extract.js
+++ b/lib/manager/bazel/extract.js
@@ -2,13 +2,13 @@ module.exports = {
   extractDependencies,
 };
 
-function extractDependencies(packageContent) {
-  const definitions = packageContent.match(
+function extractDependencies(content) {
+  const definitions = content.match(
     /(git_repository|http_archive)\(([\s\S]*?)\n\)\n?/g
   );
   if (!definitions) {
     logger.debug('No matching WORKSPACE definitions found');
-    return [];
+    return null;
   }
   logger.debug({ definitions }, `Found ${definitions.length} definitions`);
   const deps = [];
@@ -72,5 +72,8 @@ function extractDependencies(packageContent) {
       );
     }
   });
-  return deps;
+  if (!deps.length) {
+    return null;
+  }
+  return { deps };
 }
diff --git a/lib/manager/buildkite/extract.js b/lib/manager/buildkite/extract.js
index 6445eb5719..2d3a4bf7d8 100644
--- a/lib/manager/buildkite/extract.js
+++ b/lib/manager/buildkite/extract.js
@@ -21,7 +21,6 @@ function extractDependencies(content) {
           lineNumber += 1;
           const [, depName, currentVersion] = depLineMatch;
           deps.push({
-            depType: 'plugins',
             lineNumber,
             depName,
             currentVersion,
@@ -35,5 +34,8 @@ function extractDependencies(content) {
       'Error extracting buildkite plugins'
     );
   }
-  return deps;
+  if (!deps.length) {
+    return null;
+  }
+  return { deps };
 }
diff --git a/lib/manager/circleci/extract.js b/lib/manager/circleci/extract.js
index 151784b4ae..d163f9487e 100644
--- a/lib/manager/circleci/extract.js
+++ b/lib/manager/circleci/extract.js
@@ -25,7 +25,6 @@ function extractDependencies(content) {
         'CircleCI docker image'
       );
       deps.push({
-        depType: 'CircleCI',
         lineNumber,
         currentFrom,
         changeLogFromVersion: currentFrom,
@@ -39,5 +38,8 @@ function extractDependencies(content) {
     }
     lineNumber += 1;
   }
-  return deps;
+  if (!deps.length) {
+    return null;
+  }
+  return { deps };
 }
diff --git a/lib/manager/docker-compose/extract.js b/lib/manager/docker-compose/extract.js
index 81ed25ae00..a1f65125c0 100644
--- a/lib/manager/docker-compose/extract.js
+++ b/lib/manager/docker-compose/extract.js
@@ -6,7 +6,7 @@ module.exports = {
 
 function extractDependencies(content) {
   logger.debug('docker-compose.extractDependencies()');
-  const deps = [];
+  let deps = [];
   let lineNumber = 0;
   for (const line of content.split('\n')) {
     const match = line.match(/^\s*image:\s*'?"?([^\s'"]+)'?"?\s*$/);
@@ -25,7 +25,6 @@ function extractDependencies(content) {
         'Docker Compose image'
       );
       deps.push({
-        depType: 'Docker Compose',
         lineNumber,
         currentFrom,
         currentDepTagDigest,
@@ -38,5 +37,9 @@ function extractDependencies(content) {
     }
     lineNumber += 1;
   }
-  return deps.filter(dep => !(dep.currentTag && dep.currentTag.includes('${')));
+  deps = deps.filter(dep => !(dep.currentTag && dep.currentTag.includes('${')));
+  if (!deps.length) {
+    return null;
+  }
+  return { deps };
 }
diff --git a/lib/manager/docker/extract.js b/lib/manager/docker/extract.js
index a5a660afa1..ac2c7cab88 100644
--- a/lib/manager/docker/extract.js
+++ b/lib/manager/docker/extract.js
@@ -40,7 +40,7 @@ function extractDependencies(content) {
   if (!fromMatches.length) {
     logger.info('No FROM found');
     logger.debug({ content });
-    return [];
+    return null;
   }
   logger.debug({ fromMatches }, 'Found matches');
   const stageNames = [];
@@ -67,7 +67,6 @@ function extractDependencies(content) {
       logger.debug({ currentFrom }, 'Skipping alias FROM');
     } else {
       deps.push({
-        depType: 'Dockerfile',
         fromLine,
         fromPrefix,
         currentFrom,
@@ -81,5 +80,8 @@ function extractDependencies(content) {
       });
     }
   });
-  return deps;
+  if (!deps.length) {
+    return null;
+  }
+  return { deps };
 }
diff --git a/lib/manager/meteor/extract.js b/lib/manager/meteor/extract.js
index 393a4f286a..8e3426fc4a 100644
--- a/lib/manager/meteor/extract.js
+++ b/lib/manager/meteor/extract.js
@@ -2,11 +2,14 @@ module.exports = {
   extractDependencies,
 };
 
-function extractDependencies(packageContent) {
+function extractDependencies(content) {
   let deps = [];
+  const npmDepends = content.match(/Npm\.depends\({([\s\S]*?)}\);/);
+  if (!npmDepends) {
+    return null;
+  }
   try {
-    deps = packageContent
-      .match(/Npm\.depends\({([\s\S]*?)}\);/)[1]
+    deps = npmDepends[1]
       .replace(/(\s|\\n|\\t|'|")/g, '')
       .split(',')
       .map(dep => dep.trim())
@@ -16,17 +19,20 @@ function extractDependencies(packageContent) {
         const [depName, currentVersion] = arr;
         // istanbul ignore if
         if (!(depName && currentVersion)) {
-          logger.warn({ packageContent }, 'Incomplete npm.depends match');
+          logger.warn({ content }, 'Incomplete npm.depends match');
         }
         return {
-          depType: 'npmDepends',
           depName,
           currentVersion,
         };
       })
       .filter(dep => dep.depName && dep.currentVersion);
-  } catch (err) {
-    logger.warn({ packageContent }, 'Failed to parse meteor package.js');
+  } catch (err) /* istanbul ignore next */ {
+    logger.warn({ content }, 'Failed to parse meteor package.js');
+  }
+  // istanbul ignore if
+  if (!deps.length) {
+    return null;
   }
-  return deps;
+  return { deps };
 }
diff --git a/lib/manager/npm/extract.js b/lib/manager/npm/extract.js
index e986541fc8..fb93f555cb 100644
--- a/lib/manager/npm/extract.js
+++ b/lib/manager/npm/extract.js
@@ -12,7 +12,7 @@ function extractDependencies(packageJson, config) {
   const depNames = packageJson[depType]
     ? Object.keys(packageJson[depType])
     : [];
-  return depNames
+  const deps = depNames
     .map(depName => {
       const currentVersion = packageJson[depType][depName]
         ? `${packageJson[depType][depName]}`.trim().replace(/^=/, '')
@@ -58,4 +58,5 @@ function extractDependencies(packageJson, config) {
       };
     })
     .filter(dep => dep.currentVersion);
+  return { deps };
 }
diff --git a/lib/manager/nvm/extract.js b/lib/manager/nvm/extract.js
index 9d21119433..4c0af583bf 100644
--- a/lib/manager/nvm/extract.js
+++ b/lib/manager/nvm/extract.js
@@ -2,12 +2,12 @@ module.exports = {
   extractDependencies,
 };
 
-function extractDependencies(packageContent) {
-  return [
+function extractDependencies(content) {
+  const deps = [
     {
       depName: 'node',
-      depType: '.nvmrc',
-      currentVersion: packageContent.trim(),
+      currentVersion: content.trim(),
     },
   ];
+  return { deps };
 }
diff --git a/lib/manager/pip_requirements/extract.js b/lib/manager/pip_requirements/extract.js
index 1d55b22e63..534c72639f 100644
--- a/lib/manager/pip_requirements/extract.js
+++ b/lib/manager/pip_requirements/extract.js
@@ -6,7 +6,7 @@ module.exports = {
   extractDependencies,
 };
 
-function extractDependencies(fileContent) {
+function extractDependencies(content) {
   logger.debug('pip_requirements.extractDependencies()');
   // TODO: for now we only support semver, but we need better support for python versions
   // see https://github.com/pypa/packaging/blob/master/packaging/version.py
@@ -15,18 +15,21 @@ function extractDependencies(fileContent) {
     `^${packagePattern}==([0-9]+\\.[0-9]+\\.[0-9]+)$`,
     'g'
   );
-  return fileContent
+  const deps = content
     .split('\n')
     .map((line, lineNumber) => {
       const matches = regex.exec(line);
       return (
         matches && {
           depName: matches[1],
-          depType: 'python',
           currentVersion: matches[2],
           lineNumber,
         }
       );
     })
     .filter(Boolean);
+  if (!deps.length) {
+    return null;
+  }
+  return { deps };
 }
diff --git a/lib/manager/travis/extract.js b/lib/manager/travis/extract.js
index 19f8bc860b..866a5200e1 100644
--- a/lib/manager/travis/extract.js
+++ b/lib/manager/travis/extract.js
@@ -4,16 +4,19 @@ module.exports = {
   extractDependencies,
 };
 
-function extractDependencies(packageContent) {
-  const doc = yaml.safeLoad(packageContent);
+function extractDependencies(content) {
+  const doc = yaml.safeLoad(content);
+  let deps = [];
   if (doc && Array.isArray(doc.node_js)) {
-    return [
+    deps = [
       {
         depName: 'node',
-        depType: '.travis.yml',
         currentVersion: doc.node_js,
       },
     ];
   }
-  return [];
+  if (!deps.length) {
+    return null;
+  }
+  return { deps };
 }
diff --git a/lib/workers/package-file/dep-type.js b/lib/workers/package-file/dep-type.js
index fc045a5f26..4758e1a172 100644
--- a/lib/workers/package-file/dep-type.js
+++ b/lib/workers/package-file/dep-type.js
@@ -20,7 +20,13 @@ async function renovateDepType(packageContent, config) {
     logger.debug('depType is disabled');
     return [];
   }
-  let deps = await extractDependencies(packageContent, config);
+  const res = await extractDependencies(packageContent, config);
+  let deps;
+  if (res) {
+    ({ deps } = res);
+  } else {
+    deps = [];
+  }
   if (config.lerna || config.workspaces || config.workspaceDir) {
     deps = deps.filter(
       dependency => config.monorepoPackages.indexOf(dependency.depName) === -1
diff --git a/test/manager/bazel/extract.spec.js b/test/manager/bazel/extract.spec.js
index 4f9f1a824e..b635500b77 100644
--- a/test/manager/bazel/extract.spec.js
+++ b/test/manager/bazel/extract.spec.js
@@ -12,20 +12,20 @@ describe('lib/manager/bazel/extract', () => {
     beforeEach(() => {
       config = {};
     });
-    it('returns empty if fails to pass', () => {
+    it('returns empty if fails to parse', () => {
       const res = extractDependencies('blahhhhh:foo:@what\n', config);
-      expect(res).toEqual([]);
+      expect(res).toBe(null);
     });
     it('returns empty if cannot parse dependency', () => {
       const res = extractDependencies(
         'git_repository(\n  nothing\n)\n',
         config
       );
-      expect(res).toEqual([]);
+      expect(res).toBe(null);
     });
     it('extracts multiple types of dependencies', () => {
       const res = extractDependencies(workspaceFile, config);
-      expect(res).toMatchSnapshot();
+      expect(res.deps).toMatchSnapshot();
     });
   });
 });
diff --git a/test/manager/buildkite/__snapshots__/extract.spec.js.snap b/test/manager/buildkite/__snapshots__/extract.spec.js.snap
index 030fecf4c1..09563294ba 100644
--- a/test/manager/buildkite/__snapshots__/extract.spec.js.snap
+++ b/test/manager/buildkite/__snapshots__/extract.spec.js.snap
@@ -5,13 +5,11 @@ Array [
   Object {
     "currentVersion": "v1.3.2",
     "depName": "docker-compose",
-    "depType": "plugins",
     "lineNumber": 4,
   },
   Object {
     "currentVersion": "v1.3.2",
     "depName": "docker-compose",
-    "depType": "plugins",
     "lineNumber": 15,
   },
 ]
@@ -22,7 +20,6 @@ Array [
   Object {
     "currentVersion": "v2.0.0",
     "depName": "detect-clowns",
-    "depType": "plugins",
     "lineNumber": 2,
   },
 ]
diff --git a/test/manager/buildkite/extract.spec.js b/test/manager/buildkite/extract.spec.js
index 6afd9f27de..cd4c1d5ff4 100644
--- a/test/manager/buildkite/extract.spec.js
+++ b/test/manager/buildkite/extract.spec.js
@@ -18,13 +18,16 @@ describe('lib/manager/buildkite/extract', () => {
     beforeEach(() => {
       config = {};
     });
+    it('returns null for empty', () => {
+      expect(extractDependencies('nothing here', config)).toBe(null);
+    });
     it('extracts simple single plugin', () => {
-      const res = extractDependencies(pipeline1, config);
+      const res = extractDependencies(pipeline1, config).deps;
       expect(res).toMatchSnapshot();
       expect(res).toHaveLength(1);
     });
     it('extracts multiple plugins in same file', () => {
-      const res = extractDependencies(pipeline2, config);
+      const res = extractDependencies(pipeline2, config).deps;
       expect(res).toMatchSnapshot();
       expect(res).toHaveLength(2);
     });
diff --git a/test/manager/circleci/__snapshots__/extract.spec.js.snap b/test/manager/circleci/__snapshots__/extract.spec.js.snap
index 73b666d312..e5591adca8 100644
--- a/test/manager/circleci/__snapshots__/extract.spec.js.snap
+++ b/test/manager/circleci/__snapshots__/extract.spec.js.snap
@@ -10,7 +10,6 @@ Array [
     "currentFrom": "node",
     "currentTag": undefined,
     "depName": "node",
-    "depType": "CircleCI",
     "dockerRegistry": undefined,
     "lineNumber": 12,
   },
@@ -22,7 +21,6 @@ Array [
     "currentFrom": "node:4",
     "currentTag": "4",
     "depName": "node",
-    "depType": "CircleCI",
     "dockerRegistry": undefined,
     "lineNumber": 57,
   },
@@ -34,7 +32,6 @@ Array [
     "currentFrom": "node:6",
     "currentTag": "6",
     "depName": "node",
-    "depType": "CircleCI",
     "dockerRegistry": undefined,
     "lineNumber": 61,
   },
@@ -46,7 +43,6 @@ Array [
     "currentFrom": "node:8.9.0",
     "currentTag": "8.9.0",
     "depName": "node",
-    "depType": "CircleCI",
     "dockerRegistry": undefined,
     "lineNumber": 65,
   },
diff --git a/test/manager/circleci/extract.spec.js b/test/manager/circleci/extract.spec.js
index 4bb0c02b46..bfd13a5e92 100644
--- a/test/manager/circleci/extract.spec.js
+++ b/test/manager/circleci/extract.spec.js
@@ -11,10 +11,13 @@ describe('lib/manager/circleci/extract', () => {
     beforeEach(() => {
       config = {};
     });
+    it('returns null for empty', () => {
+      expect(extractDependencies('nothing here', config)).toBe(null);
+    });
     it('extracts multiple image lines', () => {
       const res = extractDependencies(yamlFile, config);
-      expect(res).toMatchSnapshot();
-      expect(res).toHaveLength(4);
+      expect(res.deps).toMatchSnapshot();
+      expect(res.deps).toHaveLength(4);
     });
   });
 });
diff --git a/test/manager/docker-compose/__snapshots__/extract.spec.js.snap b/test/manager/docker-compose/__snapshots__/extract.spec.js.snap
index 37e53650f7..742c0d6228 100644
--- a/test/manager/docker-compose/__snapshots__/extract.spec.js.snap
+++ b/test/manager/docker-compose/__snapshots__/extract.spec.js.snap
@@ -9,7 +9,6 @@ Array [
     "currentFrom": "quay.io/something/redis:alpine",
     "currentTag": "alpine",
     "depName": "something/redis",
-    "depType": "Docker Compose",
     "dockerRegistry": "quay.io",
     "lineNumber": 4,
   },
@@ -20,7 +19,6 @@ Array [
     "currentFrom": "postgres:9.4.0",
     "currentTag": "9.4.0",
     "depName": "postgres",
-    "depType": "Docker Compose",
     "dockerRegistry": undefined,
     "lineNumber": 18,
   },
@@ -31,7 +29,6 @@ Array [
     "currentFrom": "dockersamples/examplevotingapp_vote:before",
     "currentTag": "before",
     "depName": "dockersamples/examplevotingapp_vote",
-    "depType": "Docker Compose",
     "dockerRegistry": undefined,
     "lineNumber": 28,
   },
@@ -42,7 +39,6 @@ Array [
     "currentFrom": "dockersamples/examplevotingapp_result:before",
     "currentTag": "before",
     "depName": "dockersamples/examplevotingapp_result",
-    "depType": "Docker Compose",
     "dockerRegistry": undefined,
     "lineNumber": 43,
   },
@@ -53,7 +49,6 @@ Array [
     "currentFrom": "dockersamples/examplevotingapp_worker",
     "currentTag": undefined,
     "depName": "dockersamples/examplevotingapp_worker",
-    "depType": "Docker Compose",
     "dockerRegistry": undefined,
     "lineNumber": 59,
   },
@@ -64,7 +59,6 @@ Array [
     "currentFrom": "dockersamples/visualizer:stable",
     "currentTag": "stable",
     "depName": "dockersamples/visualizer",
-    "depType": "Docker Compose",
     "dockerRegistry": undefined,
     "lineNumber": 76,
   },
diff --git a/test/manager/docker-compose/extract.spec.js b/test/manager/docker-compose/extract.spec.js
index c2062d48eb..ff2d129106 100644
--- a/test/manager/docker-compose/extract.spec.js
+++ b/test/manager/docker-compose/extract.spec.js
@@ -14,10 +14,13 @@ describe('lib/manager/docker-compose/extract', () => {
     beforeEach(() => {
       config = {};
     });
+    it('returns null for empty', () => {
+      expect(extractDependencies('nothing here', config)).toBe(null);
+    });
     it('extracts multiple image lines', () => {
       const res = extractDependencies(yamlFile, config);
-      expect(res).toMatchSnapshot();
-      expect(res).toHaveLength(6);
+      expect(res.deps).toMatchSnapshot();
+      expect(res.deps).toHaveLength(6);
     });
   });
 });
diff --git a/test/manager/docker/__snapshots__/extract.spec.js.snap b/test/manager/docker/__snapshots__/extract.spec.js.snap
index f7cb2da2b4..0919754ae8 100644
--- a/test/manager/docker/__snapshots__/extract.spec.js.snap
+++ b/test/manager/docker/__snapshots__/extract.spec.js.snap
@@ -9,7 +9,6 @@ Array [
     "currentFrom": "node:6.12.3",
     "currentTag": "6.12.3",
     "depName": "node",
-    "depType": "Dockerfile",
     "dockerRegistry": undefined,
     "fromLine": "FROM node:6.12.3 as frontend",
     "fromPrefix": "FROM",
@@ -22,7 +21,6 @@ Array [
     "currentFrom": "python:3.6-slim",
     "currentTag": "3.6-slim",
     "depName": "python",
-    "depType": "Dockerfile",
     "dockerRegistry": undefined,
     "fromLine": "FROM python:3.6-slim",
     "fromPrefix": "FROM",
@@ -40,7 +38,6 @@ Array [
     "currentFrom": "registry.allmine.info:5005/node:8.7.0",
     "currentTag": "8.7.0",
     "depName": "node",
-    "depType": "Dockerfile",
     "dockerRegistry": "registry.allmine.info:5005",
     "fromLine": "FROM    registry.allmine.info:5005/node:8.7.0",
     "fromPrefix": "FROM",
@@ -58,7 +55,6 @@ Array [
     "currentFrom": "node",
     "currentTag": undefined,
     "depName": "node",
-    "depType": "Dockerfile",
     "dockerRegistry": undefined,
     "fromLine": "FROM node",
     "fromPrefix": "FROM",
@@ -76,7 +72,6 @@ Array [
     "currentFrom": "registry2.something.info/node:8",
     "currentTag": "8",
     "depName": "node",
-    "depType": "Dockerfile",
     "dockerRegistry": "registry2.something.info",
     "fromLine": "FROM registry2.something.info/node:8",
     "fromPrefix": "FROM",
@@ -94,7 +89,6 @@ Array [
     "currentFrom": "registry2.something.info/someaccount/node:8",
     "currentTag": "8",
     "depName": "someaccount/node",
-    "depType": "Dockerfile",
     "dockerRegistry": "registry2.something.info",
     "fromLine": "FROM registry2.something.info/someaccount/node:8",
     "fromPrefix": "FROM",
@@ -112,7 +106,6 @@ Array [
     "currentFrom": "registry2.something.info:5005/node:8",
     "currentTag": "8",
     "depName": "node",
-    "depType": "Dockerfile",
     "dockerRegistry": "registry2.something.info:5005",
     "fromLine": "FROM registry2.something.info:5005/node:8",
     "fromPrefix": "FROM",
@@ -130,7 +123,6 @@ Array [
     "currentFrom": "node@sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063",
     "currentTag": undefined,
     "depName": "node",
-    "depType": "Dockerfile",
     "dockerRegistry": undefined,
     "fromLine": "FROM node@sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063",
     "fromPrefix": "FROM",
@@ -148,7 +140,6 @@ Array [
     "currentFrom": "node:8.9.0-alpine",
     "currentTag": "8.9.0-alpine",
     "depName": "node",
-    "depType": "Dockerfile",
     "dockerRegistry": undefined,
     "fromLine": "FROM node:8.9.0-alpine as base",
     "fromPrefix": "FROM",
@@ -166,7 +157,6 @@ Array [
     "currentFrom": "node",
     "currentTag": undefined,
     "depName": "node",
-    "depType": "Dockerfile",
     "dockerRegistry": undefined,
     "fromLine": "FROM node",
     "fromPrefix": "FROM",
@@ -184,7 +174,6 @@ Array [
     "currentFrom": "mynamespace/node:8",
     "currentTag": "8",
     "depName": "mynamespace/node",
-    "depType": "Dockerfile",
     "dockerRegistry": undefined,
     "fromLine": "FROM mynamespace/node:8",
     "fromPrefix": "FROM",
@@ -202,7 +191,6 @@ Array [
     "currentFrom": "node:8.9.0-alpine",
     "currentTag": "8.9.0-alpine",
     "depName": "node",
-    "depType": "Dockerfile",
     "dockerRegistry": undefined,
     "fromLine": "FROM node:8.9.0-alpine",
     "fromPrefix": "FROM",
@@ -220,7 +208,6 @@ Array [
     "currentFrom": "node:8.9.0@sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063",
     "currentTag": "8.9.0",
     "depName": "node",
-    "depType": "Dockerfile",
     "dockerRegistry": undefined,
     "fromLine": "FROM node:8.9.0@sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063",
     "fromPrefix": "FROM",
@@ -238,7 +225,6 @@ Array [
     "currentFrom": "node",
     "currentTag": undefined,
     "depName": "node",
-    "depType": "Dockerfile",
     "dockerRegistry": undefined,
     "fromLine": "From node",
     "fromPrefix": "From",
@@ -256,7 +242,6 @@ Array [
     "currentFrom": "node:6.12.3",
     "currentTag": "6.12.3",
     "depName": "node",
-    "depType": "Dockerfile",
     "dockerRegistry": undefined,
     "fromLine": "FROM node:6.12.3 as frontend",
     "fromPrefix": "FROM",
diff --git a/test/manager/docker/extract.spec.js b/test/manager/docker/extract.spec.js
index c44e17038f..77d4e48aa5 100644
--- a/test/manager/docker/extract.spec.js
+++ b/test/manager/docker/extract.spec.js
@@ -7,36 +7,36 @@ describe('lib/manager/docker/extract', () => {
       config = {};
     });
     it('handles naked dep', () => {
-      const res = extractDependencies('FROM node\n', config);
+      const res = extractDependencies('FROM node\n', config).deps;
       expect(res).toMatchSnapshot();
     });
     it('is case insensitive', () => {
-      const res = extractDependencies('From node\n', config);
+      const res = extractDependencies('From node\n', config).deps;
       expect(res).toMatchSnapshot();
     });
     it('handles tag', () => {
-      const res = extractDependencies('FROM node:8.9.0-alpine\n', config);
+      const res = extractDependencies('FROM node:8.9.0-alpine\n', config).deps;
       expect(res).toMatchSnapshot();
     });
     it('handles digest', () => {
       const res = extractDependencies(
         'FROM node@sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063\n',
         config
-      );
+      ).deps;
       expect(res).toMatchSnapshot();
     });
     it('handles tag and digest', () => {
       const res = extractDependencies(
         'FROM node:8.9.0@sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063\n',
         config
-      );
+      ).deps;
       expect(res).toMatchSnapshot();
     });
     it('handles from as', () => {
       const res = extractDependencies(
         'FROM node:8.9.0-alpine as base\n',
         config
-      );
+      ).deps;
       expect(res).toMatchSnapshot();
       //  expect(res.currentTag.includes(' ')).toBe(false);
     });
@@ -44,14 +44,14 @@ describe('lib/manager/docker/extract', () => {
       const res = extractDependencies(
         '# some comment\n# another\n\nFROM node\n',
         config
-      );
+      ).deps;
       expect(res).toMatchSnapshot();
     });
     it('handles custom hosts', () => {
       const res = extractDependencies(
         'FROM registry2.something.info/node:8\n',
         config
-      );
+      ).deps;
       expect(res).toMatchSnapshot();
       expect(res[0].dockerRegistry).toEqual('registry2.something.info');
     });
@@ -59,12 +59,12 @@ describe('lib/manager/docker/extract', () => {
       const res = extractDependencies(
         'FROM registry2.something.info:5005/node:8\n',
         config
-      );
+      ).deps;
       expect(res).toMatchSnapshot();
       expect(res[0].dockerRegistry).toEqual('registry2.something.info:5005');
     });
     it('handles namespaced images', () => {
-      const res = extractDependencies('FROM mynamespace/node:8\n', config);
+      const res = extractDependencies('FROM mynamespace/node:8\n', config).deps;
       expect(res).toMatchSnapshot();
       expect(res[0].dockerRegistry).toBeUndefined();
     });
@@ -72,7 +72,7 @@ describe('lib/manager/docker/extract', () => {
       const res = extractDependencies(
         'FROM registry2.something.info/someaccount/node:8\n',
         config
-      );
+      ).deps;
       expect(res).toMatchSnapshot();
       expect(res[0].dockerRegistry).toEqual('registry2.something.info');
       expect(res[0].depName).toEqual('someaccount/node');
@@ -80,26 +80,26 @@ describe('lib/manager/docker/extract', () => {
     it('handles abnoral spacing', () => {
       const res = extractDependencies(
         'FROM    registry.allmine.info:5005/node:8.7.0\n\n'
-      );
+      ).deps;
       expect(res).toMatchSnapshot();
     });
     it('extracts multiple FROM tags', () => {
       const res = extractDependencies(
         'FROM node:6.12.3 as frontend\n\n# comment\nENV foo=bar\nFROM python:3.6-slim\n',
         config
-      );
+      ).deps;
       expect(res).toMatchSnapshot();
       expect(res).toHaveLength(2);
     });
     it('skips scratchs', () => {
       const res = extractDependencies('FROM scratch\nADD foo\n', config);
-      expect(res).toHaveLength(0);
+      expect(res).toBe(null);
     });
     it('skips named multistage FROM tags', () => {
       const res = extractDependencies(
         'FROM node:6.12.3 as frontend\n\n# comment\nENV foo=bar\nFROM frontend\n',
         config
-      );
+      ).deps;
       expect(res).toMatchSnapshot();
       expect(res).toHaveLength(1);
     });
diff --git a/test/manager/npm/extract.spec.js b/test/manager/npm/extract.spec.js
index a2c31952cc..a0514565cf 100644
--- a/test/manager/npm/extract.spec.js
+++ b/test/manager/npm/extract.spec.js
@@ -21,7 +21,7 @@ describe('manager/npm/extract', () => {
       const extractedDependencies = npmExtract.extractDependencies(
         JSON.parse(input01Content),
         config
-      );
+      ).deps;
       extractedDependencies.should.be.instanceof(Array);
       extractedDependencies.should.have.length(6);
     });
@@ -32,7 +32,7 @@ describe('manager/npm/extract', () => {
       const extractedDependencies = npmExtract.extractDependencies(
         JSON.parse(input01Content),
         config
-      );
+      ).deps;
       extractedDependencies.should.be.instanceof(Array);
       extractedDependencies.should.have.length(4);
     });
@@ -43,7 +43,7 @@ describe('manager/npm/extract', () => {
       const extractedDependencies = npmExtract.extractDependencies(
         JSON.parse(input01Content),
         config
-      );
+      ).deps;
       expect(extractedDependencies).toMatchSnapshot();
       extractedDependencies
         .every(dep => dep.depType && dep.depName && dep.currentVersion)
@@ -56,7 +56,7 @@ describe('manager/npm/extract', () => {
       const extractedDependencies = npmExtract.extractDependencies(
         JSON.parse(input02Content),
         config
-      );
+      ).deps;
       extractedDependencies.should.be.instanceof(Array);
       extractedDependencies.should.have.length(6);
     });
@@ -67,7 +67,7 @@ describe('manager/npm/extract', () => {
       const extractedDependencies = npmExtract.extractDependencies(
         JSON.parse(input02Content),
         config
-      );
+      ).deps;
       extractedDependencies.should.be.instanceof(Array);
       extractedDependencies.should.have.length(0);
     });
@@ -82,7 +82,7 @@ describe('manager/npm/extract', () => {
       const extractedDependencies = npmExtract.extractDependencies(
         { dependencies: { chalk: '^2.0.0', foo: '^1.0.0' } },
         config
-      );
+      ).deps;
       extractedDependencies.should.be.instanceof(Array);
       extractedDependencies.should.have.length(2);
       expect(extractedDependencies[0].lockedVersion).toBeDefined();
@@ -99,7 +99,7 @@ describe('manager/npm/extract', () => {
       const extractedDependencies = npmExtract.extractDependencies(
         { dependencies: { chalk: '^2.0.0', foo: '^1.0.0' } },
         config
-      );
+      ).deps;
       extractedDependencies.should.be.instanceof(Array);
       extractedDependencies.should.have.length(2);
       expect(extractedDependencies[0].lockedVersion).toBeDefined();
@@ -113,7 +113,7 @@ describe('manager/npm/extract', () => {
       const extractedDependencies = npmExtract.extractDependencies(
         { dependencies: { chalk: '^2.0.0', foo: '^1.0.0' } },
         config
-      );
+      ).deps;
       extractedDependencies.should.be.instanceof(Array);
       extractedDependencies.should.have.length(2);
       expect(extractedDependencies[0].lockedVersion).toBeUndefined();
diff --git a/test/manager/nvm/__snapshots__/extract.spec.js.snap b/test/manager/nvm/__snapshots__/extract.spec.js.snap
index 1b783d2a47..74b8f55055 100644
--- a/test/manager/nvm/__snapshots__/extract.spec.js.snap
+++ b/test/manager/nvm/__snapshots__/extract.spec.js.snap
@@ -5,7 +5,6 @@ Array [
   Object {
     "currentVersion": "8.4.0",
     "depName": "node",
-    "depType": ".nvmrc",
   },
 ]
 `;
diff --git a/test/manager/nvm/extract.spec.js b/test/manager/nvm/extract.spec.js
index d13e4d2d45..55f9480e7d 100644
--- a/test/manager/nvm/extract.spec.js
+++ b/test/manager/nvm/extract.spec.js
@@ -4,7 +4,7 @@ describe('lib/manager/nvm/extract', () => {
   describe('extractDependencies()', () => {
     it('returns a result', () => {
       const res = extractDependencies('8.4.0\n');
-      expect(res).toMatchSnapshot();
+      expect(res.deps).toMatchSnapshot();
     });
   });
 });
diff --git a/test/manager/pip_requirements/__snapshots__/extract.spec.js.snap b/test/manager/pip_requirements/__snapshots__/extract.spec.js.snap
index f54547d2ec..f63886ce8f 100644
--- a/test/manager/pip_requirements/__snapshots__/extract.spec.js.snap
+++ b/test/manager/pip_requirements/__snapshots__/extract.spec.js.snap
@@ -5,7 +5,6 @@ Array [
   Object {
     "currentVersion": "0.3.1",
     "depName": "some-package",
-    "depType": "python",
     "lineNumber": 2,
   },
 ]
diff --git a/test/manager/pip_requirements/extract.spec.js b/test/manager/pip_requirements/extract.spec.js
index a775ba5644..28e4f5c465 100644
--- a/test/manager/pip_requirements/extract.spec.js
+++ b/test/manager/pip_requirements/extract.spec.js
@@ -14,8 +14,11 @@ describe('lib/manager/pip_requirements/extract', () => {
     beforeEach(() => {
       config = {};
     });
+    it('returns null for empty', () => {
+      expect(extractDependencies('nothing here', config)).toBe(null);
+    });
     it('extracts dependencies', () => {
-      const res = extractDependencies(requirements, config);
+      const res = extractDependencies(requirements, config).deps;
       expect(res).toMatchSnapshot();
       expect(res).toHaveLength(1);
     });
diff --git a/test/manager/travis/extract.spec.js b/test/manager/travis/extract.spec.js
index 026adea6ef..ca8038bac4 100644
--- a/test/manager/travis/extract.spec.js
+++ b/test/manager/travis/extract.spec.js
@@ -6,9 +6,9 @@ describe('lib/manager/travis/extract', () => {
     beforeEach(() => {
       config = {};
     });
-    it('returns empty if fails to pass', () => {
+    it('returns empty if fails to parse', () => {
       const res = extractDependencies('blahhhhh:foo:@what\n', config);
-      expect(res).toEqual([]);
+      expect(res).toBe(null);
     });
   });
 });
diff --git a/test/workers/package-file/dep-type.spec.js b/test/workers/package-file/dep-type.spec.js
index 327c00582f..c92bf6dfdf 100644
--- a/test/workers/package-file/dep-type.spec.js
+++ b/test/workers/package-file/dep-type.spec.js
@@ -27,25 +27,21 @@ describe('lib/workers/package-file/dep-type', () => {
       expect(res).toMatchObject([]);
     });
     it('returns empty if no deps found', async () => {
-      npmExtract.extractDependencies.mockReturnValueOnce([]);
+      npmExtract.extractDependencies.mockReturnValueOnce(null);
       const res = await depTypeWorker.renovateDepType({}, config);
       expect(res).toMatchObject([]);
     });
     it('returns empty if all deps are filtered', async () => {
-      npmExtract.extractDependencies.mockReturnValueOnce([
-        { depName: 'a' },
-        { depName: 'b' },
-        { depName: 'e' },
-      ]);
+      npmExtract.extractDependencies.mockReturnValueOnce({
+        deps: [{ depName: 'a' }, { depName: 'b' }, { depName: 'e' }],
+      });
       const res = await depTypeWorker.renovateDepType({}, config);
       expect(res).toMatchObject([]);
     });
     it('returns combined upgrades if all deps are filtered', async () => {
-      npmExtract.extractDependencies.mockReturnValueOnce([
-        { depName: 'a' },
-        { depName: 'c' },
-        { depName: 'd' },
-      ]);
+      npmExtract.extractDependencies.mockReturnValueOnce({
+        deps: [{ depName: 'a' }, { depName: 'c' }, { depName: 'd' }],
+      });
       const res = await depTypeWorker.renovateDepType({}, config);
       expect(res).toHaveLength(2);
     });
-- 
GitLab