From 2f4d5836f33713406e96e3ad5256ab6e9b51e20a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C8=9Aurcanu=20Dragomir?= <dragomirt22@gmail.com>
Date: Thu, 5 Apr 2018 23:42:07 +0300
Subject: [PATCH] feat: Raise config error if config found within nested
 package.json (#1777)

Raises config error if renovate config found in a nested package.json

Closes #1742
---
 lib/manager/npm/resolve.js   | 15 +++++++++++++++
 test/manager/resolve.spec.js | 16 ++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/lib/manager/npm/resolve.js b/lib/manager/npm/resolve.js
index 786d52cb45..af45443278 100644
--- a/lib/manager/npm/resolve.js
+++ b/lib/manager/npm/resolve.js
@@ -11,6 +11,7 @@ async function resolvePackageFile(config, inputFile) {
   logger.debug(
     `Resolving packageFile ${JSON.stringify(packageFile.packageFile)}`
   );
+
   const pFileRaw = await platform.getFile(packageFile.packageFile);
   if (!pFileRaw) {
     logger.info(
@@ -45,6 +46,20 @@ async function resolvePackageFile(config, inputFile) {
     });
     return null;
   }
+
+  if (
+    inputFile.packageFile.includes('package.json') &&
+    inputFile.packageFile !== 'package.json' &&
+    packageFile.content.renovate !== undefined
+  ) {
+    const error = new Error('config-validation');
+    error.configFile = packageFile.packageFile;
+    error.validationError = 'package.json configuration error';
+    error.validationMessage =
+      'Nested package.json must not contain renovate configuration';
+    throw error;
+  }
+
   if (!config.ignoreNpmrcFile) {
     packageFile.npmrc = await platform.getFile(
       upath.join(path.dirname(packageFile.packageFile), '.npmrc')
diff --git a/test/manager/resolve.spec.js b/test/manager/resolve.spec.js
index 10a1d111ba..3ae257a8bb 100644
--- a/test/manager/resolve.spec.js
+++ b/test/manager/resolve.spec.js
@@ -169,5 +169,21 @@ describe('manager/resolve', () => {
       expect(res.packageFiles).toMatchSnapshot();
       expect(res.warnings).toHaveLength(0);
     });
+    it('checks if renovate config in nested package.json throws an error', async () => {
+      manager.detectPackageFiles = jest.fn(() => [
+        { packageFile: 'package.json', manager: 'npm' },
+      ]);
+      platform.getFileList.mockReturnValue(['test/package.json']);
+      platform.getFile.mockReturnValueOnce(
+        '{"name": "test/package.json", "version": "0.0.1", "renovate":{"enabled": true}}'
+      );
+      let e;
+      try {
+        await resolvePackageFiles(config);
+      } catch (err) {
+        e = err;
+      }
+      expect(e).toEqual(new Error('config-validation'));
+    });
   });
 });
-- 
GitLab