diff --git a/docs/configuration.md b/docs/configuration.md index 0b28c3763f70a098db3836fb716a441b82cdfff8..baaefc4fbaee5c08c1c1b614dbcbb7a665e48613 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -317,6 +317,22 @@ Obviously, you can't set repository or package file location with this method. <td></td> <td><td> </tr> +<tr> + <td>`packageName`</td> + <td>A package name to match. Valid only within `packages` object</td> + <td>string</td> + <td><pre>null</pre></td> + <td></td> + <td><td> +</tr> +<tr> + <td>`packagePattern`</td> + <td>A package name pattern to match. Valid only within `packages` object.</td> + <td>string</td> + <td><pre>null</pre></td> + <td></td> + <td><td> +</tr> <tr> <td>`pinVersions`</td> <td>Convert ranged versions in package.json to pinned versions</td> @@ -385,7 +401,7 @@ Obviously, you can't set repository or package file location with this method. <td>`patch`</td> <td>Configuration to apply when an update type is patch. Only applies if `separatePatchReleases` is set to true</td> <td>json</td> - <td><pre>{"branchName": "renovate/{{depName}}-{{newVersionMajor}}.{newVersionMinor}}.x"}</pre></td> + <td><pre>{"branchName": "renovate/{{depName}}-{{newVersionMajor}}.{{newVersionMinor}}.x"}</pre></td> <td>`RENOVATE_PATCH`</td> <td><td> </tr> diff --git a/lib/config/definitions.js b/lib/config/definitions.js index 554240c8be50946b7f2cd987f257400af8804a0a..139e41bf983ab45bb2aba8b54573f49dc12879b9 100644 --- a/lib/config/definitions.js +++ b/lib/config/definitions.js @@ -170,6 +170,23 @@ const options = [ cli: false, env: false, }, + { + name: 'packageName', + description: 'A package name to match. Valid only within `packages` object', + type: 'string', + stage: 'depType', + cli: false, + env: false, + }, + { + name: 'packagePattern', + description: + 'A package name pattern to match. Valid only within `packages` object.', + type: 'string', + stage: 'depType', + cli: false, + env: false, + }, // Version behaviour { name: 'pinVersions', diff --git a/lib/config/validation.js b/lib/config/validation.js index 4d4a38b635383b4ca2b83a20361b29fa017cdd4d..54063f1c114448b149036bf6266b6dc3b0035343 100644 --- a/lib/config/validation.js +++ b/lib/config/validation.js @@ -28,6 +28,10 @@ function validateConfig(config) { return Object.prototype.toString.call(obj) === '[object Object]'; } + function isString(val) { + return typeof val === 'string' || val instanceof String; + } + const foundDeprecated = []; for (const key of Object.keys(config)) { let val = config[key]; @@ -60,9 +64,18 @@ function validateConfig(config) { depName: 'Configuration Error', message: `Configuration option \`${key}\` should be a list (Array)`, }); + } else { + // eslint-disable-next-line no-loop-func + val.forEach(subval => { + if (isObject(subval)) { + const subValidation = module.exports.validateConfig(subval); + warnings = warnings.concat(subValidation.warnings); + errors = errors.concat(subValidation.errors); + } + }); } } else if (type === 'string') { - if (!(typeof val === 'string' || val instanceof String)) { + if (!isString(val)) { errors.push({ depName: 'Configuration Error', message: `Configuration option \`${key}\` should be a string`, diff --git a/test/config/__snapshots__/validation.spec.js.snap b/test/config/__snapshots__/validation.spec.js.snap index e893793b75a4bae59b22d8eecf9054e57ebeeb18..17be67ac69b7fcb6f60172f5349128c05ab8cdf8 100644 --- a/test/config/__snapshots__/validation.spec.js.snap +++ b/test/config/__snapshots__/validation.spec.js.snap @@ -22,6 +22,10 @@ Array [ "depName": "Configuration Error", "message": "Configuration option \`lockFileMaintenance\` should be a json object", }, + Object { + "depName": "Configuration Error", + "message": "Invalid configuration option: \`foo\`", + }, ] `; diff --git a/test/config/validation.spec.js b/test/config/validation.spec.js index 1c0db1422c2363b0df740e174a1e6e0b2a6ba2b0..2e99501e089587a7a380aa3582ad869102c340a1 100644 --- a/test/config/validation.spec.js +++ b/test/config/validation.spec.js @@ -23,10 +23,15 @@ describe('config/validation', () => { semanticPrefix: 7, githubAppId: 'none', lockFileMaintenance: false, + packages: [ + { + foo: 1, + }, + ], }; const { warnings, errors } = configValidation.validateConfig(config); expect(warnings).toHaveLength(0); - expect(errors).toHaveLength(5); + expect(errors).toHaveLength(6); expect(errors).toMatchSnapshot(); }); });