From 33e4b5112630aceb1a85e9694065a65d806b5f9d Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Mon, 18 Dec 2017 13:43:29 +0100
Subject: [PATCH] feat: raise config validation issue if onboarded repo has
 invalid package.json
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Previously, if someone updated a package.json to include invalid JSON, Renovate fails to parse it (as expected), so ignores it. As a result, any existing PRs would be autoclosed. Instead, Renovate will now skip the repository and raise a warning issue until the file parsing is complete or the file is added to Renovate’s ignore list.
---
 lib/manager/resolve.js                        | 13 +++++++++++--
 .../__snapshots__/resolve.spec.js.snap        | 18 ++++++++++--------
 test/manager/resolve.spec.js                  | 19 +++++++++++++++++--
 3 files changed, 38 insertions(+), 12 deletions(-)

diff --git a/lib/manager/resolve.js b/lib/manager/resolve.js
index 45b3ffc4ef..12e467ac5f 100644
--- a/lib/manager/resolve.js
+++ b/lib/manager/resolve.js
@@ -46,9 +46,18 @@ async function resolvePackageFiles(config) {
           { packageFile: packageFile.packageFile },
           'Cannot parse package.json'
         );
-        config.warnings.push({
+        if (config.repoIsOnboarded) {
+          const error = new Error('config-validation');
+          error.configFile = packageFile.packageFile;
+          error.validationError = 'Cannot parse package.json';
+          error.validationMessage =
+            'This package.json contains invalid JSON and cannot be parsed. Please fix it, or add it to your "ignorePaths" array in your renovate config so that Renovate can continue.';
+          throw error;
+        }
+        config.errors.push({
           depName: packageFile.packageFile,
-          message: 'Cannot parse package.json (invalid JSON)',
+          message:
+            "Cannot parse package.json (invalid JSON). Please fix the contents or add the file/path to the `ignorePaths` array in Renovate's config",
         });
         return null;
       }
diff --git a/test/manager/__snapshots__/resolve.spec.js.snap b/test/manager/__snapshots__/resolve.spec.js.snap
index 9096535ab8..e62eb84483 100644
--- a/test/manager/__snapshots__/resolve.spec.js.snap
+++ b/test/manager/__snapshots__/resolve.spec.js.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`manager/resolve resolvePackageFiles() detect package.json and warns if cannot parse 1`] = `
+exports[`manager/resolve resolvePackageFiles() detect package.json and adds error if cannot parse (onboarding) 1`] = `
 Object {
   "assignees": Array [],
   "autodiscover": false,
@@ -232,7 +232,12 @@ This PR has been generated by [Renovate Bot](https://renovateapp.com).",
   "enabled": true,
   "encrypted": null,
   "endpoint": null,
-  "errors": Array [],
+  "errors": Array [
+    Object {
+      "depName": "package.json",
+      "message": "Cannot parse package.json (invalid JSON). Please fix the contents or add the file/path to the \`ignorePaths\` array in Renovate's config",
+    },
+  ],
   "excludePackageNames": Array [],
   "excludePackagePatterns": Array [],
   "extends": Array [],
@@ -519,16 +524,13 @@ This PR has been generated by [Renovate Bot](https://renovateapp.com).",
   "unpublishSafe": false,
   "unstablePattern": null,
   "updateNotScheduled": true,
-  "warnings": Array [
-    Object {
-      "depName": "package.json",
-      "message": "Cannot parse package.json (invalid JSON)",
-    },
-  ],
+  "warnings": Array [],
   "yarnrc": null,
 }
 `;
 
+exports[`manager/resolve resolvePackageFiles() detect package.json and throws error if cannot parse (onboarded) 1`] = `[Error: config-validation]`;
+
 exports[`manager/resolve resolvePackageFiles() detects accompanying files 1`] = `
 Object {
   "assignees": Array [],
diff --git a/test/manager/resolve.spec.js b/test/manager/resolve.spec.js
index 4198dea418..08798b39e0 100644
--- a/test/manager/resolve.spec.js
+++ b/test/manager/resolve.spec.js
@@ -25,14 +25,29 @@ describe('manager/resolve', () => {
       expect(res).toMatchSnapshot();
       expect(res.errors).toHaveLength(2);
     });
-    it('detect package.json and warns if cannot parse', async () => {
+    it('detect package.json and adds error if cannot parse (onboarding)', async () => {
       manager.detectPackageFiles = jest.fn(() => [
         { packageFile: 'package.json' },
       ]);
       platform.getFile.mockReturnValueOnce('not json');
       const res = await resolvePackageFiles(config);
       expect(res).toMatchSnapshot();
-      expect(res.warnings).toHaveLength(1);
+      expect(res.errors).toHaveLength(1);
+    });
+    it('detect package.json and throws error if cannot parse (onboarded)', async () => {
+      manager.detectPackageFiles = jest.fn(() => [
+        { packageFile: 'package.json' },
+      ]);
+      platform.getFile.mockReturnValueOnce('not json');
+      config.repoIsOnboarded = true;
+      let e;
+      try {
+        await resolvePackageFiles(config);
+      } catch (err) {
+        e = err;
+      }
+      expect(e).toBeDefined();
+      expect(e).toMatchSnapshot();
     });
     it('detects package.json and parses json with renovate config', async () => {
       manager.detectPackageFiles = jest.fn(() => [
-- 
GitLab