diff --git a/lib/manager/npm/resolve.js b/lib/manager/npm/resolve.js index 786d52cb4520dc345e3cffe4316047ec64012bc7..af454432789381c28deaebf5bf328547eadc4cac 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 10a1d111bac7733e5eeaeefdc7cb70c51815f6ed..3ae257a8bb268e3ccdc2977d8adb90ec0a661fe2 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')); + }); }); });