From d13d6a049557e91515708b96dc05c251507bec7b Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Mon, 30 Apr 2018 08:21:48 +0200
Subject: [PATCH] feat: deprecate deptypes and migrate to packageRules (#1892)

Rules for dep types (e.g. dependencies, devDependencies, peerDependencies, optionalDependencies) should now be done with `packageRules` and the `depTypeList` selector
---
 docs/configuration.md                         |  3 --
 lib/config/definitions.js                     | 39 ----------------
 lib/config/migration.js                       | 14 ++++++
 test/config/__snapshots__/index.spec.js.snap  |  6 ---
 .../__snapshots__/migration.spec.js.snap      | 25 ++++++-----
 test/config/index.spec.js                     | 11 -----
 test/config/migration.spec.js                 | 20 ++++-----
 .../2017-10-05-configuration-options.md       | 44 -------------------
 website/docs/_posts/2018-01-20-faq.md         |  4 +-
 9 files changed, 39 insertions(+), 127 deletions(-)

diff --git a/docs/configuration.md b/docs/configuration.md
index 98ef8ad7ae..bcbad80802 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -46,9 +46,6 @@ module.exports = {
     },
     {
       repository: 'singapore/repo2',
-      optionalDependencies: {
-        labels: ['renovate', 'optional'],
-      },
       labels: ['renovate'],
     },
     'singapore/repo3',
diff --git a/lib/config/definitions.js b/lib/config/definitions.js
index 52d8aaa16e..bcb6bf3100 100644
--- a/lib/config/definitions.js
+++ b/lib/config/definitions.js
@@ -289,45 +289,6 @@ const options = [
     cli: false,
     env: false,
   },
-  {
-    name: 'dependencies',
-    description: 'Configuration specifically for `package.json`>`dependencies`',
-    stage: 'packageFile',
-    type: 'json',
-    default: {},
-    mergeable: true,
-    cli: false,
-  },
-  {
-    name: 'devDependencies',
-    description:
-      'Configuration specifically for `package.json`>`devDependencies`',
-    stage: 'packageFile',
-    type: 'json',
-    default: {},
-    mergeable: true,
-    cli: false,
-  },
-  {
-    name: 'optionalDependencies',
-    description:
-      'Configuration specifically for `package.json`>`optionalDependencies`',
-    stage: 'packageFile',
-    type: 'json',
-    default: {},
-    mergeable: true,
-    cli: false,
-  },
-  {
-    name: 'peerDependencies',
-    description:
-      'Configuration specifically for `package.json`>`peerDependencies`',
-    stage: 'packageFile',
-    type: 'json',
-    default: {},
-    mergeable: true,
-    cli: false,
-  },
   {
     name: 'engines',
     description: 'Configuration specifically for `package.json`>`engines`',
diff --git a/lib/config/migration.js b/lib/config/migration.js
index c9efa5be20..b5411756c4 100644
--- a/lib/config/migration.js
+++ b/lib/config/migration.js
@@ -33,6 +33,12 @@ function migrateConfig(config) {
     }
     let isMigrated = false;
     const migratedConfig = deepcopy(config);
+    const depTypes = [
+      'dependencies',
+      'devDependencies',
+      'optionalDependencies',
+      'peerDependencies',
+    ];
     for (const [key, val] of Object.entries(config)) {
       if (removedOptions.includes(key)) {
         isMigrated = true;
@@ -49,6 +55,14 @@ function migrateConfig(config) {
           );
         }
         delete migratedConfig.pathRules;
+      } else if (depTypes.includes(key)) {
+        isMigrated = true;
+        migratedConfig.packageRules = migratedConfig.packageRules || [];
+        const depTypePackageRule = migrateConfig(val).migratedConfig;
+        depTypePackageRule.depTypeList = [key];
+        delete depTypePackageRule.packageRules;
+        migratedConfig.packageRules.push(depTypePackageRule);
+        delete migratedConfig[key];
       } else if (key === 'semanticPrefix') {
         isMigrated = true;
         delete migratedConfig.semanticPrefix;
diff --git a/test/config/__snapshots__/index.spec.js.snap b/test/config/__snapshots__/index.spec.js.snap
index b0e1861808..8243dc5251 100644
--- a/test/config/__snapshots__/index.spec.js.snap
+++ b/test/config/__snapshots__/index.spec.js.snap
@@ -36,12 +36,10 @@ Object {
   "commitMessageTopic": "dependency {{depName}}",
   "copyLocalLibs": false,
   "depTypeList": Array [],
-  "dependencies": Object {},
   "description": Array [
     "Rate limit PR creation to a maximum of one per hour",
     "Automerge patch upgrades if they pass tests",
   ],
-  "devDependencies": Object {},
   "digest": Object {},
   "docker": Object {
     "commitMessageTopic": "{{{depName}}} Docker tag",
@@ -138,7 +136,6 @@ Object {
   "nvm": Object {},
   "onboarding": true,
   "onboardingConfig": Object {},
-  "optionalDependencies": Object {},
   "packageFiles": Array [],
   "packageNames": Array [],
   "packagePatterns": Array [],
@@ -148,7 +145,6 @@ Object {
     "branchTopic": "{{{depNameSanitized}}}-{{{newVersionMajor}}}.{{{newVersionMinor}}}.x",
   },
   "paths": Array [],
-  "peerDependencies": Object {},
   "pin": Object {
     "commitMessageAction": "Pin",
     "group": Object {
@@ -248,5 +244,3 @@ Object {
   ],
 }
 `;
-
-exports[`config/index mergeChildConfig(parentConfig, childConfig) merges depTypes 1`] = `undefined`;
diff --git a/test/config/__snapshots__/migration.spec.js.snap b/test/config/__snapshots__/migration.spec.js.snap
index b373ec902f..09162a598a 100644
--- a/test/config/__snapshots__/migration.spec.js.snap
+++ b/test/config/__snapshots__/migration.spec.js.snap
@@ -14,15 +14,6 @@ Object {
     "next",
   ],
   "commitMessage": "{{#if semanticCommitType}}{{semanticCommitType}}{{#if semanticCommitScope}}({{semanticCommitScope}}){{/if}}: {{/if}}some commit message",
-  "devDependencies": Object {
-    "major": Object {
-      "automerge": false,
-    },
-    "minor": Object {
-      "automerge": true,
-    },
-    "schedule": Array [],
-  },
   "enabled": true,
   "extends": Array [
     "config:js-app",
@@ -86,6 +77,18 @@ Object {
         "ang",
       ],
     },
+    Object {
+      "depTypeList": Array [
+        "devDependencies",
+      ],
+      "major": Object {
+        "automerge": false,
+      },
+      "minor": Object {
+        "automerge": true,
+      },
+      "schedule": Array [],
+    },
     Object {
       "depTypeList": Array [
         "optionalDependencies",
@@ -180,13 +183,13 @@ Object {
 
 exports[`config/migration migrateConfig(config, parentConfig) migrates before and after schedules 1`] = `
 Object {
-  "dependencies": Object {
+  "major": Object {
     "schedule": Array [
       "after 10pm",
       "before 7am",
     ],
   },
-  "devDependencies": Object {
+  "minor": Object {
     "schedule": Array [
       "after 10pm every weekday",
       "before 7am every weekday",
diff --git a/test/config/index.spec.js b/test/config/index.spec.js
index b6516a1666..af69477e66 100644
--- a/test/config/index.spec.js
+++ b/test/config/index.spec.js
@@ -245,17 +245,6 @@ describe('config/index', () => {
       expect(config.lockFileMaintenance.schedule).toEqual(['on monday']);
       expect(config.lockFileMaintenance).toMatchSnapshot();
     });
-    it('merges depTypes', () => {
-      const parentConfig = { ...defaultConfig };
-      const childConfig = {
-        dependencies: {},
-        devDependencies: { foo: 1 },
-        peerDependencies: {},
-      };
-      const configParser = require('../../lib/config/index.js');
-      const config = configParser.mergeChildConfig(parentConfig, childConfig);
-      expect(config.depTypes).toMatchSnapshot();
-    });
     it('merges packageRules', () => {
       const parentConfig = { ...defaultConfig };
       Object.assign(parentConfig, {
diff --git a/test/config/migration.spec.js b/test/config/migration.spec.js
index 92b46a8d08..5942d9f8ee 100644
--- a/test/config/migration.spec.js
+++ b/test/config/migration.spec.js
@@ -81,14 +81,14 @@ describe('config/migration', () => {
       expect(isMigrated).toBe(true);
       expect(migratedConfig.depTypes).not.toBeDefined();
       expect(migratedConfig.automerge).toEqual(false);
-      expect(migratedConfig.packageRules).toHaveLength(5);
+      expect(migratedConfig.packageRules).toHaveLength(6);
     });
     it('migrates before and after schedules', () => {
       const config = {
-        dependencies: {
+        major: {
           schedule: 'after 10pm and before 7am',
         },
-        devDependencies: {
+        minor: {
           schedule: 'after 10pm and before 7am on every weekday',
         },
       };
@@ -99,15 +99,15 @@ describe('config/migration', () => {
       );
       expect(migratedConfig).toMatchSnapshot();
       expect(isMigrated).toBe(true);
-      expect(migratedConfig.dependencies.schedule.length).toBe(2);
-      expect(migratedConfig.dependencies.schedule[0]).toEqual('after 10pm');
-      expect(migratedConfig.dependencies.schedule[1]).toEqual('before 7am');
-      expect(migratedConfig.devDependencies.schedule).toMatchSnapshot();
-      expect(migratedConfig.devDependencies.schedule.length).toBe(2);
-      expect(migratedConfig.devDependencies.schedule[0]).toEqual(
+      expect(migratedConfig.major.schedule.length).toBe(2);
+      expect(migratedConfig.major.schedule[0]).toEqual('after 10pm');
+      expect(migratedConfig.major.schedule[1]).toEqual('before 7am');
+      expect(migratedConfig.minor.schedule).toMatchSnapshot();
+      expect(migratedConfig.minor.schedule.length).toBe(2);
+      expect(migratedConfig.minor.schedule[0]).toEqual(
         'after 10pm every weekday'
       );
-      expect(migratedConfig.devDependencies.schedule[1]).toEqual(
+      expect(migratedConfig.minor.schedule[1]).toEqual(
         'before 7am every weekday'
       );
     });
diff --git a/website/docs/_posts/2017-10-05-configuration-options.md b/website/docs/_posts/2017-10-05-configuration-options.md
index dfaac12bad..a68a761233 100644
--- a/website/docs/_posts/2017-10-05-configuration-options.md
+++ b/website/docs/_posts/2017-10-05-configuration-options.md
@@ -272,17 +272,6 @@ A list of depType names inside a package rule to filter on. Matches all depTypes
 
 Use this field if you want to limit a `packageRule` to certain `depType` values. Invalid if used outside of a `packageRule`.
 
-## dependencies
-
-Configuration specific for `package.json > dependencies`.
-
-| name    | value                            |
-| ------- | -------------------------------- |
-| type    | object                           |
-| default | {"semanticPrefix": "fix(deps):"} |
-
-Extend this if you wish to configure rules specifically for `dependencies` and not `devDependencies` or `optionalDependencies`.
-
 ## description
 
 | name    | value  |
@@ -292,17 +281,6 @@ Extend this if you wish to configure rules specifically for `dependencies` and n
 
 The description field is used by config presets to describe what they do. They are then collated as part of the onboarding description.
 
-## devDependencies
-
-Configuration specific for `package.json > devDependencies`.
-
-| name    | value  |
-| ------- | ------ |
-| type    | object |
-| default | {}     |
-
-Extend this if you wish to configure rules specifically for `devDependencies` and not `dependencies` or `optionalDependencies`.
-
 ## digest
 
 Configuration specific for Docker digest pinning.
@@ -724,17 +702,6 @@ Configuration specific for `.nvmrc` files.
 
 For settings common to all node.js version updates (e.g. travis, nvm, etc) you can use the `node` object instead.
 
-## optionalDependencies
-
-Configuration specific for `package.json > optionalDependencies`.
-
-| name    | value  |
-| ------- | ------ |
-| type    | object |
-| default | {}     |
-
-Extend this if you wish to configure rules specifically for `optionalDependencies` and not `dependencies` or `devDependencies`.
-
 ## packageFiles
 
 A manually provisioned list of package files to use.
@@ -866,17 +833,6 @@ List of strings or glob patterns to match against package files. Applicable insi
 | type    | list  |
 | default | []    |
 
-## peerDependencies
-
-Configuration specific for `package.json > peerDependencies`.
-
-| name    | value              |
-| ------- | ------------------ |
-| type    | object             |
-| default | {"enabled": false} |
-
-Extend this if you wish to configure rules specifically for `peerDependencies`. Disabled by default.
-
 ## pin
 
 Configuration specific for dependency pinning.
diff --git a/website/docs/_posts/2018-01-20-faq.md b/website/docs/_posts/2018-01-20-faq.md
index 79536c02a0..f67ea614a4 100644
--- a/website/docs/_posts/2018-01-20-faq.md
+++ b/website/docs/_posts/2018-01-20-faq.md
@@ -106,9 +106,7 @@ You could:
 
 ### Disable renovate for certain dependency types
 
-If you want to disable `renovate` for `optionalDependencies`, for example, you
-could define your own `depTypes` array (in either a `renovate.json` or
-`package.json` file)
+Define a packageRules entry which has the dependency type(s) in `depTypeList` and `"enabled": false`.
 
 ### Use a single branch/PR for all dependency upgrades
 
-- 
GitLab