From 8b9d038fa30d3acffe706b15f751b1f40690c7c4 Mon Sep 17 00:00:00 2001
From: RahulGautamSingh <rahultesnik@gmail.com>
Date: Wed, 6 Jul 2022 10:09:48 +0530
Subject: [PATCH] refactor(migrations): migrate node (#16422)

Co-authored-by: Jamie Magee <jamie.magee@gmail.com>
---
 lib/config/migration.ts                       | 11 --------
 .../migrations/custom/node-migration.spec.ts  | 26 +++++++++++++++++++
 .../migrations/custom/node-migration.ts       | 22 ++++++++++++++++
 lib/config/migrations/migrations-service.ts   |  2 ++
 4 files changed, 50 insertions(+), 11 deletions(-)
 create mode 100644 lib/config/migrations/custom/node-migration.spec.ts
 create mode 100644 lib/config/migrations/custom/node-migration.ts

diff --git a/lib/config/migration.ts b/lib/config/migration.ts
index 4fcd2c952e..2d35cafd13 100644
--- a/lib/config/migration.ts
+++ b/lib/config/migration.ts
@@ -137,17 +137,6 @@ export function migrateConfig(config: RenovateConfig): MigratedConfig {
         val.length === 1
       ) {
         migratedConfig[key] = String(val[0]);
-      } else if (key === 'node' && (val as RenovateConfig).enabled === true) {
-        // validated non-null
-        delete migratedConfig.node!.enabled;
-        migratedConfig.travis = migratedConfig.travis ?? {};
-        migratedConfig.travis.enabled = true;
-        if (Object.keys(migratedConfig.node!).length) {
-          const subMigrate = migrateConfig(migratedConfig.node!);
-          migratedConfig.node = subMigrate.migratedConfig;
-        } else {
-          delete migratedConfig.node;
-        }
       } else if (is.array(val)) {
         if (is.array(migratedConfig?.[key])) {
           const newArray = [];
diff --git a/lib/config/migrations/custom/node-migration.spec.ts b/lib/config/migrations/custom/node-migration.spec.ts
new file mode 100644
index 0000000000..c7eaa60f6f
--- /dev/null
+++ b/lib/config/migrations/custom/node-migration.spec.ts
@@ -0,0 +1,26 @@
+import { NodeMigration } from './node-migration';
+
+describe('config/migrations/custom/node-migration', () => {
+  it('should migrate node to travis', () => {
+    expect(NodeMigration).toMigrate(
+      {
+        node: { enabled: true },
+      },
+      {
+        travis: { enabled: true },
+      }
+    );
+  });
+
+  it('should not delete node incase it has more than one property', () => {
+    expect(NodeMigration).toMigrate(
+      {
+        node: { enabled: true, automerge: false },
+      },
+      {
+        node: { automerge: false },
+        travis: { enabled: true },
+      }
+    );
+  });
+});
diff --git a/lib/config/migrations/custom/node-migration.ts b/lib/config/migrations/custom/node-migration.ts
new file mode 100644
index 0000000000..7baee4c8fe
--- /dev/null
+++ b/lib/config/migrations/custom/node-migration.ts
@@ -0,0 +1,22 @@
+import type { RenovateConfig } from '../../types';
+import { AbstractMigration } from '../base/abstract-migration';
+
+export class NodeMigration extends AbstractMigration {
+  override readonly propertyName = 'node';
+
+  override run(value: unknown): void {
+    const node = this.get('node') as RenovateConfig;
+    if ((value as RenovateConfig).enabled === true) {
+      // validated non-null
+      delete node.enabled;
+      const travis = (this.get('travis') ?? {}) as RenovateConfig;
+      travis.enabled = true;
+      if (Object.keys(node).length) {
+        this.rewrite(node);
+      } else {
+        this.delete('node');
+      }
+      this.setSafely('travis', travis);
+    }
+  }
+}
diff --git a/lib/config/migrations/migrations-service.ts b/lib/config/migrations/migrations-service.ts
index 4097ad0617..9093003b10 100644
--- a/lib/config/migrations/migrations-service.ts
+++ b/lib/config/migrations/migrations-service.ts
@@ -23,6 +23,7 @@ import { HostRulesMigration } from './custom/host-rules-migration';
 import { IgnoreNodeModulesMigration } from './custom/ignore-node-modules-migration';
 import { IgnoreNpmrcFileMigration } from './custom/ignore-npmrc-file-migration';
 import { MatchStringsMigration } from './custom/match-strings-migration';
+import { NodeMigration } from './custom/node-migration';
 import { PackageNameMigration } from './custom/package-name-migration';
 import { PackagePatternMigration } from './custom/package-pattern-migration';
 import { PackagesMigration } from './custom/packages-migration';
@@ -127,6 +128,7 @@ export class MigrationsService {
     VersionStrategyMigration,
     DryRunMigration,
     RequireConfigMigration,
+    NodeMigration,
     SemanticPrefixMigration,
   ];
 
-- 
GitLab