diff --git a/lib/config/validation-helpers/managers.js b/lib/config/validation-helpers/managers.js new file mode 100644 index 0000000000000000000000000000000000000000..d6601ba2e2cfd6fc400428f228a34fc2a0156316 --- /dev/null +++ b/lib/config/validation-helpers/managers.js @@ -0,0 +1,36 @@ +const { getManagerList } = require('../../manager'); +/** + * Only if type condition or context condition violated then errors array will be mutated to store metadata + * @param {Obgect} param + * * {Obgect} param.resolvedRule + * * {string} param.currentPath + * @returns {Array} with finded error or empty array + */ +const check = ({ resolvedRule, currentPath }) => { + let managersErrMessage; + if (Array.isArray(resolvedRule.managers)) { + if ( + resolvedRule.managers.find( + confManager => !getManagerList().includes(confManager) + ) + ) { + managersErrMessage = `${currentPath}: + You have included an unsupported manager in a package rule. Your list: ${ + resolvedRule.managers + }. + Supported managers are: (${getManagerList().join(', ')}).`; + } + } else if (typeof resolvedRule.managers !== 'undefined') + managersErrMessage = `${currentPath}: Managers should be type of List. You have included ${typeof resolvedRule.managers}.`; + + return managersErrMessage + ? [ + { + depName: 'Configuration Error', + message: managersErrMessage, + }, + ] + : []; +}; + +module.exports = { check }; diff --git a/lib/config/validation.js b/lib/config/validation.js index fe52a24ba7e5ffb938f1a9229072d58915d01285..a035fb806bdba9304c59f5522bcce4045c1a98b7 100644 --- a/lib/config/validation.js +++ b/lib/config/validation.js @@ -6,6 +6,7 @@ const { hasValidSchedule, hasValidTimezone, } = require('../workers/branch/schedule'); +const managerValidator = require('./validation-helpers/managers'); let optionTypes; @@ -148,6 +149,9 @@ async function validateConfig(config, isPreset, parentPath) { let hasSelector = false; if (is.object(packageRule)) { const resolvedRule = await resolveConfigPresets(packageRule); + errors.push( + ...managerValidator.check({ resolvedRule, currentPath }) + ); for (const pKey of Object.keys(resolvedRule)) { if (selectors.includes(pKey)) { hasSelector = true; diff --git a/test/config/__snapshots__/validation.spec.js.snap b/test/config/__snapshots__/validation.spec.js.snap index b7240fe9ac30448d8e7a964d5b1a09bf29a54998..8fa64e72854f3795e2e714df2e2e336a64d3985a 100644 --- a/test/config/__snapshots__/validation.spec.js.snap +++ b/test/config/__snapshots__/validation.spec.js.snap @@ -68,6 +68,30 @@ Array [ exports[`config/validation validateConfig(config) ignore packageRule nesting validation for presets 1`] = `Array []`; +exports[`config/validation validateConfig(config) included managers of the wrong type 1`] = ` +Array [ + Object { + "depName": "Configuration Error", + "message": "Configuration option \`packageRules[0].managers\` should be a list (Array)", + }, + Object { + "depName": "Configuration Error", + "message": "packageRules: Managers should be type of List. You have included string.", + }, +] +`; + +exports[`config/validation validateConfig(config) included unsupported manager 1`] = ` +Array [ + Object { + "depName": "Configuration Error", + "message": "packageRules: + You have included an unsupported manager in a package rule. Your list: foo. + Supported managers are: (ansible, bazel, buildkite, bundler, cargo, circleci, composer, docker-compose, dockerfile, github-actions, gitlabci, gomod, gradle, gradle-wrapper, kubernetes, maven, meteor, npm, nuget, nvm, pip_requirements, pip_setup, pipenv, terraform, travis).", + }, +] +`; + exports[`config/validation validateConfig(config) returns deprecation warnings 1`] = ` Array [ Object { diff --git a/test/config/validation.spec.js b/test/config/validation.spec.js index 4a09518f33d2e37ff3d016ec2795bf7e9ca14d67..267e766a533fd4e7bb1ec1e5b69f0edbef3a9cbf 100644 --- a/test/config/validation.spec.js +++ b/test/config/validation.spec.js @@ -32,6 +32,36 @@ describe('config/validation', () => { expect(errors).toHaveLength(3); expect(errors).toMatchSnapshot(); }); + it('included unsupported manager', async () => { + const config = { + packageRules: [ + { + managers: ['foo'], + }, + ], + }; + const { warnings, errors } = await configValidation.validateConfig( + config + ); + expect(warnings).toHaveLength(0); + expect(errors).toHaveLength(1); + expect(errors).toMatchSnapshot(); + }); + it('included managers of the wrong type', async () => { + const config = { + packageRules: [ + { + managers: 'string not an array', + }, + ], + }; + const { warnings, errors } = await configValidation.validateConfig( + config + ); + expect(warnings).toHaveLength(0); + expect(errors).toHaveLength(2); + expect(errors).toMatchSnapshot(); + }); it('errors for all types', async () => { const config = { allowedVersions: 'foo',