From 579214682ff6380d43ef04792a8a17ef472717ce Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Tue, 27 Feb 2018 16:58:29 +0100
Subject: [PATCH] fix: throw config validation error if unknown filename

Refactors manager.resolve to use file name to manager mappings.
---
 lib/manager/resolve.js                        | 38 +++++++++++++------
 .../__snapshots__/resolve.spec.js.snap        |  9 ++++-
 test/manager/resolve.spec.js                  |  9 ++++-
 3 files changed, 40 insertions(+), 16 deletions(-)

diff --git a/lib/manager/resolve.js b/lib/manager/resolve.js
index e730d66171..5254fc20e9 100644
--- a/lib/manager/resolve.js
+++ b/lib/manager/resolve.js
@@ -22,9 +22,27 @@ async function resolvePackageFiles(config) {
       : await manager.detectPackageFiles(config);
   logger.debug({ allPackageFiles }, 'allPackageFiles');
   const fileList = await platform.getFileList();
+  const managerFileMappings = {
+    '.travis.yml': 'node',
+    Dockerfile: 'docker',
+    WORKSPACE: 'bazel',
+    'package.js': 'meteor',
+    'package.json': 'npm',
+  };
   async function resolvePackageFile(p) {
     const packageFile = typeof p === 'string' ? { packageFile: p } : p;
-    if (packageFile.packageFile.endsWith('package.json')) {
+    const fileName = packageFile.packageFile.split('/').pop();
+    packageFile.manager = packageFile.manager || managerFileMappings[fileName];
+    if (!packageFile.manager) {
+      // Config error
+      const error = new Error('config-validation');
+      error.configFile = packageFile.packageFile;
+      error.validationError = 'Unknown file type';
+      error.validationMessage =
+        'Please correct the file name in your packageFiles array';
+      throw error;
+    }
+    if (packageFile.manager === 'npm') {
       logger.debug(`Resolving packageFile ${JSON.stringify(packageFile)}`);
       const pFileRaw = await platform.getFile(packageFile.packageFile);
       if (!pFileRaw) {
@@ -127,25 +145,21 @@ async function resolvePackageFiles(config) {
       }
       packageFile.currentPackageJsonVersion = packageFile.content.version;
       return mergeChildConfig(config.npm, packageFile);
-    } else if (packageFile.packageFile.endsWith('package.js')) {
-      // meteor
+    } else if (packageFile.manager === 'meteor') {
       return mergeChildConfig(config.meteor, packageFile);
-    } else if (packageFile.packageFile.endsWith('Dockerfile')) {
-      logger.debug('Resolving Dockerfile');
+    } else if (packageFile.manager === 'docker') {
       return dockerResolve.resolvePackageFile(config, packageFile);
-    } else if (packageFile.packageFile.endsWith('.travis.yml')) {
-      logger.debug('Resolving .travis.yml');
+    } else if (packageFile.manager === 'node') {
       return nodeResolve.resolvePackageFile(config, packageFile);
-    } else if (packageFile.packageFile.endsWith('WORKSPACE')) {
-      logger.debug('Resolving WORKSPACE');
+    } else if (packageFile.manager === 'bazel') {
       return bazelResolve.resolvePackageFile(config, packageFile);
     }
-    return null;
+    // istanbul ignore next
+    throw new Error('unknown manager');
   }
-  logger.debug('queue');
+  // TODO: throttle how many we resolve in parallel
   const queue = allPackageFiles.map(p => resolvePackageFile(p));
   let packageFiles = (await Promise.all(queue)).filter(p => p !== null);
-
   logger.debug('Checking against path rules');
   packageFiles = packageFiles.map(pf => {
     let packageFile = { ...pf };
diff --git a/test/manager/__snapshots__/resolve.spec.js.snap b/test/manager/__snapshots__/resolve.spec.js.snap
index d509482f4d..39b85e321f 100644
--- a/test/manager/__snapshots__/resolve.spec.js.snap
+++ b/test/manager/__snapshots__/resolve.spec.js.snap
@@ -12,6 +12,7 @@ Array [
     },
     "currentPackageJsonVersion": "1.0.0",
     "enabled": true,
+    "manager": "npm",
     "packageFile": "package.json",
   },
 ]
@@ -30,6 +31,7 @@ Array [
     },
     "currentPackageJsonVersion": "0.0.1",
     "enabled": true,
+    "manager": "npm",
     "npmrc": "npmrc",
     "packageFile": "package.json",
     "packageLock": "package-lock.json",
@@ -44,6 +46,7 @@ exports[`manager/resolve resolvePackageFiles() detects meteor and docker and tra
 Array [
   Object {
     "enabled": true,
+    "manager": "meteor",
     "packageFile": "package.js",
   },
   Object {
@@ -139,6 +142,7 @@ This PR has been generated by [Renovate Bot](https://renovateapp.com).",
     "major": Object {
       "enabled": false,
     },
+    "manager": "docker",
     "packageFile": "Dockerfile",
     "pin": Object {
       "branchName": "{{{branchPrefix}}}docker-pin-{{{depNameSanitized}}}-{{{currentTag}}}",
@@ -269,6 +273,7 @@ This PR has been generated by [Renovate Bot](https://renovateapp.com).",
     "content": "hello: world
 ",
     "enabled": false,
+    "manager": "node",
     "packageFile": ".travis.yml",
     "prBody": "This Pull Request updates \`{{{depName}}}\` versions from \`{{{currentVersions}}}\` to \`{{{newVersions}}}\`. This is according to the configured node.js support policy \\"{{{supportPolicy}}}\\".
 
@@ -313,13 +318,12 @@ This PR has been generated by [Renovate Bot](https://renovateapp.com).",
   Object {
     "content": "# travis",
     "enabled": true,
+    "manager": "bazel",
     "packageFile": "WORKSPACE",
   },
 ]
 `;
 
-exports[`manager/resolve resolvePackageFiles() handles wrong filenames 1`] = `Array []`;
-
 exports[`manager/resolve resolvePackageFiles() skips if no content or no match 1`] = `Array []`;
 
 exports[`manager/resolve resolvePackageFiles() strips npmrc with NPM_TOKEN 1`] = `
@@ -331,6 +335,7 @@ Array [
     },
     "currentPackageJsonVersion": "0.0.1",
     "enabled": true,
+    "manager": "npm",
     "packageFile": "package.json",
   },
 ]
diff --git a/test/manager/resolve.spec.js b/test/manager/resolve.spec.js
index fc7ab559ac..028aa28e55 100644
--- a/test/manager/resolve.spec.js
+++ b/test/manager/resolve.spec.js
@@ -14,8 +14,13 @@ describe('manager/resolve', () => {
   describe('resolvePackageFiles()', () => {
     it('handles wrong filenames', async () => {
       config.packageFiles = ['wrong.txt'];
-      const res = await resolvePackageFiles(config);
-      expect(res.packageFiles).toMatchSnapshot();
+      let e;
+      try {
+        await resolvePackageFiles(config);
+      } catch (err) {
+        e = err;
+      }
+      expect(e).toBeDefined();
     });
     it('uses packageFiles if already configured and raises error if not found', async () => {
       config.packageFiles = [
-- 
GitLab