From 56170df9ae20b4eabc3219235b27de825a8a547d Mon Sep 17 00:00:00 2001
From: RahulGautamSingh <rahultesnik@gmail.com>
Date: Tue, 31 May 2022 09:23:25 +0530
Subject: [PATCH] refactor: move updateInternalDeps to worker logic (#15790)

---
 lib/config/types.ts                           |  1 +
 .../__snapshots__/monorepo.spec.ts.snap       |  9 ++++--
 lib/modules/manager/npm/extract/index.spec.ts |  2 +-
 lib/modules/manager/npm/extract/index.ts      | 10 +++----
 .../manager/npm/extract/monorepo.spec.ts      | 16 +++++-----
 lib/modules/manager/npm/extract/monorepo.ts   | 30 +++++++++----------
 lib/modules/manager/types.ts                  |  2 +-
 lib/workers/repository/extract/index.spec.ts  | 30 +++++++++++++++++++
 lib/workers/repository/extract/index.ts       |  8 +++++
 9 files changed, 73 insertions(+), 35 deletions(-)

diff --git a/lib/config/types.ts b/lib/config/types.ts
index de7c403a40..e1f70922e2 100644
--- a/lib/config/types.ts
+++ b/lib/config/types.ts
@@ -218,6 +218,7 @@ export interface RenovateConfig
   repoIsOnboarded?: boolean;
   repoIsActivated?: boolean;
 
+  updateInternalDeps?: boolean;
   updateType?: UpdateType;
 
   warnings?: ValidationMessage[];
diff --git a/lib/modules/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap b/lib/modules/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap
index 042573558a..2fd7c3706f 100644
--- a/lib/modules/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap
+++ b/lib/modules/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap
@@ -6,9 +6,11 @@ Array [
     "deps": Array [
       Object {
         "depName": "@org/a",
+        "isInternal": true,
       },
       Object {
         "depName": "@org/b",
+        "isInternal": true,
       },
       Object {
         "depName": "@org/c",
@@ -32,6 +34,7 @@ Array [
     "deps": Array [
       Object {
         "depName": "@org/b",
+        "isInternal": true,
       },
       Object {
         "depName": "@org/c",
@@ -72,11 +75,11 @@ Array [
     "deps": Array [
       Object {
         "depName": "@org/a",
-        "skipReason": "internal-package",
+        "isInternal": true,
       },
       Object {
         "depName": "@org/b",
-        "skipReason": "internal-package",
+        "isInternal": true,
       },
       Object {
         "depName": "@org/c",
@@ -100,7 +103,7 @@ Array [
     "deps": Array [
       Object {
         "depName": "@org/b",
-        "skipReason": "internal-package",
+        "isInternal": true,
       },
       Object {
         "depName": "@org/c",
diff --git a/lib/modules/manager/npm/extract/index.spec.ts b/lib/modules/manager/npm/extract/index.spec.ts
index b6c18455b9..5226da0f76 100644
--- a/lib/modules/manager/npm/extract/index.spec.ts
+++ b/lib/modules/manager/npm/extract/index.spec.ts
@@ -752,7 +752,7 @@ describe('modules/manager/npm/extract/index', () => {
 
   describe('.postExtract()', () => {
     it('runs', async () => {
-      await expect(npmExtract.postExtract([], false)).resolves.not.toThrow();
+      await expect(npmExtract.postExtract([])).resolves.not.toThrow();
     });
   });
 });
diff --git a/lib/modules/manager/npm/extract/index.ts b/lib/modules/manager/npm/extract/index.ts
index 3d5ba8e4a6..063e409100 100644
--- a/lib/modules/manager/npm/extract/index.ts
+++ b/lib/modules/manager/npm/extract/index.ts
@@ -472,11 +472,8 @@ export async function extractPackageFile(
   };
 }
 
-export async function postExtract(
-  packageFiles: PackageFile[],
-  updateInternalDeps: boolean
-): Promise<void> {
-  await detectMonorepos(packageFiles, updateInternalDeps);
+export async function postExtract(packageFiles: PackageFile[]): Promise<void> {
+  await detectMonorepos(packageFiles);
   await getLockedVersions(packageFiles);
 }
 
@@ -500,7 +497,8 @@ export async function extractAllPackageFiles(
       logger.debug({ packageFile }, 'packageFile has no content');
     }
   }
-  await postExtract(npmFiles, !!config.updateInternalDeps);
+
+  await postExtract(npmFiles);
   return npmFiles;
 }
 
diff --git a/lib/modules/manager/npm/extract/monorepo.spec.ts b/lib/modules/manager/npm/extract/monorepo.spec.ts
index 09f776c463..68c91a4717 100644
--- a/lib/modules/manager/npm/extract/monorepo.spec.ts
+++ b/lib/modules/manager/npm/extract/monorepo.spec.ts
@@ -48,12 +48,12 @@ describe('modules/manager/npm/extract/monorepo', () => {
           packageJsonName: '@org/b',
         },
       ] as any;
-      await detectMonorepos(packageFiles, false);
+      await detectMonorepos(packageFiles);
       expect(packageFiles).toMatchSnapshot();
       expect(packageFiles[1].managerData.lernaJsonFile).toBe('lerna.json');
       expect(
         packageFiles.some((packageFile) =>
-          packageFile.deps?.some((dep) => dep.skipReason)
+          packageFile.deps?.some((dep) => dep.isInternal)
         )
       ).toBeTrue();
     });
@@ -102,14 +102,14 @@ describe('modules/manager/npm/extract/monorepo', () => {
           packageJsonName: '@org/b',
         },
       ] as any;
-      await detectMonorepos(packageFiles, true);
+      await detectMonorepos(packageFiles);
       expect(packageFiles).toMatchSnapshot();
       expect(packageFiles[1].managerData.lernaJsonFile).toBe('lerna.json');
       expect(
         packageFiles.some((packageFile) =>
-          packageFile.deps?.some((dep) => dep.skipReason)
+          packageFile.deps?.some((dep) => dep.isInternal)
         )
-      ).toBeFalse();
+      ).toBeTrue();
     });
 
     it('uses yarn workspaces package settings with lerna', async () => {
@@ -132,7 +132,7 @@ describe('modules/manager/npm/extract/monorepo', () => {
           packageJsonName: '@org/b',
         },
       ];
-      await detectMonorepos(packageFiles, false);
+      await detectMonorepos(packageFiles);
       expect(packageFiles).toMatchSnapshot();
       expect(packageFiles[1].managerData.lernaJsonFile).toBe('lerna.json');
     });
@@ -154,7 +154,7 @@ describe('modules/manager/npm/extract/monorepo', () => {
           packageJsonName: '@org/b',
         },
       ];
-      await detectMonorepos(packageFiles, false);
+      await detectMonorepos(packageFiles);
       expect(packageFiles).toMatchSnapshot([
         {},
         { npmrc: '@org:registry=//registry.some.org\n' },
@@ -184,7 +184,7 @@ describe('modules/manager/npm/extract/monorepo', () => {
           skipInstalls: true,
         },
       ];
-      await detectMonorepos(packageFiles, false);
+      await detectMonorepos(packageFiles);
       expect(packageFiles).toMatchSnapshot([
         {},
         { managerData: { yarnZeroInstall: true }, skipInstalls: false },
diff --git a/lib/modules/manager/npm/extract/monorepo.ts b/lib/modules/manager/npm/extract/monorepo.ts
index bcbbaf89d6..ea7aec797c 100644
--- a/lib/modules/manager/npm/extract/monorepo.ts
+++ b/lib/modules/manager/npm/extract/monorepo.ts
@@ -6,8 +6,7 @@ import { detectPnpmWorkspaces } from './pnpm';
 import { matchesAnyPattern } from './utils';
 
 export async function detectMonorepos(
-  packageFiles: Partial<PackageFile>[],
-  updateInternalDeps: boolean
+  packageFiles: Partial<PackageFile>[]
 ): Promise<void> {
   await detectPnpmWorkspaces(packageFiles);
   logger.debug('Detecting Lerna and Yarn Workspaces');
@@ -41,13 +40,13 @@ export async function detectMonorepos(
       const internalPackageNames = internalPackageFiles
         .map((sp) => sp.packageJsonName)
         .filter(Boolean);
-      if (!updateInternalDeps) {
-        p.deps?.forEach((dep) => {
-          if (internalPackageNames.includes(dep.depName)) {
-            dep.skipReason = 'internal-package';
-          }
-        });
-      }
+
+      p.deps?.forEach((dep) => {
+        if (internalPackageNames.includes(dep.depName)) {
+          dep.isInternal = true;
+        }
+      });
+
       for (const subPackage of internalPackageFiles) {
         subPackage.managerData = subPackage.managerData || {};
         subPackage.managerData.lernaJsonFile = lernaJsonFile;
@@ -60,13 +59,12 @@ export async function detectMonorepos(
           subPackage.hasYarnWorkspaces = !!yarnWorkspacesPackages;
           subPackage.npmrc = subPackage.npmrc || npmrc;
         }
-        if (!updateInternalDeps) {
-          subPackage.deps?.forEach((dep) => {
-            if (internalPackageNames.includes(dep.depName)) {
-              dep.skipReason = 'internal-package';
-            }
-          });
-        }
+
+        subPackage.deps?.forEach((dep) => {
+          if (internalPackageNames.includes(dep.depName)) {
+            dep.isInternal = true;
+          }
+        });
       }
     }
   }
diff --git a/lib/modules/manager/types.ts b/lib/modules/manager/types.ts
index 6592cd6720..ec0331a20c 100644
--- a/lib/modules/manager/types.ts
+++ b/lib/modules/manager/types.ts
@@ -21,7 +21,6 @@ export interface ExtractConfig {
   npmrc?: string;
   npmrcMerge?: boolean;
   skipInstalls?: boolean;
-  updateInternalDeps?: boolean;
 }
 
 export interface RegexManagerTemplates {
@@ -172,6 +171,7 @@ export interface PackageDependency<T = Record<string, any>> extends Package<T> {
   editFile?: string;
   separateMinorPatch?: boolean;
   extractVersion?: string;
+  isInternal?: boolean;
 }
 
 export interface Upgrade<T = Record<string, any>>
diff --git a/lib/workers/repository/extract/index.spec.ts b/lib/workers/repository/extract/index.spec.ts
index 5fdae44427..91e7bdfe04 100644
--- a/lib/workers/repository/extract/index.spec.ts
+++ b/lib/workers/repository/extract/index.spec.ts
@@ -40,6 +40,36 @@ describe('workers/repository/extract/index', () => {
       expect(logger.debug).toHaveBeenCalled();
     });
 
+    it('warns if packageFiles is null', async () => {
+      config.enabledManagers = ['npm'];
+      managerFiles.getManagerPackageFiles.mockResolvedValue(null);
+      expect(await extractAllDependencies(config)).toEqual({});
+    });
+
+    it('adds skipReason to internal deps when updateInternalDeps is false/undefined', async () => {
+      config.enabledManagers = ['npm'];
+      managerFiles.getManagerPackageFiles.mockResolvedValue([
+        {
+          deps: [{ depName: 'a', isInternal: true }, { depName: 'b' }],
+        },
+      ]);
+      expect(await extractAllDependencies(config)).toEqual({
+        npm: [
+          {
+            deps: [
+              {
+                depName: 'a',
+                isInternal: true,
+                skipReason: 'internal-package',
+              },
+              { depName: 'b' },
+            ],
+          },
+        ],
+      });
+      expect(logger.debug).toHaveBeenCalled();
+    });
+
     it('checks custom managers', async () => {
       managerFiles.getManagerPackageFiles.mockResolvedValue([{} as never]);
       config.regexManagers = [{ fileMatch: ['README'], matchStrings: [''] }];
diff --git a/lib/workers/repository/extract/index.ts b/lib/workers/repository/extract/index.ts
index de496dc5db..9c9c02794c 100644
--- a/lib/workers/repository/extract/index.ts
+++ b/lib/workers/repository/extract/index.ts
@@ -47,6 +47,14 @@ export async function extractAllDependencies(
   const extractResults = await Promise.all(
     extractList.map(async (managerConfig) => {
       const packageFiles = await getManagerPackageFiles(managerConfig);
+      for (const p of packageFiles ?? []) {
+        for (const dep of p.deps ?? []) {
+          if (!config.updateInternalDeps && dep.isInternal) {
+            dep.skipReason = 'internal-package';
+          }
+        }
+      }
+
       return { manager: managerConfig.manager, packageFiles };
     })
   );
-- 
GitLab