diff --git a/lib/manager/index.js b/lib/manager/index.js index 7f7a753de4439a4f485779e4e029c098655f0dd8..927ba8f17515e42f3f6d3b3034396c1d854fc6a3 100644 --- a/lib/manager/index.js +++ b/lib/manager/index.js @@ -191,6 +191,5 @@ async function resolvePackageFiles(config) { return packageFile; }); - platform.ensureIssueClosing('Action Required: Fix Renovate Configuration'); return checkMonorepos({ ...config, packageFiles }); } diff --git a/lib/manager/npm/package.js b/lib/manager/npm/package.js index c042fbde6bb189af2c17ed51dbf5a929ea1caae3..17511efc06b7ebbe5569661f0650cf13ee479df6 100644 --- a/lib/manager/npm/package.js +++ b/lib/manager/npm/package.js @@ -45,18 +45,25 @@ async function getPackageUpdates(config) { ); } } else { - // If dependency lookup fails then warn and return - const result = { - type: 'warning', - message: 'Failed to look up dependency', - }; if ( config.updateLockFiles && (config.yarnLock || config.packageLock || config.npmShrinkwrap) ) { - result.message += - '. This will block *all* dependencies from being updated due to presence of lock file.'; + // Config error + const error = new Error('config-validation'); + error.configFile = config.packageFile; + error.validationError = `Failed to look up npm dependency \`${ + config.depName + }\``; + error.validationMessage = + 'This dependency lookup failure will cause all lock file updates to fail. Please either remove the dependency, or remove the lock file, or add npm authentication, or set `updateLockFiles` to false in your config.'; + throw error; } + // If dependency lookup fails then warn and return + const result = { + type: 'warning', + message: `Failed to look up dependency ${config.depName}`, + }; results = [result]; logger.info({ dependency: config.depName }, result.message); } diff --git a/lib/workers/repository/error-config.js b/lib/workers/repository/error-config.js index c203df361f51f875744cd2d4468279f49fb9e59c..a8dcb869468f364f3a742728e9b378de7e5a9204 100644 --- a/lib/workers/repository/error-config.js +++ b/lib/workers/repository/error-config.js @@ -4,9 +4,9 @@ module.exports = { async function raiseConfigWarningIssue(config, error) { logger.debug('raiseConfigWarningIssue()'); - let body = `There is an error with this repository's Renovate configuration that needs to be fixed. As a precaution, Renovate will stop renovations until it is fixed.\n\n`; + let body = `There is an error with this repository's Renovate configuration that needs to be fixed. As a precaution, Renovate will stop PRs until it is resolved.\n\n`; if (error.configFile) { - body += `Configuration file: \`${error.configFile}\`\n`; + body += `File: \`${error.configFile}\`\n`; } body += `Error type: ${error.validationError}\n`; if (error.validationMessage) { @@ -23,7 +23,7 @@ async function raiseConfigWarningIssue(config, error) { 'Action Required: Fix Renovate Configuration', body ); - if (res) { + if (res === 'created') { logger.warn({ configError: error, res }, 'Config Warning'); } } diff --git a/lib/workers/repository/updates/index.js b/lib/workers/repository/updates/index.js index 856f60846a07203ff04351ba51aa6b9670ef426b..cdfcc1baaf0d73dbec1ad4a8e95f5595e68aa17d 100644 --- a/lib/workers/repository/updates/index.js +++ b/lib/workers/repository/updates/index.js @@ -10,6 +10,7 @@ async function determineUpdates(input) { logger.debug('determineUpdates()'); logger.trace({ config }); config = await determineRepoUpgrades(config); + platform.ensureIssueClosing('Action Required: Fix Renovate Configuration'); config = branchifyUpgrades(config); logger.debug('Finished determining upgrades'); return config; diff --git a/test/manager/npm/__snapshots__/package.spec.js.snap b/test/manager/npm/__snapshots__/package.spec.js.snap index de45e88d218520f37bda21dd7cd4e8bc04d42e80..b3802a82da270917d886d8f1f971a687d96a6f77 100644 --- a/test/manager/npm/__snapshots__/package.spec.js.snap +++ b/test/manager/npm/__snapshots__/package.spec.js.snap @@ -6,30 +6,10 @@ Array [ ] `; -exports[`lib/workers/package/npm getPackageUpdates returns error if no npm scoped dep found 1`] = ` -Array [ - Object { - "message": "Failed to look up dependency. This will block *all* dependencies from being updated due to presence of lock file.", - "repositoryUrl": null, - "type": "warning", - }, -] -`; - exports[`lib/workers/package/npm getPackageUpdates returns warning if no npm dep found 1`] = ` Array [ Object { - "message": "Failed to look up dependency", - "repositoryUrl": null, - "type": "warning", - }, -] -`; - -exports[`lib/workers/package/npm getPackageUpdates returns warning if no npm dep found and lock file 1`] = ` -Array [ - Object { - "message": "Failed to look up dependency. This will block *all* dependencies from being updated due to presence of lock file.", + "message": "Failed to look up dependency some-dep", "repositoryUrl": null, "type": "warning", }, diff --git a/test/manager/npm/package.spec.js b/test/manager/npm/package.spec.js index 9e7f2f3f39055b44b92cfa3e573ba893996c383d..4227ad3fe37289a95c4647430ad1d9277fffc0a1 100644 --- a/test/manager/npm/package.spec.js +++ b/test/manager/npm/package.spec.js @@ -48,21 +48,26 @@ describe('lib/workers/package/npm', () => { expect(res[0].type).toEqual('warning'); expect(npmApi.getDependency.mock.calls.length).toBe(1); }); - it('returns warning if no npm dep found and lock file', async () => { + it('throws error if no npm dep found and lock file', async () => { config.packageLock = 'some package lock'; - const res = await npm.getPackageUpdates(config); - expect(res).toMatchSnapshot(); - expect(res).toHaveLength(1); - expect(res[0].type).toEqual('warning'); - expect(npmApi.getDependency.mock.calls.length).toBe(1); + let e; + try { + await npm.getPackageUpdates(config); + } catch (err) { + e = err; + } + expect(e).toBeDefined(); }); it('returns error if no npm scoped dep found', async () => { config.depName = '@foo/something'; config.yarnLock = '# some yarn lock'; - const res = await npm.getPackageUpdates(config); - expect(res).toMatchSnapshot(); - expect(res).toHaveLength(1); - expect(res[0].type).toEqual('warning'); + let e; + try { + await npm.getPackageUpdates(config); + } catch (err) { + e = err; + } + expect(e).toBeDefined(); }); it('returns warning if warning found', async () => { npmApi.getDependency.mockReturnValueOnce({});