From 23051355fb404a7fea2c44016edee982fd00a82d Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Sun, 29 Apr 2018 23:07:39 +0200
Subject: [PATCH] fix: properly migrate pathRules

---
 lib/config/migration.js                       | 47 ++++++++++---------
 .../__snapshots__/migration.spec.js.snap      | 42 ++++++++++++-----
 test/config/migration.spec.js                 |  8 ++--
 3 files changed, 59 insertions(+), 38 deletions(-)

diff --git a/lib/config/migration.js b/lib/config/migration.js
index fc7682d4a2..c9efa5be20 100644
--- a/lib/config/migration.js
+++ b/lib/config/migration.js
@@ -20,7 +20,6 @@ const removedOptions = [
   'groupCommitMessage',
   'groupPrTitle',
   'groupPrBody',
-  'pathRules',
 ];
 
 // Returns a migrated config
@@ -34,19 +33,22 @@ function migrateConfig(config) {
     }
     let isMigrated = false;
     const migratedConfig = deepcopy(config);
-    if (
-      Array.isArray(migratedConfig.pathRules) &&
-      migratedConfig.pathRules.length
-    ) {
-      isMigrated = true;
-      migratedConfig.packageRules = migratedConfig.pathRules.concat(
-        migratedConfig.packageRules || []
-      );
-    }
     for (const [key, val] of Object.entries(config)) {
       if (removedOptions.includes(key)) {
         isMigrated = true;
         delete migratedConfig[key];
+      } else if (key === 'pathRules') {
+        isMigrated = true;
+        if (Array.isArray(val)) {
+          migratedConfig.packageRules = migratedConfig.packageRules || [];
+          const migratedPathRules = migratedConfig.pathRules.map(
+            p => migrateConfig(p).migratedConfig
+          );
+          migratedConfig.packageRules = migratedPathRules.concat(
+            migratedConfig.packageRules
+          );
+        }
+        delete migratedConfig.pathRules;
       } else if (key === 'semanticPrefix') {
         isMigrated = true;
         delete migratedConfig.semanticPrefix;
@@ -113,8 +115,9 @@ function migrateConfig(config) {
         }
       } else if (key === 'packages') {
         isMigrated = true;
-        migratedConfig.packageRules = migratedConfig.packages.map(
-          p => migrateConfig(p).migratedConfig
+        migratedConfig.packageRules = migratedConfig.packageRules || [];
+        migratedConfig.packageRules = migratedConfig.packageRules.concat(
+          migratedConfig.packages.map(p => migrateConfig(p).migratedConfig)
         );
         delete migratedConfig.packages;
       } else if (key === 'excludedPackageNames') {
@@ -227,10 +230,11 @@ function migrateConfig(config) {
           if (isObject(depType)) {
             const depTypeName = depType.depType;
             if (depTypeName) {
-              migratedConfig[depTypeName] = migrateConfig(
-                depType
-              ).migratedConfig;
-              delete migratedConfig[depTypeName].depType;
+              migratedConfig.packageRules = migratedConfig.packageRules || [];
+              const newPackageRule = migrateConfig(depType).migratedConfig;
+              delete newPackageRule.depType;
+              newPackageRule.depTypeList = [depTypeName];
+              migratedConfig.packageRules.push(newPackageRule);
             }
           }
         });
@@ -263,24 +267,25 @@ function migrateConfig(config) {
           migratedConfig.node = subMigrate.migratedConfig;
         }
       } else if (isObject(val)) {
-        const subMigrate = migrateConfig(val);
+        const subMigrate = migrateConfig(migratedConfig[key]);
         if (subMigrate.isMigrated) {
           isMigrated = true;
           migratedConfig[key] = subMigrate.migratedConfig;
         }
       } else if (Array.isArray(val)) {
-        migratedConfig[key] = [];
-        for (const item of val) {
+        const newArray = [];
+        for (const item of migratedConfig[key]) {
           if (isObject(item)) {
             const arrMigrate = migrateConfig(item);
-            migratedConfig[key].push(arrMigrate.migratedConfig);
+            newArray.push(arrMigrate.migratedConfig);
             if (arrMigrate.isMigrated) {
               isMigrated = true;
             }
           } else {
-            migratedConfig[key].push(item);
+            newArray.push(item);
           }
         }
+        migratedConfig[key] = newArray;
       }
     }
     return { isMigrated, migratedConfig };
diff --git a/test/config/__snapshots__/migration.spec.js.snap b/test/config/__snapshots__/migration.spec.js.snap
index e15ba3d3f3..b373ec902f 100644
--- a/test/config/__snapshots__/migration.spec.js.snap
+++ b/test/config/__snapshots__/migration.spec.js.snap
@@ -57,17 +57,15 @@ Object {
     ],
   },
   "onboarding": false,
-  "optionalDependencies": Object {
-    "major": Object {
-      "automerge": false,
-    },
-    "minor": Object {
-      "automerge": true,
-    },
-    "respectLatest": false,
-    "schedule": "before 5am on Monday",
-  },
   "packageRules": Array [
+    Object {
+      "extends": Array [
+        "foo",
+      ],
+      "paths": Array [
+        "examples/**",
+      ],
+    },
     Object {
       "excludePackageNames": "foo",
       "groupName": "angular packages",
@@ -88,6 +86,19 @@ Object {
         "ang",
       ],
     },
+    Object {
+      "depTypeList": Array [
+        "optionalDependencies",
+      ],
+      "major": Object {
+        "automerge": false,
+      },
+      "minor": Object {
+        "automerge": true,
+      },
+      "respectLatest": false,
+      "schedule": "before 5am on Monday",
+    },
   ],
   "patch": Object {
     "automerge": true,
@@ -130,9 +141,14 @@ Object {
 exports[`config/migration migrateConfig(config, parentConfig) it migrates subconfig 1`] = `
 Object {
   "lockFileMaintenance": Object {
-    "optionalDependencies": Object {
-      "respectLatest": false,
-    },
+    "packageRules": Array [
+      Object {
+        "depTypeList": Array [
+          "optionalDependencies",
+        ],
+        "respectLatest": false,
+      },
+    ],
   },
 }
 `;
diff --git a/test/config/migration.spec.js b/test/config/migration.spec.js
index 94f61b766a..92b46a8d08 100644
--- a/test/config/migration.spec.js
+++ b/test/config/migration.spec.js
@@ -77,11 +77,11 @@ describe('config/migration', () => {
         config,
         parentConfig
       );
+      expect(migratedConfig).toMatchSnapshot();
       expect(isMigrated).toBe(true);
       expect(migratedConfig.depTypes).not.toBeDefined();
-      expect(migratedConfig.optionalDependencies.respectLatest).toBe(false);
       expect(migratedConfig.automerge).toEqual(false);
-      expect(migratedConfig).toMatchSnapshot();
+      expect(migratedConfig.packageRules).toHaveLength(5);
     });
     it('migrates before and after schedules', () => {
       const config = {
@@ -238,9 +238,9 @@ describe('config/migration', () => {
       );
       expect(isMigrated).toBe(true);
       expect(migratedConfig).toMatchSnapshot();
-      expect(migratedConfig.lockFileMaintenance.depTypes).not.toBeDefined();
+      expect(migratedConfig.lockFileMaintenance.packageRules).toHaveLength(1);
       expect(
-        migratedConfig.lockFileMaintenance.optionalDependencies.respectLatest
+        migratedConfig.lockFileMaintenance.packageRules[0].respectLatest
       ).toBe(false);
     });
     it('it migrates node to travis', () => {
-- 
GitLab