From 61abc03a2e644e7766c52af394b30c9c311fe5e1 Mon Sep 17 00:00:00 2001 From: Rhys Arkins Date: Thu, 22 Apr 2021 09:16:40 +0200 Subject: [PATCH] feat(config): validate packageRules matchUpdateTypes combos (#9649) --- .../__snapshots__/validation.spec.ts.snap | 9 ++++++ lib/config/validation.spec.ts | 17 +++++++++++ lib/config/validation.ts | 28 +++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/lib/config/__snapshots__/validation.spec.ts.snap b/lib/config/__snapshots__/validation.spec.ts.snap index c13b732365e535..6ae432f8ec8c02 100644 --- a/lib/config/__snapshots__/validation.spec.ts.snap +++ b/lib/config/__snapshots__/validation.spec.ts.snap @@ -164,6 +164,15 @@ Array [ ] `; +exports[`config/validation validateConfig(config) errors if invalid combinations in packageRules 1`] = ` +Array [ + Object { + "message": "packageRules[0]: packageRules cannot combine both matchUpdateTypes and registryUrls. Rule: {\\"matchUpdateTypes\\":[\\"major\\"],\\"registryUrls\\":[\\"https://registry.npmjs.org\\"]}", + "topic": "Configuration Error", + }, +] +`; + exports[`config/validation validateConfig(config) errors if language or manager objects are nested 1`] = ` Array [ Object { diff --git a/lib/config/validation.spec.ts b/lib/config/validation.spec.ts index fe9582f4b37b71..2535fa4318097a 100644 --- a/lib/config/validation.spec.ts +++ b/lib/config/validation.spec.ts @@ -585,5 +585,22 @@ describe(getName(__filename), () => { expect(warnings).toMatchSnapshot(); expect(errors).toHaveLength(0); }); + it('errors if invalid combinations in packageRules', async () => { + const config = { + packageRules: [ + { + matchUpdateTypes: ['major'], + registryUrls: ['https://registry.npmjs.org'], + }, + ], + } as any; + const { warnings, errors } = await configValidation.validateConfig( + config, + true + ); + expect(warnings).toHaveLength(0); + expect(errors).toHaveLength(1); + expect(errors).toMatchSnapshot(); + }); }); }); diff --git a/lib/config/validation.ts b/lib/config/validation.ts index 2fed4ee6a6d85d..fde19e6814dffa 100644 --- a/lib/config/validation.ts +++ b/lib/config/validation.ts @@ -325,6 +325,34 @@ export async function validateConfig( message, }); } + // It's too late to apply any of these options once you already have updates determined + const preLookupOptions = [ + 'extractVersion', + 'followTag', + 'ignoreDeps', + 'ignoreUnstable', + 'rangeStrategy', + 'registryUrls', + 'respectLatest', + 'rollbackPrs', + 'separateMajorMinor', + 'separateMinorPatch', + 'separateMultipleMajor', + 'versioning', + ]; + if (is.nonEmptyArray(resolvedRule.matchUpdateTypes)) { + for (const option of preLookupOptions) { + if (resolvedRule[option] !== undefined) { + const message = `${currentPath}[${subIndex}]: packageRules cannot combine both matchUpdateTypes and ${option}. Rule: ${JSON.stringify( + packageRule + )}`; + errors.push({ + topic: 'Configuration Error', + message, + }); + } + } + } } else { errors.push({ topic: 'Configuration Error',