From 5cdb9a86f05040f1c070826e0d95929fcc6b69d8 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Sat, 18 Feb 2023 16:06:03 +0100
Subject: [PATCH] refactor: move manager fields to managerData (#20486)

---
 .../maven/__snapshots__/index.spec.ts.snap    |   2 -
 lib/modules/manager/maven/extract.ts          |  14 +-
 lib/modules/manager/maven/index.spec.ts       |   7 -
 .../extract/__snapshots__/index.spec.ts.snap  | 250 +++++++++---------
 .../__snapshots__/monorepo.spec.ts.snap       |  86 +++---
 .../extract/__snapshots__/pnpm.spec.ts.snap   |  64 +++--
 lib/modules/manager/npm/extract/index.spec.ts |  42 ++-
 lib/modules/manager/npm/extract/index.ts      |  23 +-
 .../npm/extract/locked-versions.spec.ts       |  75 ++++--
 .../manager/npm/extract/locked-versions.ts    |   6 +-
 .../manager/npm/extract/monorepo.spec.ts      |  54 ++--
 lib/modules/manager/npm/extract/monorepo.ts   |  32 +--
 lib/modules/manager/npm/extract/pnpm.spec.ts  |  84 +++---
 lib/modules/manager/npm/extract/pnpm.ts       |   9 +-
 .../manager/npm/post-update/index.spec.ts     |  56 ++--
 lib/modules/manager/npm/post-update/index.ts  |  80 ++++--
 .../manager/npm/post-update/lerna.spec.ts     |   4 +-
 lib/modules/manager/npm/post-update/lerna.ts  |  10 +-
 lib/modules/manager/npm/post-update/types.ts  |   3 +-
 lib/modules/manager/npm/types.ts              |  15 +-
 lib/modules/manager/types.ts                  |  26 +-
 21 files changed, 539 insertions(+), 403 deletions(-)

diff --git a/lib/modules/manager/maven/__snapshots__/index.spec.ts.snap b/lib/modules/manager/maven/__snapshots__/index.spec.ts.snap
index 38ea4b5feb..2394584350 100644
--- a/lib/modules/manager/maven/__snapshots__/index.spec.ts.snap
+++ b/lib/modules/manager/maven/__snapshots__/index.spec.ts.snap
@@ -33,7 +33,6 @@ exports[`modules/manager/maven/index updateDependency should include registryUrl
       },
     ],
     "packageFile": "parent.pom.xml",
-    "parent": "child.pom.xml",
   },
   {
     "datasource": "maven",
@@ -188,7 +187,6 @@ exports[`modules/manager/maven/index updateDependency should include registryUrl
     ],
     "packageFile": "child.pom.xml",
     "packageFileVersion": "0.0.1",
-    "parent": "parent.pom.xml",
   },
 ]
 `;
diff --git a/lib/modules/manager/maven/extract.ts b/lib/modules/manager/maven/extract.ts
index c83842f3ae..c43c88d25b 100644
--- a/lib/modules/manager/maven/extract.ts
+++ b/lib/modules/manager/maven/extract.ts
@@ -245,6 +245,11 @@ function resolveParentFile(packageFile: string, parentPath: string): string {
   return upath.normalize(upath.join(dir, parentDir, parentFile));
 }
 
+interface MavenInterimPackageFile extends PackageFile {
+  mavenProps?: Record<string, any>;
+  parent?: string;
+}
+
 export function extractPackage(
   rawContent: string,
   packageFile: string | null = null
@@ -258,7 +263,7 @@ export function extractPackage(
     return null;
   }
 
-  const result: PackageFile = {
+  const result: MavenInterimPackageFile = {
     datasource: MavenDatasource.id,
     packageFile,
     deps: [],
@@ -366,7 +371,7 @@ export function parseSettings(raw: string): XmlDocument | null {
 
 export function resolveParents(packages: PackageFile[]): PackageFile[] {
   const packageFileNames: string[] = [];
-  const extractedPackages: Record<string, PackageFile> = {};
+  const extractedPackages: Record<string, MavenInterimPackageFile> = {};
   const extractedDeps: Record<string, PackageDependency[]> = {};
   const extractedProps: Record<string, MavenProp> = {};
   const registryUrls: Record<string, Set<string>> = {};
@@ -384,7 +389,7 @@ export function resolveParents(packages: PackageFile[]): PackageFile[] {
     registryUrls[name] = new Set();
     const propsHierarchy: Record<string, MavenProp>[] = [];
     const visitedPackages: Set<string> = new Set();
-    let pkg: PackageFile | null = extractedPackages[name];
+    let pkg: MavenInterimPackageFile | null = extractedPackages[name];
     while (pkg) {
       propsHierarchy.unshift(pkg.mavenProps!);
 
@@ -450,10 +455,11 @@ export function resolveParents(packages: PackageFile[]): PackageFile[] {
 }
 
 function cleanResult(
-  packageFiles: PackageFile<Record<string, any>>[]
+  packageFiles: MavenInterimPackageFile[]
 ): PackageFile<Record<string, any>>[] {
   packageFiles.forEach((packageFile) => {
     delete packageFile.mavenProps;
+    delete packageFile.parent;
     packageFile.deps.forEach((dep) => {
       delete dep.propSource;
     });
diff --git a/lib/modules/manager/maven/index.spec.ts b/lib/modules/manager/maven/index.spec.ts
index 3040bfaccf..d03c0b169d 100644
--- a/lib/modules/manager/maven/index.spec.ts
+++ b/lib/modules/manager/maven/index.spec.ts
@@ -55,12 +55,6 @@ describe('modules/manager/maven/index', () => {
     it('should return package files info', async () => {
       fs.readLocalFile.mockResolvedValueOnce(pomContent);
       const packages = await extractAllPackageFiles({}, ['random.pom.xml']);
-      // windows path fix
-      for (const p of packages) {
-        if (p.parent) {
-          p.parent = p.parent.replace(/\\/g, '/');
-        }
-      }
       expect(packages).toMatchObject([
         {
           deps: [
@@ -129,7 +123,6 @@ describe('modules/manager/maven/index', () => {
             },
           ],
           packageFile: 'random.pom.xml',
-          parent: '../pom.xml',
         },
       ]);
     });
diff --git a/lib/modules/manager/npm/extract/__snapshots__/index.spec.ts.snap b/lib/modules/manager/npm/extract/__snapshots__/index.spec.ts.snap
index 96a7667e98..668bbac7b8 100644
--- a/lib/modules/manager/npm/extract/__snapshots__/index.spec.ts.snap
+++ b/lib/modules/manager/npm/extract/__snapshots__/index.spec.ts.snap
@@ -11,21 +11,21 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() catches invalid
     },
   ],
   "extractedConstraints": {},
-  "lernaClient": undefined,
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": undefined,
     "lernaJsonFile": undefined,
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": undefined,
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": undefined,
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": undefined,
-  "packageJsonName": undefined,
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": undefined,
-  "yarnLock": undefined,
 }
 `;
 
@@ -132,21 +132,21 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() extracts engine
     "vscode": ">=1.49.3",
     "yarn": "disabled",
   },
-  "lernaClient": undefined,
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": undefined,
     "lernaJsonFile": undefined,
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": undefined,
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": undefined,
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": undefined,
-  "packageJsonName": undefined,
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": undefined,
-  "yarnLock": undefined,
 }
 `;
 
@@ -312,21 +312,21 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() extracts non-np
     },
   ],
   "extractedConstraints": {},
-  "lernaClient": undefined,
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": undefined,
     "lernaJsonFile": undefined,
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": undefined,
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": undefined,
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": undefined,
-  "packageJsonName": undefined,
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": undefined,
-  "yarnLock": undefined,
 }
 `;
 
@@ -361,21 +361,21 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() extracts npm pa
     },
   ],
   "extractedConstraints": {},
-  "lernaClient": undefined,
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": undefined,
     "lernaJsonFile": undefined,
+    "lernaPackages": undefined,
+    "npmLock": "package-lock.json",
+    "packageJsonName": undefined,
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": undefined,
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": "package-lock.json",
   "npmrc": undefined,
   "packageFileVersion": undefined,
-  "packageJsonName": undefined,
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": false,
-  "workspacesPackages": undefined,
-  "yarnLock": undefined,
 }
 `;
 
@@ -395,21 +395,21 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() extracts packag
   "extractedConstraints": {
     "yarn": "3.0.0",
   },
-  "lernaClient": undefined,
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": true,
+    "lernaClient": undefined,
     "lernaJsonFile": undefined,
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": undefined,
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": undefined,
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": undefined,
-  "packageJsonName": undefined,
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": undefined,
-  "yarnLock": undefined,
 }
 `;
 
@@ -462,21 +462,21 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() extracts volta
   "extractedConstraints": {
     "node": "8.9.2",
   },
-  "lernaClient": undefined,
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": undefined,
     "lernaJsonFile": undefined,
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": undefined,
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": undefined,
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": undefined,
-  "packageJsonName": undefined,
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": undefined,
-  "yarnLock": undefined,
 }
 `;
 
@@ -516,21 +516,21 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() extracts volta
   "extractedConstraints": {
     "node": "8.9.2",
   },
-  "lernaClient": undefined,
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": undefined,
     "lernaJsonFile": undefined,
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": undefined,
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": undefined,
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": undefined,
-  "packageJsonName": undefined,
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": undefined,
-  "yarnLock": undefined,
 }
 `;
 
@@ -652,21 +652,21 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() finds "npmClien
     },
   ],
   "extractedConstraints": {},
-  "lernaClient": "npm",
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": "npm",
     "lernaJsonFile": "lerna.json",
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": "renovate",
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": undefined,
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": "1.0.0",
-  "packageJsonName": "renovate",
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": undefined,
-  "yarnLock": undefined,
 }
 `;
 
@@ -788,21 +788,21 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() finds "npmClien
     },
   ],
   "extractedConstraints": {},
-  "lernaClient": "yarn",
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": "yarn",
     "lernaJsonFile": "lerna.json",
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": "renovate",
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": undefined,
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": "1.0.0",
-  "packageJsonName": "renovate",
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": undefined,
-  "yarnLock": undefined,
 }
 `;
 
@@ -924,21 +924,21 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() finds a lock fi
     },
   ],
   "extractedConstraints": {},
-  "lernaClient": undefined,
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": undefined,
     "lernaJsonFile": undefined,
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": "renovate",
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": undefined,
+    "yarnLock": "yarn.lock",
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": "1.0.0",
-  "packageJsonName": "renovate",
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": undefined,
-  "yarnLock": "yarn.lock",
 }
 `;
 
@@ -946,23 +946,23 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() finds complex y
 {
   "deps": [],
   "extractedConstraints": {},
-  "lernaClient": "npm",
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": "npm",
     "lernaJsonFile": "lerna.json",
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": "@a/b",
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": [
+      "packages/*",
+    ],
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": "0.0.8",
-  "packageJsonName": "@a/b",
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": [
-    "packages/*",
-  ],
-  "yarnLock": undefined,
 }
 `;
 
@@ -1084,21 +1084,21 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() finds lerna 1`]
     },
   ],
   "extractedConstraints": {},
-  "lernaClient": "npm",
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": "npm",
     "lernaJsonFile": "lerna.json",
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": "renovate",
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": undefined,
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": "1.0.0",
-  "packageJsonName": "renovate",
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": undefined,
-  "yarnLock": undefined,
 }
 `;
 
@@ -1106,23 +1106,23 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() finds simple ya
 {
   "deps": [],
   "extractedConstraints": {},
-  "lernaClient": "npm",
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": "npm",
     "lernaJsonFile": "lerna.json",
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": "@a/b",
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": [
+      "packages/*",
+    ],
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": "0.0.8",
-  "packageJsonName": "@a/b",
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": [
-    "packages/*",
-  ],
-  "yarnLock": undefined,
 }
 `;
 
@@ -1130,23 +1130,23 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() finds simple ya
 {
   "deps": [],
   "extractedConstraints": {},
-  "lernaClient": undefined,
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": undefined,
     "lernaJsonFile": undefined,
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": "@a/b",
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": [
+      "packages/*",
+    ],
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": "0.0.8",
-  "packageJsonName": "@a/b",
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": [
-    "packages/*",
-  ],
-  "yarnLock": undefined,
 }
 `;
 
@@ -1268,21 +1268,21 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() returns an arra
     },
   ],
   "extractedConstraints": {},
-  "lernaClient": undefined,
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": undefined,
     "lernaJsonFile": undefined,
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": "renovate",
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": undefined,
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": "1.0.0",
-  "packageJsonName": "renovate",
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": undefined,
-  "yarnLock": undefined,
 }
 `;
 
@@ -1386,21 +1386,21 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() returns an arra
     },
   ],
   "extractedConstraints": {},
-  "lernaClient": undefined,
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": undefined,
     "lernaJsonFile": undefined,
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": "renovate",
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": [],
+    "yarnLock": undefined,
     "yarnZeroInstall": false,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": "1.0.0",
-  "packageJsonName": "renovate",
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
-  "workspacesPackages": [],
-  "yarnLock": undefined,
 }
 `;
 
@@ -1522,20 +1522,20 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() sets skipInstal
     },
   ],
   "extractedConstraints": {},
-  "lernaClient": undefined,
-  "lernaPackages": undefined,
   "managerData": {
     "hasPackageManager": false,
+    "lernaClient": undefined,
     "lernaJsonFile": undefined,
+    "lernaPackages": undefined,
+    "npmLock": undefined,
+    "packageJsonName": "renovate",
+    "pnpmShrinkwrap": undefined,
+    "workspacesPackages": undefined,
+    "yarnLock": "yarn.lock",
     "yarnZeroInstall": true,
   },
-  "npmLock": undefined,
   "npmrc": undefined,
   "packageFileVersion": "1.0.0",
-  "packageJsonName": "renovate",
-  "pnpmShrinkwrap": undefined,
   "skipInstalls": false,
-  "workspacesPackages": undefined,
-  "yarnLock": "yarn.lock",
 }
 `;
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 17eb97b44f..7c1028ec44 100644
--- a/lib/modules/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap
+++ b/lib/modules/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap
@@ -19,11 +19,11 @@ exports[`modules/manager/npm/extract/monorepo .extractPackageFile() updates inte
         "depName": "foo",
       },
     ],
-    "lernaPackages": [
-      "packages/*",
-    ],
     "managerData": {
       "lernaJsonFile": "lerna.json",
+      "lernaPackages": [
+        "packages/*",
+      ],
     },
     "packageFile": "package.json",
   },
@@ -40,34 +40,34 @@ exports[`modules/manager/npm/extract/monorepo .extractPackageFile() updates inte
         "depName": "bar",
       },
     ],
-    "hasWorkspaces": false,
-    "lernaClient": undefined,
     "managerData": {
       "hasPackageManager": undefined,
+      "hasWorkspaces": false,
+      "lernaClient": undefined,
       "lernaJsonFile": "lerna.json",
+      "npmLock": undefined,
+      "packageJsonName": "@org/a",
+      "yarnLock": undefined,
       "yarnZeroInstall": undefined,
     },
-    "npmLock": undefined,
     "npmrc": undefined,
     "packageFile": "packages/a/package.json",
-    "packageJsonName": "@org/a",
     "skipInstalls": undefined,
-    "yarnLock": undefined,
   },
   {
-    "hasWorkspaces": false,
-    "lernaClient": undefined,
     "managerData": {
       "hasPackageManager": undefined,
+      "hasWorkspaces": false,
+      "lernaClient": undefined,
       "lernaJsonFile": "lerna.json",
+      "npmLock": undefined,
+      "packageJsonName": "@org/b",
+      "yarnLock": undefined,
       "yarnZeroInstall": undefined,
     },
-    "npmLock": undefined,
     "npmrc": undefined,
     "packageFile": "packages/b/package.json",
-    "packageJsonName": "@org/b",
     "skipInstalls": undefined,
-    "yarnLock": undefined,
   },
 ]
 `;
@@ -91,11 +91,11 @@ exports[`modules/manager/npm/extract/monorepo .extractPackageFile() uses lerna p
         "depName": "foo",
       },
     ],
-    "lernaPackages": [
-      "packages/*",
-    ],
     "managerData": {
       "lernaJsonFile": "lerna.json",
+      "lernaPackages": [
+        "packages/*",
+      ],
     },
     "packageFile": "package.json",
   },
@@ -112,34 +112,34 @@ exports[`modules/manager/npm/extract/monorepo .extractPackageFile() uses lerna p
         "depName": "bar",
       },
     ],
-    "hasWorkspaces": false,
-    "lernaClient": undefined,
     "managerData": {
       "hasPackageManager": undefined,
+      "hasWorkspaces": false,
+      "lernaClient": undefined,
       "lernaJsonFile": "lerna.json",
+      "npmLock": undefined,
+      "packageJsonName": "@org/a",
+      "yarnLock": undefined,
       "yarnZeroInstall": undefined,
     },
-    "npmLock": undefined,
     "npmrc": undefined,
     "packageFile": "packages/a/package.json",
-    "packageJsonName": "@org/a",
     "skipInstalls": undefined,
-    "yarnLock": undefined,
   },
   {
-    "hasWorkspaces": false,
-    "lernaClient": undefined,
     "managerData": {
       "hasPackageManager": undefined,
+      "hasWorkspaces": false,
+      "lernaClient": undefined,
       "lernaJsonFile": "lerna.json",
+      "npmLock": undefined,
+      "packageJsonName": "@org/b",
+      "yarnLock": undefined,
       "yarnZeroInstall": undefined,
     },
-    "npmLock": undefined,
     "npmrc": undefined,
     "packageFile": "packages/b/package.json",
-    "packageJsonName": "@org/b",
     "skipInstalls": undefined,
-    "yarnLock": undefined,
   },
 ]
 `;
@@ -147,47 +147,47 @@ exports[`modules/manager/npm/extract/monorepo .extractPackageFile() uses lerna p
 exports[`modules/manager/npm/extract/monorepo .extractPackageFile() uses yarn workspaces package settings with lerna 1`] = `
 [
   {
-    "lernaClient": "yarn",
-    "lernaPackages": [
-      "oldpackages/*",
-    ],
     "managerData": {
+      "lernaClient": "yarn",
       "lernaJsonFile": "lerna.json",
+      "lernaPackages": [
+        "oldpackages/*",
+      ],
+      "workspacesPackages": [
+        "packages/*",
+      ],
     },
     "packageFile": "package.json",
-    "workspacesPackages": [
-      "packages/*",
-    ],
   },
   {
-    "hasWorkspaces": true,
-    "lernaClient": "yarn",
     "managerData": {
       "hasPackageManager": undefined,
+      "hasWorkspaces": true,
+      "lernaClient": "yarn",
       "lernaJsonFile": "lerna.json",
+      "npmLock": undefined,
+      "packageJsonName": "@org/a",
+      "yarnLock": undefined,
       "yarnZeroInstall": undefined,
     },
-    "npmLock": undefined,
     "npmrc": undefined,
     "packageFile": "packages/a/package.json",
-    "packageJsonName": "@org/a",
     "skipInstalls": undefined,
-    "yarnLock": undefined,
   },
   {
-    "hasWorkspaces": true,
-    "lernaClient": "yarn",
     "managerData": {
       "hasPackageManager": undefined,
+      "hasWorkspaces": true,
+      "lernaClient": "yarn",
       "lernaJsonFile": "lerna.json",
+      "npmLock": undefined,
+      "packageJsonName": "@org/b",
+      "yarnLock": undefined,
       "yarnZeroInstall": undefined,
     },
-    "npmLock": undefined,
     "npmrc": undefined,
     "packageFile": "packages/b/package.json",
-    "packageJsonName": "@org/b",
     "skipInstalls": undefined,
-    "yarnLock": undefined,
   },
 ]
 `;
diff --git a/lib/modules/manager/npm/extract/__snapshots__/pnpm.spec.ts.snap b/lib/modules/manager/npm/extract/__snapshots__/pnpm.spec.ts.snap
index fe4966f730..ac47e5c085 100644
--- a/lib/modules/manager/npm/extract/__snapshots__/pnpm.spec.ts.snap
+++ b/lib/modules/manager/npm/extract/__snapshots__/pnpm.spec.ts.snap
@@ -3,58 +3,80 @@
 exports[`modules/manager/npm/extract/pnpm .detectPnpmWorkspaces() uses pnpm workspaces 1`] = `
 [
   {
+    "managerData": {
+      "pnpmShrinkwrap": "pnpm-lock.yaml",
+    },
     "packageFile": "package.json",
-    "pnpmShrinkwrap": "pnpm-lock.yaml",
   },
   {
+    "managerData": {
+      "packageJsonName": "@demo/nested-group-a",
+      "pnpmShrinkwrap": "pnpm-lock.yaml",
+    },
     "packageFile": "nested-packages/group/a/package.json",
-    "packageJsonName": "@demo/nested-group-a",
-    "pnpmShrinkwrap": "pnpm-lock.yaml",
   },
   {
+    "managerData": {
+      "packageJsonName": "@demo/nested-group-b",
+      "pnpmShrinkwrap": "pnpm-lock.yaml",
+    },
     "packageFile": "nested-packages/group/b/package.json",
-    "packageJsonName": "@demo/nested-group-b",
-    "pnpmShrinkwrap": "pnpm-lock.yaml",
   },
   {
+    "managerData": {
+      "packageJsonName": "@demo/non-nested-a",
+      "pnpmShrinkwrap": "pnpm-lock.yaml",
+    },
     "packageFile": "non-nested-packages/a/package.json",
-    "packageJsonName": "@demo/non-nested-a",
-    "pnpmShrinkwrap": "pnpm-lock.yaml",
   },
   {
+    "managerData": {
+      "packageJsonName": "@demo/non-nested-b",
+      "pnpmShrinkwrap": "pnpm-lock.yaml",
+    },
     "packageFile": "non-nested-packages/b/package.json",
-    "packageJsonName": "@demo/non-nested-b",
-    "pnpmShrinkwrap": "pnpm-lock.yaml",
   },
   {
+    "managerData": {
+      "packageJsonName": "@demo/solo",
+      "pnpmShrinkwrap": "pnpm-lock.yaml",
+    },
     "packageFile": "solo-package/package.json",
-    "packageJsonName": "@demo/solo",
-    "pnpmShrinkwrap": "pnpm-lock.yaml",
   },
   {
+    "managerData": {
+      "packageJsonName": "@demo/solo-leading-dot-slash",
+      "pnpmShrinkwrap": "pnpm-lock.yaml",
+    },
     "packageFile": "solo-package-leading-dot-slash/package.json",
-    "packageJsonName": "@demo/solo-leading-dot-slash",
-    "pnpmShrinkwrap": "pnpm-lock.yaml",
   },
   {
+    "managerData": {
+      "packageJsonName": "@demo/solo-leading-double-dot-slash",
+      "pnpmShrinkwrap": "pnpm-lock.yaml",
+    },
     "packageFile": "solo-package-leading-double-dot-slash/package.json",
-    "packageJsonName": "@demo/solo-leading-double-dot-slash",
-    "pnpmShrinkwrap": "pnpm-lock.yaml",
   },
   {
+    "managerData": {
+      "packageJsonName": "@demo/solo-trailing-slash",
+      "pnpmShrinkwrap": "pnpm-lock.yaml",
+    },
     "packageFile": "solo-package-trailing-slash/package.json",
-    "packageJsonName": "@demo/solo-trailing-slash",
-    "pnpmShrinkwrap": "pnpm-lock.yaml",
   },
   {
+    "managerData": {
+      "packageJsonName": "@demo/test-package",
+      "pnpmShrinkwrap": "pnpm-lock.yaml",
+    },
     "packageFile": "test/test-package/package.json",
-    "packageJsonName": "@demo/test-package",
-    "pnpmShrinkwrap": "pnpm-lock.yaml",
   },
   {
+    "managerData": {
+      "packageJsonName": "@demo/test-package2",
+      "pnpmShrinkwrap": "pnpm-lock.yaml",
+    },
     "packageFile": "tests/test-package2/package.json",
-    "packageJsonName": "@demo/test-package2",
-    "pnpmShrinkwrap": "pnpm-lock.yaml",
   },
 ]
 `;
diff --git a/lib/modules/manager/npm/extract/index.spec.ts b/lib/modules/manager/npm/extract/index.spec.ts
index 2c468d0c61..e6672bd53f 100644
--- a/lib/modules/manager/npm/extract/index.spec.ts
+++ b/lib/modules/manager/npm/extract/index.spec.ts
@@ -156,7 +156,11 @@ describe('modules/manager/npm/extract/index', () => {
         'package.json',
         defaultConfig
       );
-      expect(res).toMatchSnapshot({ yarnLock: 'yarn.lock' });
+      expect(res).toMatchSnapshot({
+        managerData: {
+          yarnLock: 'yarn.lock',
+        },
+      });
     });
 
     it('finds and filters .npmrc', async () => {
@@ -280,9 +284,11 @@ describe('modules/manager/npm/extract/index', () => {
         defaultConfig
       );
       expect(res).toMatchSnapshot({
-        lernaClient: 'npm',
-        lernaPackages: undefined,
-        managerData: { lernaJsonFile: 'lerna.json' },
+        managerData: {
+          lernaClient: 'npm',
+          lernaJsonFile: 'lerna.json',
+          lernaPackages: undefined,
+        },
       });
     });
 
@@ -299,9 +305,11 @@ describe('modules/manager/npm/extract/index', () => {
         defaultConfig
       );
       expect(res).toMatchSnapshot({
-        lernaClient: 'npm',
-        lernaPackages: undefined,
-        managerData: { lernaJsonFile: 'lerna.json' },
+        managerData: {
+          lernaClient: 'npm',
+          lernaJsonFile: 'lerna.json',
+          lernaPackages: undefined,
+        },
       });
     });
 
@@ -318,9 +326,11 @@ describe('modules/manager/npm/extract/index', () => {
         defaultConfig
       );
       expect(res).toMatchSnapshot({
-        lernaClient: 'yarn',
-        lernaPackages: undefined,
-        managerData: { lernaJsonFile: 'lerna.json' },
+        managerData: {
+          lernaClient: 'yarn',
+          lernaJsonFile: 'lerna.json',
+          lernaPackages: undefined,
+        },
       });
     });
 
@@ -336,7 +346,9 @@ describe('modules/manager/npm/extract/index', () => {
         'package.json',
         defaultConfig
       );
-      expect(res).toMatchSnapshot({ workspacesPackages: ['packages/*'] });
+      expect(res).toMatchSnapshot({
+        managerData: { workspacesPackages: ['packages/*'] },
+      });
     });
 
     it('finds simple yarn workspaces with lerna.json and useWorkspaces: true', async () => {
@@ -351,7 +363,9 @@ describe('modules/manager/npm/extract/index', () => {
         'package.json',
         defaultConfig
       );
-      expect(res).toMatchSnapshot({ workspacesPackages: ['packages/*'] });
+      expect(res).toMatchSnapshot({
+        managerData: { workspacesPackages: ['packages/*'] },
+      });
     });
 
     it('finds complex yarn workspaces', async () => {
@@ -366,7 +380,9 @@ describe('modules/manager/npm/extract/index', () => {
         'package.json',
         defaultConfig
       );
-      expect(res).toMatchSnapshot({ workspacesPackages: ['packages/*'] });
+      expect(res).toMatchSnapshot({
+        managerData: { workspacesPackages: ['packages/*'] },
+      });
     });
 
     it('extracts engines', async () => {
diff --git a/lib/modules/manager/npm/extract/index.ts b/lib/modules/manager/npm/extract/index.ts
index d84f3eeee1..bf894685c7 100644
--- a/lib/modules/manager/npm/extract/index.ts
+++ b/lib/modules/manager/npm/extract/index.ts
@@ -11,11 +11,10 @@ import * as nodeVersioning from '../../../versioning/node';
 import { api, isValid, isVersion } from '../../../versioning/npm';
 import type {
   ExtractConfig,
-  NpmLockFiles,
   PackageDependency,
   PackageFile,
 } from '../../types';
-import type { NpmManagerData } from '../types';
+import type { NpmLockFiles, NpmManagerData } from '../types';
 import { getLockedVersions } from './locked-versions';
 import { detectMonorepos } from './monorepo';
 import type { NpmPackage, NpmPackageDependency } from './types';
@@ -483,26 +482,28 @@ export async function extractPackageFile(
 
   return {
     deps,
-    packageJsonName,
     packageFileVersion,
     npmrc,
-    ...lockFiles,
     managerData: {
+      ...lockFiles,
+      lernaClient,
       lernaJsonFile,
+      lernaPackages,
+      packageJsonName,
       yarnZeroInstall,
       hasPackageManager: is.nonEmptyStringAndNotWhitespace(
         packageJson.packageManager
       ),
+      workspacesPackages,
     },
-    lernaClient,
-    lernaPackages,
     skipInstalls,
-    workspacesPackages,
     extractedConstraints,
   };
 }
 
-export async function postExtract(packageFiles: PackageFile[]): Promise<void> {
+export async function postExtract(
+  packageFiles: PackageFile<NpmManagerData>[]
+): Promise<void> {
   await detectMonorepos(packageFiles);
   await getLockedVersions(packageFiles);
 }
@@ -510,8 +511,8 @@ export async function postExtract(packageFiles: PackageFile[]): Promise<void> {
 export async function extractAllPackageFiles(
   config: ExtractConfig,
   packageFiles: string[]
-): Promise<PackageFile[]> {
-  const npmFiles: PackageFile[] = [];
+): Promise<PackageFile<NpmManagerData>[]> {
+  const npmFiles: PackageFile<NpmManagerData>[] = [];
   for (const packageFile of packageFiles) {
     const content = await readLocalFile(packageFile, 'utf8');
     // istanbul ignore else
@@ -532,7 +533,7 @@ export async function extractAllPackageFiles(
   return npmFiles;
 }
 
-function setNodeCommitTopic(dep: NpmManagerData): void {
+function setNodeCommitTopic(dep: PackageDependency<NpmManagerData>): void {
   // This is a special case for Node.js to group it together with other managers
   if (dep.depName === 'node') {
     dep.commitMessageTopic = 'Node.js';
diff --git a/lib/modules/manager/npm/extract/locked-versions.spec.ts b/lib/modules/manager/npm/extract/locked-versions.spec.ts
index 08e7e13e56..095a0f6d5f 100644
--- a/lib/modules/manager/npm/extract/locked-versions.spec.ts
+++ b/lib/modules/manager/npm/extract/locked-versions.spec.ts
@@ -1,4 +1,5 @@
 import type { PackageFile } from '../../types';
+import type { NpmManagerData } from '../types';
 import { getLockedVersions } from './locked-versions';
 
 /** @type any */
@@ -11,11 +12,12 @@ jest.mock('./yarn');
 
 describe('modules/manager/npm/extract/locked-versions', () => {
   describe('.getLockedVersions()', () => {
-    function getPackageFiles(yarnVersion: string): PackageFile[] {
+    function getPackageFiles(
+      yarnVersion: string
+    ): PackageFile<NpmManagerData>[] {
       return [
         {
-          npmLock: 'package-lock.json',
-          yarnLock: 'yarn.lock',
+          managerData: { npmLock: 'package-lock.json', yarnLock: 'yarn.lock' },
           extractedConstraints: {},
           deps: [
             { depName: 'a', currentValue: '1.0.0' },
@@ -72,8 +74,7 @@ describe('modules/manager/npm/extract/locked-versions', () => {
             },
           ],
           lockFiles: ['yarn.lock'],
-          npmLock: 'package-lock.json',
-          yarnLock: 'yarn.lock',
+          managerData: { npmLock: 'package-lock.json', yarnLock: 'yarn.lock' },
         },
       ]);
     });
@@ -119,8 +120,7 @@ describe('modules/manager/npm/extract/locked-versions', () => {
             },
           ],
           lockFiles: ['yarn.lock'],
-          npmLock: 'package-lock.json',
-          yarnLock: 'yarn.lock',
+          managerData: { npmLock: 'package-lock.json', yarnLock: 'yarn.lock' },
         },
       ]);
     });
@@ -166,8 +166,7 @@ describe('modules/manager/npm/extract/locked-versions', () => {
             },
           ],
           lockFiles: ['yarn.lock'],
-          npmLock: 'package-lock.json',
-          yarnLock: 'yarn.lock',
+          managerData: { npmLock: 'package-lock.json', yarnLock: 'yarn.lock' },
         },
       ]);
     });
@@ -205,8 +204,7 @@ describe('modules/manager/npm/extract/locked-versions', () => {
             },
           ],
           lockFiles: ['yarn.lock'],
-          npmLock: 'package-lock.json',
-          yarnLock: 'yarn.lock',
+          managerData: { npmLock: 'package-lock.json', yarnLock: 'yarn.lock' },
         },
       ]);
     });
@@ -245,8 +243,7 @@ describe('modules/manager/npm/extract/locked-versions', () => {
             },
           ],
           lockFiles: ['yarn.lock'],
-          npmLock: 'package-lock.json',
-          yarnLock: 'yarn.lock',
+          managerData: { npmLock: 'package-lock.json', yarnLock: 'yarn.lock' },
         },
       ]);
     });
@@ -258,7 +255,7 @@ describe('modules/manager/npm/extract/locked-versions', () => {
       });
       const packageFiles = [
         {
-          npmLock: 'package-lock.json',
+          managerData: { npmLock: 'package-lock.json' },
           extractedConstraints: {},
           deps: [
             { depName: 'a', currentValue: '1.0.0' },
@@ -275,7 +272,7 @@ describe('modules/manager/npm/extract/locked-versions', () => {
             { currentValue: '2.0.0', depName: 'b', lockedVersion: '2.0.0' },
           ],
           lockFiles: ['package-lock.json'],
-          npmLock: 'package-lock.json',
+          managerData: { npmLock: 'package-lock.json' },
         },
       ]);
     });
@@ -287,7 +284,9 @@ describe('modules/manager/npm/extract/locked-versions', () => {
       });
       const packageFiles = [
         {
-          npmLock: 'package-lock.json',
+          managerData: {
+            npmLock: 'package-lock.json',
+          },
           extractedConstraints: {},
           deps: [
             { depName: 'a', currentValue: '1.0.0' },
@@ -306,7 +305,9 @@ describe('modules/manager/npm/extract/locked-versions', () => {
             { currentValue: '2.0.0', depName: 'b', lockedVersion: '2.0.0' },
           ],
           lockFiles: ['package-lock.json'],
-          npmLock: 'package-lock.json',
+          managerData: {
+            npmLock: 'package-lock.json',
+          },
         },
       ]);
     });
@@ -318,7 +319,9 @@ describe('modules/manager/npm/extract/locked-versions', () => {
       });
       const packageFiles = [
         {
-          npmLock: 'package-lock.json',
+          managerData: {
+            npmLock: 'package-lock.json',
+          },
           extractedConstraints: {
             npm: '>=7.0.0',
           },
@@ -339,7 +342,9 @@ describe('modules/manager/npm/extract/locked-versions', () => {
             { currentValue: '2.0.0', depName: 'b', lockedVersion: '2.0.0' },
           ],
           lockFiles: ['package-lock.json'],
-          npmLock: 'package-lock.json',
+          managerData: {
+            npmLock: 'package-lock.json',
+          },
         },
       ]);
     });
@@ -351,7 +356,9 @@ describe('modules/manager/npm/extract/locked-versions', () => {
       });
       const packageFiles = [
         {
-          npmLock: 'package-lock.json',
+          managerData: {
+            npmLock: 'package-lock.json',
+          },
           extractedConstraints: {
             npm: '>=9.0.0',
           },
@@ -372,7 +379,9 @@ describe('modules/manager/npm/extract/locked-versions', () => {
             { currentValue: '2.0.0', depName: 'b', lockedVersion: '2.0.0' },
           ],
           lockFiles: ['package-lock.json'],
-          npmLock: 'package-lock.json',
+          managerData: {
+            npmLock: 'package-lock.json',
+          },
         },
       ]);
     });
@@ -388,7 +397,9 @@ describe('modules/manager/npm/extract/locked-versions', () => {
       });
       const packageFiles = [
         {
-          npmLock: 'package-lock.json',
+          managerData: {
+            npmLock: 'package-lock.json',
+          },
           extractedConstraints: {
             npm: '>=6.0.0',
           },
@@ -413,7 +424,9 @@ describe('modules/manager/npm/extract/locked-versions', () => {
             { currentValue: '2.0.0', depName: 'b', lockedVersion: '2.0.0' },
           ],
           lockFiles: ['package-lock.json'],
-          npmLock: 'package-lock.json',
+          managerData: {
+            npmLock: 'package-lock.json',
+          },
         },
       ]);
     });
@@ -429,7 +442,9 @@ describe('modules/manager/npm/extract/locked-versions', () => {
       });
       const packageFiles = [
         {
-          npmLock: 'package-lock.json',
+          managerData: {
+            npmLock: 'package-lock.json',
+          },
           extractedConstraints: {
             npm: '^8.0.0',
           },
@@ -454,7 +469,9 @@ describe('modules/manager/npm/extract/locked-versions', () => {
             { currentValue: '2.0.0', depName: 'b', lockedVersion: '2.0.0' },
           ],
           lockFiles: ['package-lock.json'],
-          npmLock: 'package-lock.json',
+          managerData: {
+            npmLock: 'package-lock.json',
+          },
         },
       ]);
     });
@@ -462,7 +479,9 @@ describe('modules/manager/npm/extract/locked-versions', () => {
     it('ignores pnpm', async () => {
       const packageFiles = [
         {
-          pnpmShrinkwrap: 'pnpm-lock.yaml',
+          managerData: {
+            pnpmShrinkwrap: 'pnpm-lock.yaml',
+          },
           deps: [
             { depName: 'a', currentValue: '1.0.0' },
             { depName: 'b', currentValue: '2.0.0' },
@@ -477,7 +496,9 @@ describe('modules/manager/npm/extract/locked-versions', () => {
             { currentValue: '2.0.0', depName: 'b' },
           ],
           lockFiles: ['pnpm-lock.yaml'],
-          pnpmShrinkwrap: 'pnpm-lock.yaml',
+          managerData: {
+            pnpmShrinkwrap: 'pnpm-lock.yaml',
+          },
         },
       ]);
     });
diff --git a/lib/modules/manager/npm/extract/locked-versions.ts b/lib/modules/manager/npm/extract/locked-versions.ts
index fc5bf391d4..8c23d1779a 100644
--- a/lib/modules/manager/npm/extract/locked-versions.ts
+++ b/lib/modules/manager/npm/extract/locked-versions.ts
@@ -1,17 +1,19 @@
 import semver from 'semver';
 import { logger } from '../../../../logger';
 import type { PackageFile } from '../../types';
+import type { NpmManagerData } from '../types';
 import { getNpmLock } from './npm';
 import type { LockFile } from './types';
 import { getYarnLock } from './yarn';
 
 export async function getLockedVersions(
-  packageFiles: PackageFile[]
+  packageFiles: PackageFile<NpmManagerData>[]
 ): Promise<void> {
   const lockFileCache: Record<string, LockFile> = {};
   logger.debug('Finding locked versions');
   for (const packageFile of packageFiles) {
-    const { yarnLock, npmLock, pnpmShrinkwrap } = packageFile;
+    const { managerData = {} } = packageFile;
+    const { yarnLock, npmLock, pnpmShrinkwrap } = managerData;
     const lockFiles: string[] = [];
     if (yarnLock) {
       logger.trace('Found yarnLock');
diff --git a/lib/modules/manager/npm/extract/monorepo.spec.ts b/lib/modules/manager/npm/extract/monorepo.spec.ts
index 37bdf48711..974906f52c 100644
--- a/lib/modules/manager/npm/extract/monorepo.spec.ts
+++ b/lib/modules/manager/npm/extract/monorepo.spec.ts
@@ -5,14 +5,25 @@ jest.mock('./pnpm');
 
 describe('modules/manager/npm/extract/monorepo', () => {
   describe('.extractPackageFile()', () => {
+    it('handles no monorepo', async () => {
+      const packageFiles: Partial<PackageFile>[] = [
+        {
+          packageFile: 'package.json',
+          deps: [],
+        },
+      ];
+      await detectMonorepos(packageFiles);
+      expect(packageFiles).toHaveLength(1);
+    });
+
     it('uses lerna package settings', async () => {
       const packageFiles: Partial<PackageFile>[] = [
         {
           packageFile: 'package.json',
           managerData: {
             lernaJsonFile: 'lerna.json',
+            lernaPackages: ['packages/*'],
           },
-          lernaPackages: ['packages/*'],
           deps: [
             {
               depName: '@org/a',
@@ -30,7 +41,7 @@ describe('modules/manager/npm/extract/monorepo', () => {
         },
         {
           packageFile: 'packages/a/package.json',
-          packageJsonName: '@org/a',
+          managerData: { packageJsonName: '@org/a' },
           deps: [
             {
               depName: '@org/b',
@@ -45,7 +56,7 @@ describe('modules/manager/npm/extract/monorepo', () => {
         },
         {
           packageFile: 'packages/b/package.json',
-          packageJsonName: '@org/b',
+          managerData: { packageJsonName: '@org/b' },
         },
       ];
       await detectMonorepos(packageFiles);
@@ -64,8 +75,8 @@ describe('modules/manager/npm/extract/monorepo', () => {
           packageFile: 'package.json',
           managerData: {
             lernaJsonFile: 'lerna.json',
+            lernaPackages: ['packages/*'],
           },
-          lernaPackages: ['packages/*'],
           deps: [
             {
               depName: '@org/a',
@@ -83,7 +94,7 @@ describe('modules/manager/npm/extract/monorepo', () => {
         },
         {
           packageFile: 'packages/a/package.json',
-          packageJsonName: '@org/a',
+          managerData: { packageJsonName: '@org/a' },
           deps: [
             {
               depName: '@org/b',
@@ -98,7 +109,7 @@ describe('modules/manager/npm/extract/monorepo', () => {
         },
         {
           packageFile: 'packages/b/package.json',
-          packageJsonName: '@org/b',
+          managerData: { packageJsonName: '@org/b' },
         },
       ];
       await detectMonorepos(packageFiles);
@@ -116,19 +127,19 @@ describe('modules/manager/npm/extract/monorepo', () => {
         {
           packageFile: 'package.json',
           managerData: {
+            lernaClient: 'yarn',
             lernaJsonFile: 'lerna.json',
+            lernaPackages: ['oldpackages/*'],
+            workspacesPackages: ['packages/*'],
           },
-          lernaPackages: ['oldpackages/*'],
-          lernaClient: 'yarn',
-          workspacesPackages: ['packages/*'],
         },
         {
           packageFile: 'packages/a/package.json',
-          packageJsonName: '@org/a',
+          managerData: { packageJsonName: '@org/a' },
         },
         {
           packageFile: 'packages/b/package.json',
-          packageJsonName: '@org/b',
+          managerData: { packageJsonName: '@org/b' },
         },
       ];
       await detectMonorepos(packageFiles);
@@ -141,16 +152,15 @@ describe('modules/manager/npm/extract/monorepo', () => {
         {
           packageFile: 'package.json',
           npmrc: '@org:registry=//registry.some.org\n',
-          workspacesPackages: 'packages/*',
+          managerData: { workspacesPackages: 'packages/*' },
         },
         {
           packageFile: 'packages/a/package.json',
-          packageJsonName: '@org/a',
-          yarnLock: 'yarn.lock',
+          managerData: { packageJsonName: '@org/a', yarnLock: 'yarn.lock' },
         },
         {
           packageFile: 'packages/b/package.json',
-          packageJsonName: '@org/b',
+          managerData: { packageJsonName: '@org/b' },
         },
       ];
       await detectMonorepos(packageFiles);
@@ -165,21 +175,20 @@ describe('modules/manager/npm/extract/monorepo', () => {
       const packageFiles: Partial<PackageFile>[] = [
         {
           packageFile: 'package.json',
-          workspacesPackages: ['docs'],
           skipInstalls: true, // coverage
           extractedConstraints: {
             node: '^14.15.0 || >=16.13.0',
             yarn: '3.2.1',
           },
-          yarnLock: 'yarn.lock',
           managerData: {
             hasPackageManager: true,
+            workspacesPackages: ['docs'],
           },
         },
         {
           packageFile: 'docs/package.json',
-          packageJsonName: 'docs',
-          yarnLock: 'yarn.lock',
+          managerData: { packageJsonName: 'docs', yarnLock: 'yarn.lock' },
+
           extractedConstraints: { yarn: '^3.2.0' },
         },
       ];
@@ -211,20 +220,19 @@ describe('modules/manager/npm/extract/monorepo', () => {
         {
           packageFile: 'package.json',
           managerData: {
+            workspacesPackages: 'packages/*',
             yarnZeroInstall: true,
           },
           skipInstalls: false,
           npmrc: '@org:registry=//registry.some.org\n',
-          workspacesPackages: 'packages/*',
         },
         {
           packageFile: 'packages/a/package.json',
-          packageJsonName: '@org/a',
-          yarnLock: 'yarn.lock',
+          managerData: { packageJsonName: '@org/a', yarnLock: 'yarn.lock' },
         },
         {
           packageFile: 'packages/b/package.json',
-          packageJsonName: '@org/b',
+          managerData: { packageJsonName: '@org/b' },
           skipInstalls: true,
         },
       ];
diff --git a/lib/modules/manager/npm/extract/monorepo.ts b/lib/modules/manager/npm/extract/monorepo.ts
index 5a91433640..ea5db558a1 100644
--- a/lib/modules/manager/npm/extract/monorepo.ts
+++ b/lib/modules/manager/npm/extract/monorepo.ts
@@ -2,29 +2,31 @@ import is from '@sindresorhus/is';
 import { logger } from '../../../../logger';
 import { getParentDir, getSiblingFileName } from '../../../../util/fs';
 import type { PackageFile } from '../../types';
+import type { NpmManagerData } from '../types';
 import { detectPnpmWorkspaces } from './pnpm';
 import { matchesAnyPattern } from './utils';
 
 export async function detectMonorepos(
-  packageFiles: Partial<PackageFile>[]
+  packageFiles: Partial<PackageFile<NpmManagerData>>[]
 ): Promise<void> {
   await detectPnpmWorkspaces(packageFiles);
   logger.debug('Detecting Lerna and Yarn Workspaces');
   for (const p of packageFiles) {
+    const { packageFile, npmrc, managerData = {}, skipInstalls } = p;
     const {
-      packageFile,
-      npmLock,
-      yarnLock,
-      npmrc,
-      managerData = {},
       lernaClient,
+      lernaJsonFile,
       lernaPackages,
+      npmLock,
+      yarnZeroInstall,
+      hasPackageManager,
       workspacesPackages,
-      skipInstalls,
-    } = p;
-    const { lernaJsonFile, yarnZeroInstall, hasPackageManager } = managerData;
+      yarnLock,
+    } = managerData;
 
-    const packages = workspacesPackages ?? lernaPackages;
+    const packages = (workspacesPackages ?? lernaPackages) as
+      | string[]
+      | undefined;
     if (packages?.length) {
       const internalPackagePatterns = (
         is.array(packages) ? packages : [packages]
@@ -36,7 +38,7 @@ export async function detectMonorepos(
         )
       );
       const internalPackageNames = internalPackageFiles
-        .map((sp) => sp.packageJsonName)
+        .map((sp) => sp.managerData?.packageJsonName)
         .filter(Boolean);
 
       p.deps?.forEach((dep) => {
@@ -50,11 +52,11 @@ export async function detectMonorepos(
         subPackage.managerData.lernaJsonFile = lernaJsonFile;
         subPackage.managerData.yarnZeroInstall = yarnZeroInstall;
         subPackage.managerData.hasPackageManager = hasPackageManager;
-        subPackage.lernaClient = lernaClient;
-        subPackage.yarnLock = subPackage.yarnLock ?? yarnLock;
-        subPackage.npmLock = subPackage.npmLock ?? npmLock;
+        subPackage.managerData.lernaClient = lernaClient;
+        subPackage.managerData.yarnLock ??= yarnLock;
+        subPackage.managerData.npmLock ??= npmLock;
         subPackage.skipInstalls = skipInstalls && subPackage.skipInstalls; // skip if both are true
-        subPackage.hasWorkspaces = !!workspacesPackages;
+        subPackage.managerData.hasWorkspaces = !!workspacesPackages;
         subPackage.npmrc ??= npmrc;
 
         if (p.extractedConstraints) {
diff --git a/lib/modules/manager/npm/extract/pnpm.spec.ts b/lib/modules/manager/npm/extract/pnpm.spec.ts
index 8e4ca91a0b..af0a9fef89 100644
--- a/lib/modules/manager/npm/extract/pnpm.spec.ts
+++ b/lib/modules/manager/npm/extract/pnpm.spec.ts
@@ -84,64 +84,86 @@ describe('modules/manager/npm/extract/pnpm', () => {
       const packageFiles = [
         {
           packageFile: 'package.json',
-          pnpmShrinkwrap: 'pnpm-lock.yaml',
+          managerData: { pnpmShrinkwrap: 'pnpm-lock.yaml' },
         },
         {
           packageFile: 'nested-packages/group/a/package.json',
-          packageJsonName: '@demo/nested-group-a',
-          pnpmShrinkwrap: undefined as undefined | string,
+          managerData: {
+            pnpmShrinkwrap: undefined as undefined | string,
+            packageJsonName: '@demo/nested-group-a',
+          },
         },
         {
           packageFile: 'nested-packages/group/b/package.json',
-          packageJsonName: '@demo/nested-group-b',
-          pnpmShrinkwrap: undefined as undefined | string,
+          managerData: {
+            pnpmShrinkwrap: undefined as undefined | string,
+            packageJsonName: '@demo/nested-group-b',
+          },
         },
         {
           packageFile: 'non-nested-packages/a/package.json',
-          packageJsonName: '@demo/non-nested-a',
-          pnpmShrinkwrap: undefined as undefined | string,
+          managerData: {
+            pnpmShrinkwrap: undefined as undefined | string,
+            packageJsonName: '@demo/non-nested-a',
+          },
         },
         {
           packageFile: 'non-nested-packages/b/package.json',
-          packageJsonName: '@demo/non-nested-b',
-          pnpmShrinkwrap: undefined as undefined | string,
+          managerData: {
+            pnpmShrinkwrap: undefined as undefined | string,
+            packageJsonName: '@demo/non-nested-b',
+          },
         },
         {
           packageFile: 'solo-package/package.json',
-          packageJsonName: '@demo/solo',
-          pnpmShrinkwrap: undefined as undefined | string,
+          managerData: {
+            pnpmShrinkwrap: undefined as undefined | string,
+            packageJsonName: '@demo/solo',
+          },
         },
         {
           packageFile: 'solo-package-leading-dot-slash/package.json',
-          packageJsonName: '@demo/solo-leading-dot-slash',
-          pnpmShrinkwrap: undefined as undefined | string,
+          managerData: {
+            pnpmShrinkwrap: undefined as undefined | string,
+            packageJsonName: '@demo/solo-leading-dot-slash',
+          },
         },
         {
           packageFile: 'solo-package-leading-double-dot-slash/package.json',
-          packageJsonName: '@demo/solo-leading-double-dot-slash',
-          pnpmShrinkwrap: undefined as undefined | string,
+          managerData: {
+            pnpmShrinkwrap: undefined as undefined | string,
+            packageJsonName: '@demo/solo-leading-double-dot-slash',
+          },
         },
         {
           packageFile: 'solo-package-trailing-slash/package.json',
-          packageJsonName: '@demo/solo-trailing-slash',
-          pnpmShrinkwrap: undefined as undefined | string,
+          managerData: {
+            pnpmShrinkwrap: undefined as undefined | string,
+            packageJsonName: '@demo/solo-trailing-slash',
+          },
         },
         {
           packageFile: 'test/test-package/package.json',
-          packageJsonName: '@demo/test-package',
-          pnpmShrinkwrap: undefined as undefined | string,
+          managerData: {
+            pnpmShrinkwrap: undefined as undefined | string,
+            packageJsonName: '@demo/test-package',
+          },
         },
         {
           packageFile: 'tests/test-package2/package.json',
-          packageJsonName: '@demo/test-package2',
-          pnpmShrinkwrap: undefined as undefined | string,
+          managerData: {
+            pnpmShrinkwrap: undefined as undefined | string,
+            packageJsonName: '@demo/test-package2',
+          },
         },
       ];
 
       await detectPnpmWorkspaces(packageFiles);
       expect(packageFiles).toMatchSnapshot();
       expect(
-        packageFiles.every((packageFile) => packageFile.pnpmShrinkwrap)
+        packageFiles.every(
+          (packageFile) => packageFile.managerData.pnpmShrinkwrap
+        )
       ).toBeTrue();
     });
 
@@ -149,7 +171,7 @@ describe('modules/manager/npm/extract/pnpm', () => {
       const packageFiles = [
         {
           packageFile: 'package.json',
-          pnpmShrinkwrap: 'pnpm-lock.yaml',
+          managerData: { pnpmShrinkwrap: 'pnpm-lock.yaml' },
         },
       ];
 
@@ -157,7 +179,7 @@ describe('modules/manager/npm/extract/pnpm', () => {
       expect(packageFiles).toEqual([
         {
           packageFile: 'package.json',
-          pnpmShrinkwrap: 'pnpm-lock.yaml',
+          managerData: { pnpmShrinkwrap: 'pnpm-lock.yaml' },
         },
       ]);
     });
@@ -166,17 +188,17 @@ describe('modules/manager/npm/extract/pnpm', () => {
       const packageFiles = [
         {
           packageFile: 'package.json',
-          pnpmShrinkwrap: 'pnpm-lock.yaml',
+          managerData: { pnpmShrinkwrap: 'pnpm-lock.yaml' },
         },
         {
           packageFile: 'nested-packages/group/a/package.json',
           packageJsonName: '@demo/nested-group-a',
-          pnpmShrinkwrap: undefined as undefined | string,
+          managerData: { pnpmShrinkwrap: undefined as undefined | string },
         },
         {
           packageFile: 'not-matching/b/package.json',
           packageJsonName: '@not-matching/b',
-          pnpmShrinkwrap: undefined as undefined | string,
+          managerData: { pnpmShrinkwrap: undefined as undefined | string },
         },
       ];
 
@@ -184,24 +206,24 @@ describe('modules/manager/npm/extract/pnpm', () => {
       expect(packageFiles).toEqual([
         {
           packageFile: 'package.json',
-          pnpmShrinkwrap: 'pnpm-lock.yaml',
+          managerData: { pnpmShrinkwrap: 'pnpm-lock.yaml' },
         },
         {
           packageFile: 'nested-packages/group/a/package.json',
           packageJsonName: '@demo/nested-group-a',
-          pnpmShrinkwrap: 'pnpm-lock.yaml',
+          managerData: { pnpmShrinkwrap: 'pnpm-lock.yaml' },
         },
         {
           packageFile: 'not-matching/b/package.json',
           packageJsonName: '@not-matching/b',
-          pnpmShrinkwrap: undefined,
+          managerData: { pnpmShrinkwrap: undefined },
         },
       ]);
       expect(
         packageFiles.find(
           (packageFile) =>
             packageFile.packageFile === 'not-matching/b/package.json'
-        )?.pnpmShrinkwrap
+        )?.managerData.pnpmShrinkwrap
       ).toBeUndefined();
     });
   });
diff --git a/lib/modules/manager/npm/extract/pnpm.ts b/lib/modules/manager/npm/extract/pnpm.ts
index b278088137..1f566d1e8b 100644
--- a/lib/modules/manager/npm/extract/pnpm.ts
+++ b/lib/modules/manager/npm/extract/pnpm.ts
@@ -11,6 +11,7 @@ import {
   readLocalFile,
 } from '../../../../util/fs';
 import type { PackageFile } from '../../types';
+import type { NpmManagerData } from '../types';
 import type { PnpmWorkspaceFile } from './types';
 
 export async function extractPnpmFilters(
@@ -74,13 +75,14 @@ export async function findPnpmWorkspace(
 }
 
 export async function detectPnpmWorkspaces(
-  packageFiles: Partial<PackageFile>[]
+  packageFiles: Partial<PackageFile<NpmManagerData>>[]
 ): Promise<void> {
   logger.debug(`Detecting pnpm Workspaces`);
   const packagePathCache = new Map<string, string[] | null>();
 
   for (const p of packageFiles) {
-    const { packageFile, pnpmShrinkwrap } = p;
+    const { packageFile, managerData } = p;
+    const { pnpmShrinkwrap } = managerData as NpmManagerData;
 
     // check if pnpmShrinkwrap-file has already been provided
     if (pnpmShrinkwrap) {
@@ -123,7 +125,8 @@ export async function detectPnpmWorkspaces(
     );
 
     if (isPackageInWorkspace) {
-      p.pnpmShrinkwrap = lockFilePath;
+      p.managerData ??= {};
+      p.managerData.pnpmShrinkwrap = lockFilePath;
     } else {
       logger.trace(
         { packageFile, workspaceYamlPath },
diff --git a/lib/modules/manager/npm/post-update/index.spec.ts b/lib/modules/manager/npm/post-update/index.spec.ts
index dd2b971310..7064727df6 100644
--- a/lib/modules/manager/npm/post-update/index.spec.ts
+++ b/lib/modules/manager/npm/post-update/index.spec.ts
@@ -35,24 +35,28 @@ describe('modules/manager/npm/post-update/index', () => {
         packageFile: 'packages/core/package.json',
         managerData: {
           lernaJsonFile: 'lerna.json',
+          npmLock: 'package-lock.json',
         },
-        npmLock: 'package-lock.json',
         npmrc: '#dummy',
       },
       {
         packageFile: 'packages/cli/package.json',
         managerData: {
           lernaJsonFile: 'lerna.json',
+          yarnLock: 'yarn.lock',
         },
-        yarnLock: 'yarn.lock',
       },
       {
         packageFile: 'packages/test/package.json',
-        yarnLock: 'yarn.lock',
+        managerData: {
+          yarnLock: 'yarn.lock',
+        },
       },
       {
         packageFile: 'packages/pnpm/package.json',
-        pnpmShrinkwrap: 'packages/pnpm/pnpm-lock.yaml',
+        managerData: {
+          pnpmShrinkwrap: 'packages/pnpm/pnpm-lock.yaml',
+        },
       },
     ],
   };
@@ -74,8 +78,8 @@ describe('modules/manager/npm/post-update/index', () => {
           isRemediation: true,
           managerData: {
             lernaJsonFile: 'lerna.json',
+            npmLock: 'package-lock.json',
           },
-          npmLock: 'package-lock.json',
           rangeStrategy: 'widen',
         },
         {
@@ -83,17 +87,21 @@ describe('modules/manager/npm/post-update/index', () => {
           isRemediation: true,
           managerData: {
             lernaJsonFile: 'lerna.json',
+            npmLock: 'randomFolder/package-lock.json',
           },
-          npmLock: 'randomFolder/package-lock.json',
           lockFiles: ['randomFolder/package-lock.json'],
           rangeStrategy: 'pin',
         },
         {
           isLockfileUpdate: true,
-          npmLock: 'package-lock.json',
+          managerData: {
+            npmLock: 'package-lock.json',
+          },
         },
         {
-          yarnLock: 'yarn.lock',
+          managerData: {
+            yarnLock: 'yarn.lock',
+          },
           isLockfileUpdate: true,
         },
       ],
@@ -173,7 +181,9 @@ describe('modules/manager/npm/post-update/index', () => {
             upgrades: [
               {
                 isLockfileUpdate: true,
-                yarnLock: 'yarn.lock',
+                managerData: {
+                  yarnLock: 'yarn.lock',
+                },
               },
             ],
           },
@@ -223,9 +233,13 @@ describe('modules/manager/npm/post-update/index', () => {
       await writeExistingFiles(updateConfig, {
         npm: [
           // This package's npmrc should be written verbatim.
-          { packageFile: 'packages/core/package.json', npmrc: '#dummy' },
+          {
+            packageFile: 'packages/core/package.json',
+            npmrc: '#dummy',
+            managerData: {},
+          },
           // No npmrc content should be written for this package.
-          { packageFile: 'packages/core/package.json' },
+          { packageFile: 'packages/core/package.json', managerData: {} },
         ],
       });
 
@@ -242,9 +256,13 @@ describe('modules/manager/npm/post-update/index', () => {
         {
           npm: [
             // This package's npmrc should be written verbatim.
-            { packageFile: 'packages/core/package.json', npmrc: '#dummy' },
+            {
+              packageFile: 'packages/core/package.json',
+              npmrc: '#dummy',
+              managerData: {},
+            },
             // No npmrc content should be written for this package.
-            { packageFile: 'packages/core/package.json' },
+            { packageFile: 'packages/core/package.json', managerData: {} },
           ],
         }
       );
@@ -554,10 +572,10 @@ describe('modules/manager/npm/post-update/index', () => {
               {
                 packageFile: 'package.json',
                 managerData: {
+                  lernaClient: 'npm',
                   lernaJsonFile: 'lerna.json',
+                  npmLock: 'package-lock.json',
                 },
-                npmLock: 'package-lock.json',
-                lernaClient: 'npm',
               },
             ],
           }
@@ -704,7 +722,9 @@ describe('modules/manager/npm/post-update/index', () => {
         await getAdditionalFiles(
           {
             ...updateConfig,
-            npmLock: 'npm-shrinkwrap.json',
+            managerData: {
+              npmLock: 'npm-shrinkwrap.json',
+            },
             updateLockFiles: true,
             upgrades: [{}],
           },
@@ -713,10 +733,10 @@ describe('modules/manager/npm/post-update/index', () => {
               {
                 packageFile: 'package.json',
                 managerData: {
+                  lernaClient: 'npm',
                   lernaJsonFile: 'lerna.json',
+                  npmLock: 'npm-shrinkwrap.json',
                 },
-                npmLock: 'npm-shrinkwrap.json',
-                lernaClient: 'npm',
               },
             ],
           }
diff --git a/lib/modules/manager/npm/post-update/index.ts b/lib/modules/manager/npm/post-update/index.ts
index b14b98ac0d..0e065f7b16 100644
--- a/lib/modules/manager/npm/post-update/index.ts
+++ b/lib/modules/manager/npm/post-update/index.ts
@@ -56,18 +56,18 @@ export function determineLockFileDirs(
   for (const upgrade of config.upgrades) {
     if (upgrade.updateType === 'lockFileMaintenance' || upgrade.isRemediation) {
       // Return every directory that contains a lockfile
-      if (upgrade.managerData?.lernaJsonFile && upgrade.npmLock) {
+      if (upgrade.managerData?.lernaJsonFile && upgrade.managerData.npmLock) {
         lernaJsonFiles.push(upgrade.managerData.lernaJsonFile);
       } else {
-        yarnLockDirs.push(upgrade.yarnLock);
-        npmLockDirs.push(upgrade.npmLock);
-        pnpmShrinkwrapDirs.push(upgrade.pnpmShrinkwrap);
+        yarnLockDirs.push(upgrade.managerData?.yarnLock);
+        npmLockDirs.push(upgrade.managerData?.npmLock);
+        pnpmShrinkwrapDirs.push(upgrade.managerData?.pnpmShrinkwrap);
       }
       continue;
     }
     if (upgrade.isLockfileUpdate) {
-      yarnLockDirs.push(upgrade.yarnLock);
-      npmLockDirs.push(upgrade.npmLock);
+      yarnLockDirs.push(upgrade.managerData?.yarnLock);
+      npmLockDirs.push(upgrade.managerData?.npmLock);
     }
   }
 
@@ -85,7 +85,9 @@ export function determineLockFileDirs(
     };
   }
 
-  function getPackageFile(fileName: string): Partial<PackageFile> {
+  function getPackageFile(
+    fileName: string
+  ): Partial<PackageFile<NpmManagerData>> {
     logger.trace('Looking for packageFile: ' + fileName);
 
     for (const packageFile of packageFiles.npm!) {
@@ -102,21 +104,28 @@ export function determineLockFileDirs(
   for (const p of config.updatedPackageFiles!) {
     logger.trace(`Checking ${String(p.path)} for lock files`);
     const packageFile = getPackageFile(p.path);
+    // istanbul ignore if
+    if (!packageFile.managerData) {
+      continue;
+    }
     // lerna first
-    if (packageFile.managerData?.lernaJsonFile && packageFile.npmLock) {
+    if (
+      packageFile.managerData?.lernaJsonFile &&
+      packageFile.managerData.npmLock
+    ) {
       logger.debug(`${packageFile.packageFile} has lerna lock file`);
       lernaJsonFiles.push(packageFile.managerData.lernaJsonFile);
     } else if (
       packageFile.managerData?.lernaJsonFile &&
-      packageFile.yarnLock &&
-      !packageFile.hasWorkspaces
+      packageFile.managerData.yarnLock &&
+      !packageFile.managerData.hasWorkspaces
     ) {
       lernaJsonFiles.push(packageFile.managerData.lernaJsonFile);
     } else {
       // push full lock file names and convert them later
-      yarnLockDirs.push(packageFile.yarnLock);
-      npmLockDirs.push(packageFile.npmLock);
-      pnpmShrinkwrapDirs.push(packageFile.pnpmShrinkwrap);
+      yarnLockDirs.push(packageFile.managerData.yarnLock);
+      npmLockDirs.push(packageFile.managerData.npmLock);
+      pnpmShrinkwrapDirs.push(packageFile.managerData.pnpmShrinkwrap);
     }
   }
 
@@ -141,6 +150,10 @@ export async function writeExistingFiles(
     'Writing package.json files'
   );
   for (const packageFile of npmFiles) {
+    // istanbul ignore if
+    if (!packageFile.managerData) {
+      continue;
+    }
     // TODO #7154
     const basedir = upath.dirname(packageFile.packageFile!);
     const npmrc = packageFile.npmrc;
@@ -152,7 +165,7 @@ export async function writeExistingFiles(
         logger.warn({ npmrcFilename, err }, 'Error writing .npmrc');
       }
     }
-    const { npmLock } = packageFile;
+    const npmLock = packageFile.managerData.npmLock;
     if (npmLock) {
       const npmLockPath = npmLock;
       if (
@@ -183,9 +196,12 @@ export async function writeExistingFiles(
             if (upgrade.lockFiles && !upgrade.lockFiles.includes(npmLock)) {
               continue;
             }
+            if (!upgrade.managerData) {
+              continue;
+            }
             if (
               upgrade.rangeStrategy === 'widen' &&
-              upgrade.npmLock === npmLock
+              upgrade.managerData.npmLock === npmLock
             ) {
               // TODO #7154
               widens.push(upgrade.depName!);
@@ -233,13 +249,16 @@ export async function writeExistingFiles(
         }
       }
     }
-    const { yarnLock } = packageFile;
+    const { yarnLock } = packageFile.managerData;
     if (yarnLock && config.reuseLockFiles === false) {
       await deleteLocalFile(yarnLock);
     }
     // istanbul ignore next
-    if (packageFile.pnpmShrinkwrap && config.reuseLockFiles === false) {
-      await deleteLocalFile(packageFile.pnpmShrinkwrap);
+    if (
+      packageFile.managerData.pnpmShrinkwrap &&
+      config.reuseLockFiles === false
+    ) {
+      await deleteLocalFile(packageFile.managerData.pnpmShrinkwrap);
     }
   }
 }
@@ -540,7 +559,7 @@ export async function getAdditionalFiles(
     const fileName = upath.basename(npmLock);
     logger.debug(`Generating ${fileName} for ${lockFileDir}`);
     const upgrades = config.upgrades.filter(
-      (upgrade) => upgrade.npmLock === npmLock
+      (upgrade) => upgrade.managerData?.npmLock === npmLock
     );
     const res = await npm.generateLockFile(
       lockFileDir,
@@ -624,7 +643,7 @@ export async function getAdditionalFiles(
     logger.debug(`Generating yarn.lock for ${lockFileDir}`);
     const lockFileName = upath.join(lockFileDir, 'yarn.lock');
     const upgrades = config.upgrades.filter(
-      (upgrade) => upgrade.yarnLock === yarnLock
+      (upgrade) => upgrade.managerData?.yarnLock === yarnLock
     );
     const res = await yarn.generateLockFile(lockFileDir, env, config, upgrades);
     if (res.error) {
@@ -697,7 +716,7 @@ export async function getAdditionalFiles(
     await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);
     logger.debug(`Generating pnpm-lock.yaml for ${lockFileDir}`);
     const upgrades = config.upgrades.filter(
-      (upgrade) => upgrade.pnpmShrinkwrap === pnpmShrinkwrap
+      (upgrade) => upgrade.managerData?.pnpmShrinkwrap === pnpmShrinkwrap
     );
     const res = await pnpm.generateLockFile(lockFileDir, env, config, upgrades);
     if (res.error) {
@@ -759,10 +778,10 @@ export async function getAdditionalFiles(
       logger.debug('No matching package.json found');
       throw new Error('lerna-no-lockfile');
     }
-    if (lernaPackageFile.lernaClient === 'npm') {
-      lockFile = config.npmLock ?? 'package-lock.json';
+    if (lernaPackageFile.managerData?.lernaClient === 'npm') {
+      lockFile = config.managerData?.npmLock ?? 'package-lock.json';
     } else {
-      lockFile = config.yarnLock ?? 'yarn.lock';
+      lockFile = config.managerData?.yarnLock ?? 'yarn.lock';
     }
     const skipInstalls =
       lockFile === 'npm-shrinkwrap.json' ? false : config.skipInstalls;
@@ -829,17 +848,22 @@ export async function getAdditionalFiles(
       });
     } else {
       for (const packageFile of packageFiles.npm) {
-        const filename = packageFile.npmLock ?? packageFile.yarnLock;
+        const filename =
+          packageFile.managerData?.npmLock ?? packageFile.managerData?.yarnLock;
+        // istanbul ignore if
+        if (!is.nonEmptyString(filename)) {
+          continue;
+        }
         logger.trace(`Checking for ${filename}`);
         const existingContent = await getFile(
           // TODO #7154
-          filename!,
+          filename,
           config.reuseExistingBranch ? config.branchName : config.baseBranch
         );
         if (existingContent) {
           logger.trace('Found lock file');
           // TODO #7154
-          const lockFilePath = filename!;
+          const lockFilePath = filename;
           logger.trace('Checking against ' + lockFilePath);
           try {
             const newContent =
@@ -859,7 +883,7 @@ export async function getAdditionalFiles(
               updatedArtifacts.push({
                 type: 'addition',
                 // TODO #7154
-                path: filename!,
+                path: filename,
                 contents: newContent,
               });
             }
diff --git a/lib/modules/manager/npm/post-update/lerna.spec.ts b/lib/modules/manager/npm/post-update/lerna.spec.ts
index 9746d1b049..3b05f9c617 100644
--- a/lib/modules/manager/npm/post-update/lerna.spec.ts
+++ b/lib/modules/manager/npm/post-update/lerna.spec.ts
@@ -14,8 +14,8 @@ process.env.BUILDPACK = 'true';
 
 function lernaPkgFile(lernaClient: string): Partial<PackageFile> {
   return {
-    lernaClient,
     deps: [{ depName: 'lerna', currentValue: '2.0.0' }],
+    managerData: { lernaClient },
   };
 }
 
@@ -23,7 +23,7 @@ function lernaPkgFileWithoutLernaDep(
   lernaClient: string
 ): Partial<PackageFile> {
   return {
-    lernaClient,
+    managerData: { lernaClient },
   };
 }
 
diff --git a/lib/modules/manager/npm/post-update/lerna.ts b/lib/modules/manager/npm/post-update/lerna.ts
index a195f80c87..a6504816ad 100644
--- a/lib/modules/manager/npm/post-update/lerna.ts
+++ b/lib/modules/manager/npm/post-update/lerna.ts
@@ -1,3 +1,4 @@
+import is from '@sindresorhus/is';
 import semver from 'semver';
 import upath from 'upath';
 import { GlobalConfig } from '../../../../config/global';
@@ -10,12 +11,13 @@ import type {
   ToolConstraint,
 } from '../../../../util/exec/types';
 import type { PackageFile, PostUpdateConfig } from '../../types';
+import type { NpmManagerData } from '../types';
 import { getNodeToolConstraint } from './node-version';
 import type { GenerateLockFileResult } from './types';
 
 // Exported for testability
 export function getLernaVersion(
-  lernaPackageFile: Partial<PackageFile>
+  lernaPackageFile: Partial<PackageFile<NpmManagerData>>
 ): string | null {
   const lernaDep = lernaPackageFile.deps?.find((d) => d.depName === 'lerna');
   if (!lernaDep?.currentValue || !semver.validRange(lernaDep.currentValue)) {
@@ -30,14 +32,14 @@ export function getLernaVersion(
 }
 
 export async function generateLockFiles(
-  lernaPackageFile: Partial<PackageFile>,
+  lernaPackageFile: Partial<PackageFile<NpmManagerData>>,
   lockFileDir: string,
   config: PostUpdateConfig,
   env: NodeJS.ProcessEnv,
   skipInstalls?: boolean
 ): Promise<GenerateLockFileResult> {
-  const lernaClient = lernaPackageFile.lernaClient;
-  if (!lernaClient) {
+  const lernaClient = lernaPackageFile.managerData?.lernaClient;
+  if (!is.nonEmptyString(lernaClient)) {
     logger.warn('No lernaClient specified - returning');
     return { error: false };
   }
diff --git a/lib/modules/manager/npm/post-update/types.ts b/lib/modules/manager/npm/post-update/types.ts
index cf282628da..56b50b78cc 100644
--- a/lib/modules/manager/npm/post-update/types.ts
+++ b/lib/modules/manager/npm/post-update/types.ts
@@ -1,5 +1,6 @@
 import type { FileChange } from '../../../../util/git/types';
 import type { PackageFile } from '../../types';
+import type { NpmManagerData } from '../types';
 
 export interface DetermineLockFileDirsResult {
   yarnLockDirs: string[];
@@ -9,7 +10,7 @@ export interface DetermineLockFileDirsResult {
 }
 
 export interface AdditionalPackageFiles {
-  npm?: Partial<PackageFile>[];
+  npm?: Partial<PackageFile<NpmManagerData>>[];
 }
 
 export interface ArtifactError {
diff --git a/lib/modules/manager/npm/types.ts b/lib/modules/manager/npm/types.ts
index ed7a7adbad..9fa430cd8d 100644
--- a/lib/modules/manager/npm/types.ts
+++ b/lib/modules/manager/npm/types.ts
@@ -71,9 +71,22 @@ export type NpmDepType =
   | 'peerDependencies'
   | 'resolutions';
 
-export interface NpmManagerData extends Record<string, any> {
+export interface NpmLockFiles {
+  yarnLock?: string;
+  packageLock?: string;
+  shrinkwrapJson?: string;
+  pnpmShrinkwrap?: string;
+  npmLock?: string;
+}
+
+export interface NpmManagerData extends NpmLockFiles, Record<string, any> {
   hasPackageManager?: boolean;
+  hasWorkspaces?: boolean;
+  lernaClient?: string;
   lernaJsonFile?: string;
+  lernaPackages?: string[];
+  packageJsonName?: string;
   parents?: string[];
   yarnZeroInstall?: boolean;
+  workspacesPackages?: string[] | string;
 }
diff --git a/lib/modules/manager/types.ts b/lib/modules/manager/types.ts
index e89fcfa9e2..c805a71a53 100644
--- a/lib/modules/manager/types.ts
+++ b/lib/modules/manager/types.ts
@@ -51,35 +51,18 @@ export interface RangeConfig<T = Record<string, any>> extends ManagerData<T> {
   rangeStrategy: RangeStrategy;
 }
 
-export interface NpmLockFiles {
-  yarnLock?: string;
-  packageLock?: string;
-  shrinkwrapJson?: string;
-  pnpmShrinkwrap?: string;
-  npmLock?: string;
-  lockFiles?: string[];
-}
-
-export interface PackageFile<T = Record<string, any>>
-  extends NpmLockFiles,
-    ManagerData<T> {
+export interface PackageFile<T = Record<string, any>> extends ManagerData<T> {
   autoReplaceStringTemplate?: string;
-  hasWorkspaces?: boolean;
   extractedConstraints?: Record<string, string>;
   datasource?: string;
   registryUrls?: string[];
   additionalRegistryUrls?: string[];
   deps: PackageDependency[];
-  lernaClient?: string;
-  lernaPackages?: string[];
-  mavenProps?: Record<string, any>;
+  lockFiles?: string[];
   npmrc?: string;
   packageFile?: string | null;
-  packageJsonName?: string;
   packageFileVersion?: string;
-  parent?: string;
   skipInstalls?: boolean;
-  workspacesPackages?: string[] | string;
   matchStrings?: string[];
   matchStringsStrategy?: MatchStringsStrategy;
 }
@@ -166,12 +149,11 @@ export interface PackageDependency<T = Record<string, any>> extends Package<T> {
   variableName?: string;
 }
 
-export interface Upgrade<T = Record<string, any>>
-  extends Package<T>,
-    NpmLockFiles {
+export interface Upgrade<T = Record<string, any>> extends Package<T> {
   isLockfileUpdate?: boolean;
   currentRawValue?: any;
   depGroup?: string;
+  lockFiles?: string[];
   name?: string;
   newDigest?: string;
   newFrom?: string;
-- 
GitLab