From cbca54d0c32baa631126a2c7856a4fc343de7f3f Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Sat, 15 Oct 2022 19:00:40 +0200
Subject: [PATCH] feat!: do not auto pin rangeStrategy (#18309)

Removes all logic where rangeStrategy=auto results in pinning.

Closes #18304

BREAKING CHANGE: Dependencies are no longer automatically pinned, pinning must be opted into using rangeStrategy=pin
---
 .../new-package-manager-template.md           |  8 ------
 docs/usage/configuration-options.md           |  8 +++---
 .../getting-started/installing-onboarding.md  |  2 +-
 lib/modules/manager/bundler/index.ts          |  2 --
 lib/modules/manager/bundler/range.spec.ts     | 16 -----------
 lib/modules/manager/bundler/range.ts          | 22 ---------------
 lib/modules/manager/composer/range.spec.ts    |  8 +++---
 lib/modules/manager/composer/range.ts         | 27 +------------------
 .../extract/__snapshots__/index.spec.ts.snap  | 17 ------------
 lib/modules/manager/npm/extract/index.ts      |  5 ----
 lib/modules/manager/npm/extract/type.spec.ts  | 20 --------------
 lib/modules/manager/npm/extract/type.ts       | 16 -----------
 lib/modules/manager/npm/range.spec.ts         |  9 +++----
 lib/modules/manager/npm/range.ts              | 13 +--------
 lib/modules/manager/pip_requirements/index.ts |  1 -
 .../manager/pip_requirements/range.spec.ts    | 14 ----------
 lib/modules/manager/pip_requirements/range.ts |  9 -------
 lib/modules/manager/range.spec.ts             |  3 +--
 lib/modules/manager/setup-cfg/index.ts        |  1 -
 lib/modules/manager/setup-cfg/range.spec.ts   | 14 ----------
 lib/modules/manager/setup-cfg/range.ts        |  8 ------
 lib/modules/manager/types.ts                  |  2 --
 .../__fixtures__/package-files.json           |  1 -
 .../repository/extract/manager-files.spec.ts  |  1 -
 24 files changed, 15 insertions(+), 212 deletions(-)
 delete mode 100644 lib/modules/manager/bundler/range.spec.ts
 delete mode 100644 lib/modules/manager/bundler/range.ts
 delete mode 100644 lib/modules/manager/npm/extract/type.spec.ts
 delete mode 100644 lib/modules/manager/npm/extract/type.ts
 delete mode 100644 lib/modules/manager/pip_requirements/range.spec.ts
 delete mode 100644 lib/modules/manager/pip_requirements/range.ts
 delete mode 100644 lib/modules/manager/setup-cfg/range.spec.ts
 delete mode 100644 lib/modules/manager/setup-cfg/range.ts

diff --git a/docs/development/new-package-manager-template.md b/docs/development/new-package-manager-template.md
index 4d603ec68f..0142fe58fa 100644
--- a/docs/development/new-package-manager-template.md
+++ b/docs/development/new-package-manager-template.md
@@ -74,14 +74,6 @@
 - [ ] Supports range constraints (e.g `^1.0.0` or `1.x`)
 - [ ] No
 
-### Is this package manager used for applications, libraries, or both? If both, is there a way to tell which is which?
-
-- [ ] Applications
-- [ ] Libraries
-- [ ] Both (explain how to tell which is which)
-
-### If ranges are supported, are there any cases when Renovate should pin ranges to exact versions if rangeStrategy=auto?
-
 ---
 
 ## Lookup
diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md
index 123d305747..2a69db77e1 100644
--- a/docs/usage/configuration-options.md
+++ b/docs/usage/configuration-options.md
@@ -2353,11 +2353,9 @@ Behavior:
 
 Renovate's `"auto"` strategy works like this for npm:
 
-1. Always pin `devDependencies`
-2. Pin `dependencies` if we detect that it's an app and not a library
-3. Widen `peerDependencies`
-4. If an existing range already ends with an "or" operator - e.g. `"^1.0.0 || ^2.0.0"` - then Renovate will widen it, e.g. making it into `"^1.0.0 || ^2.0.0 || ^3.0.0"`
-5. Otherwise, replace the range. e.g. `"^2.0.0"` would be replaced by `"^3.0.0"`
+1. Widen `peerDependencies`
+1. If an existing range already ends with an "or" operator like `"^1.0.0 || ^2.0.0"`, then Renovate widens it into `"^1.0.0 || ^2.0.0 || ^3.0.0"`
+1. Otherwise, Renovate replaces the range. So `"^2.0.0"` is replaced by `"^3.0.0"`
 
 By default, Renovate assumes that if you are using ranges then it's because you want them to be wide/open.
 Renovate won't deliberately "narrow" any range by increasing the semver value inside.
diff --git a/docs/usage/getting-started/installing-onboarding.md b/docs/usage/getting-started/installing-onboarding.md
index 36f0f11b7c..c40a9ae8a2 100644
--- a/docs/usage/getting-started/installing-onboarding.md
+++ b/docs/usage/getting-started/installing-onboarding.md
@@ -107,7 +107,7 @@ Sometimes Renovate detects that an override to these defaults is needed, and wil
 Please check the docs on this website for an exhaustive Configuration Reference.
 To help you get started, here are some of the most commonly changed (overridden) configuration settings:
 
-- **rangeStrategy**: By default (with zero config) it's `"replace"` but the `"config:base"` preset overrides it to `"auto"`. If you don't want to pin dependency versions and retain ranges, add the `":preserveSemverRanges"` preset to the `extends` array
+- **rangeStrategy**: By default (with zero config) it's `"replace"` but the `"config:base"` preset overrides it to `"auto"`. Some prefer `"bump"`.
 - **labels**: Labels to assign to Pull Requests
 - **assignees**: GitHub user(s) to assign the Pull Requests to
 
diff --git a/lib/modules/manager/bundler/index.ts b/lib/modules/manager/bundler/index.ts
index 2f34350e9c..8f3ffc212b 100644
--- a/lib/modules/manager/bundler/index.ts
+++ b/lib/modules/manager/bundler/index.ts
@@ -4,7 +4,6 @@ import { RubyGemsDatasource } from '../../datasource/rubygems';
 import * as rubyVersioning from '../../versioning/ruby';
 import { updateArtifacts } from './artifacts';
 import { extractPackageFile } from './extract';
-import { getRangeStrategy } from './range';
 import { updateLockedDependency } from './update-locked';
 
 export const language = ProgrammingLanguage.Ruby;
@@ -18,7 +17,6 @@ export const supportsLockFileMaintenance = true;
 export {
   extractPackageFile, // Mandatory unless extractAllPackageFiles is used instead
   updateArtifacts, // Optional
-  getRangeStrategy, // Optional
   updateLockedDependency,
 };
 
diff --git a/lib/modules/manager/bundler/range.spec.ts b/lib/modules/manager/bundler/range.spec.ts
deleted file mode 100644
index 13c1de9937..0000000000
--- a/lib/modules/manager/bundler/range.spec.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import type { RangeConfig } from '../types';
-import { getRangeStrategy } from '.';
-
-describe('modules/manager/bundler/range', () => {
-  describe('getRangeStrategy()', () => {
-    it('returns replace when rangeStrategy is auto', () => {
-      const config: RangeConfig = { rangeStrategy: 'auto' };
-      expect(getRangeStrategy(config)).toBe('replace');
-    });
-
-    it('returns the config value when rangeStrategy is different than auto', () => {
-      const config: RangeConfig = { rangeStrategy: 'update-lockfile' };
-      expect(getRangeStrategy(config)).toBe('update-lockfile');
-    });
-  });
-});
diff --git a/lib/modules/manager/bundler/range.ts b/lib/modules/manager/bundler/range.ts
deleted file mode 100644
index 84805358f5..0000000000
--- a/lib/modules/manager/bundler/range.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import type { RangeStrategy } from '../../../types';
-import type { RangeConfig } from '../types';
-
-/*
- * The getRangeStrategy() function is optional and can be removed if not applicable.
- * It is used when the user configures rangeStrategy=auto.
- *
- * For example in npm, when rangeStrategy is auto we:
- *  - Always pin "devDependencies"
- *  - Pin "dependencies" only if we detect that it's probably an app not a library
- *  - Always widen "peerDependencies"
- *
- * If this function is not present then the default 'replace' value will be used.
- *
- */
-export function getRangeStrategy(config: RangeConfig): RangeStrategy {
-  if (config.rangeStrategy === 'auto') {
-    return 'replace';
-  }
-
-  return config.rangeStrategy;
-}
diff --git a/lib/modules/manager/composer/range.spec.ts b/lib/modules/manager/composer/range.spec.ts
index 3c5b42f495..87f65b9c67 100644
--- a/lib/modules/manager/composer/range.spec.ts
+++ b/lib/modules/manager/composer/range.spec.ts
@@ -7,21 +7,21 @@ describe('modules/manager/composer/range', () => {
     expect(getRangeStrategy(config)).toBe('widen');
   });
 
-  it('pins require-dev', () => {
+  it('replaces require-dev', () => {
     const config: RangeConfig = {
       rangeStrategy: 'auto',
       depType: 'require-dev',
     };
-    expect(getRangeStrategy(config)).toBe('pin');
+    expect(getRangeStrategy(config)).toBe('replace');
   });
 
-  it('pins project require', () => {
+  it('replaces project require', () => {
     const config: RangeConfig = {
       rangeStrategy: 'auto',
       managerData: { composerJsonType: 'project' },
       depType: 'require',
     };
-    expect(getRangeStrategy(config)).toBe('pin');
+    expect(getRangeStrategy(config)).toBe('replace');
   });
 
   it('widens complex ranges', () => {
diff --git a/lib/modules/manager/composer/range.ts b/lib/modules/manager/composer/range.ts
index 02b7daff82..dd70eb54f9 100644
--- a/lib/modules/manager/composer/range.ts
+++ b/lib/modules/manager/composer/range.ts
@@ -4,13 +4,7 @@ import type { RangeConfig } from '../types';
 import type { ComposerManagerData } from './types';
 
 export function getRangeStrategy(config: RangeConfig): RangeStrategy {
-  const {
-    managerData = {},
-    depType,
-    depName,
-    currentValue,
-    rangeStrategy,
-  } = config;
+  const { managerData = {}, currentValue, rangeStrategy } = config;
   const { composerJsonType } = managerData as ComposerManagerData;
   const isComplexRange = currentValue?.includes(' || ');
   if (rangeStrategy === 'bump' && isComplexRange) {
@@ -23,25 +17,6 @@ export function getRangeStrategy(config: RangeConfig): RangeStrategy {
   if (rangeStrategy !== 'auto') {
     return rangeStrategy;
   }
-  if (depType === 'require-dev') {
-    // Always pin dev dependencies
-    logger.trace({ dependency: depName }, 'Pinning require-dev');
-    return 'pin';
-  }
-  const isApp =
-    composerJsonType &&
-    ![
-      'library',
-      'metapackage',
-      'composer-plugin',
-      'symfony-bundle',
-      'typo3-cms-extension',
-    ].includes(composerJsonType);
-  if (isApp && depType === 'require') {
-    // Pin dependencies if it's an app/project
-    logger.trace({ dependency: depName }, 'Pinning app require');
-    return 'pin';
-  }
   if (
     isComplexRange ||
     (composerJsonType && ['typo3-cms-extension'].includes(composerJsonType))
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 165138b1c3..9962ebc67a 100644
--- a/lib/modules/manager/npm/extract/__snapshots__/index.spec.ts.snap
+++ b/lib/modules/manager/npm/extract/__snapshots__/index.spec.ts.snap
@@ -22,7 +22,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() catches invalid
   "npmrc": undefined,
   "packageFileVersion": undefined,
   "packageJsonName": undefined,
-  "packageJsonType": "app",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": undefined,
@@ -144,7 +143,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() extracts engine
   "npmrc": undefined,
   "packageFileVersion": undefined,
   "packageJsonName": undefined,
-  "packageJsonType": "library",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": undefined,
@@ -325,7 +323,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() extracts non-np
   "npmrc": undefined,
   "packageFileVersion": undefined,
   "packageJsonName": undefined,
-  "packageJsonType": "app",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": undefined,
@@ -375,7 +372,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() extracts npm pa
   "npmrc": undefined,
   "packageFileVersion": undefined,
   "packageJsonName": undefined,
-  "packageJsonType": "app",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": false,
   "yarnLock": undefined,
@@ -410,7 +406,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() extracts packag
   "npmrc": undefined,
   "packageFileVersion": undefined,
   "packageJsonName": undefined,
-  "packageJsonType": "app",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": undefined,
@@ -478,7 +473,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() extracts volta
   "npmrc": undefined,
   "packageFileVersion": undefined,
   "packageJsonName": undefined,
-  "packageJsonType": "library",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": undefined,
@@ -533,7 +527,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() extracts volta
   "npmrc": undefined,
   "packageFileVersion": undefined,
   "packageJsonName": undefined,
-  "packageJsonType": "library",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": undefined,
@@ -670,7 +663,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() finds "npmClien
   "npmrc": undefined,
   "packageFileVersion": "1.0.0",
   "packageJsonName": "renovate",
-  "packageJsonType": "app",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": undefined,
@@ -807,7 +799,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() finds "npmClien
   "npmrc": undefined,
   "packageFileVersion": "1.0.0",
   "packageJsonName": "renovate",
-  "packageJsonType": "app",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": undefined,
@@ -944,7 +935,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() finds a lock fi
   "npmrc": undefined,
   "packageFileVersion": "1.0.0",
   "packageJsonName": "renovate",
-  "packageJsonType": "app",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": "yarn.lock",
@@ -967,7 +957,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() finds complex y
   "npmrc": undefined,
   "packageFileVersion": "0.0.8",
   "packageJsonName": "@a/b",
-  "packageJsonType": "app",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": undefined,
@@ -1106,7 +1095,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() finds lerna 1`]
   "npmrc": undefined,
   "packageFileVersion": "1.0.0",
   "packageJsonName": "renovate",
-  "packageJsonType": "app",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": undefined,
@@ -1129,7 +1117,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() finds simple ya
   "npmrc": undefined,
   "packageFileVersion": "0.0.8",
   "packageJsonName": "@a/b",
-  "packageJsonType": "app",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": undefined,
@@ -1154,7 +1141,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() finds simple ya
   "npmrc": undefined,
   "packageFileVersion": "0.0.8",
   "packageJsonName": "@a/b",
-  "packageJsonType": "app",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": undefined,
@@ -1293,7 +1279,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() returns an arra
   "npmrc": undefined,
   "packageFileVersion": "1.0.0",
   "packageJsonName": "renovate",
-  "packageJsonType": "app",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": undefined,
@@ -1412,7 +1397,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() returns an arra
   "npmrc": undefined,
   "packageFileVersion": "1.0.0",
   "packageJsonName": "renovate",
-  "packageJsonType": "app",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": true,
   "yarnLock": undefined,
@@ -1549,7 +1533,6 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() sets skipInstal
   "npmrc": undefined,
   "packageFileVersion": "1.0.0",
   "packageJsonName": "renovate",
-  "packageJsonType": "app",
   "pnpmShrinkwrap": undefined,
   "skipInstalls": false,
   "yarnLock": "yarn.lock",
diff --git a/lib/modules/manager/npm/extract/index.ts b/lib/modules/manager/npm/extract/index.ts
index d395a4940d..237d3b8317 100644
--- a/lib/modules/manager/npm/extract/index.ts
+++ b/lib/modules/manager/npm/extract/index.ts
@@ -18,7 +18,6 @@ import type {
 import type { NpmManagerData } from '../types';
 import { getLockedVersions } from './locked-versions';
 import { detectMonorepos } from './monorepo';
-import { mightBeABrowserLibrary } from './type';
 import type { NpmPackage, NpmPackageDependency } from './types';
 import { isZeroInstall } from './yarn';
 
@@ -73,9 +72,6 @@ export async function extractPackageFile(
   } else {
     yarnWorkspacesPackages = packageJson.workspaces?.packages;
   }
-  const packageJsonType = mightBeABrowserLibrary(packageJson)
-    ? 'library'
-    : 'app';
 
   const lockFiles: NpmLockFiles = {
     yarnLock: 'yarn.lock',
@@ -458,7 +454,6 @@ export async function extractPackageFile(
     deps,
     packageJsonName,
     packageFileVersion,
-    packageJsonType,
     npmrc,
     ...lockFiles,
     managerData: {
diff --git a/lib/modules/manager/npm/extract/type.spec.ts b/lib/modules/manager/npm/extract/type.spec.ts
deleted file mode 100644
index df2b6b4a97..0000000000
--- a/lib/modules/manager/npm/extract/type.spec.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { mightBeABrowserLibrary } from './type';
-
-describe('modules/manager/npm/extract/type', () => {
-  describe('.mightBeABrowserLibrary()', () => {
-    it('is not a library if private', () => {
-      const isLibrary = mightBeABrowserLibrary({ private: true });
-      expect(isLibrary).toBeFalse();
-    });
-
-    it('is not a library if no main', () => {
-      const isLibrary = mightBeABrowserLibrary({});
-      expect(isLibrary).toBeFalse();
-    });
-
-    it('is a library if has a main', () => {
-      const isLibrary = mightBeABrowserLibrary({ main: 'index.js ' });
-      expect(isLibrary).toBeTrue();
-    });
-  });
-});
diff --git a/lib/modules/manager/npm/extract/type.ts b/lib/modules/manager/npm/extract/type.ts
deleted file mode 100644
index bf0f4b6448..0000000000
--- a/lib/modules/manager/npm/extract/type.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import type { NpmPackage } from './types';
-
-export function mightBeABrowserLibrary(packageJson: NpmPackage): boolean {
-  // return true unless we're sure it's not a browser library
-  if (packageJson.private === true) {
-    // it's not published
-    return false;
-  }
-  if (packageJson.main === undefined && packageJson.exports === undefined) {
-    // it can't be required
-    return false;
-  }
-  // TODO: how can we know if it's a node.js library only, and not browser?
-  // Otherwise play it safe and return true (#9616)
-  return true;
-}
diff --git a/lib/modules/manager/npm/range.spec.ts b/lib/modules/manager/npm/range.spec.ts
index c50ae01976..997567a68d 100644
--- a/lib/modules/manager/npm/range.spec.ts
+++ b/lib/modules/manager/npm/range.spec.ts
@@ -7,21 +7,20 @@ describe('modules/manager/npm/range', () => {
     expect(getRangeStrategy(config)).toBe('widen');
   });
 
-  it('pins devDependencies', () => {
+  it('replaces devDependencies', () => {
     const config: RangeConfig = {
       rangeStrategy: 'auto',
       depType: 'devDependencies',
     };
-    expect(getRangeStrategy(config)).toBe('pin');
+    expect(getRangeStrategy(config)).toBe('replace');
   });
 
-  it('pins app dependencies', () => {
+  it('replaces app dependencies', () => {
     const config: RangeConfig = {
       rangeStrategy: 'auto',
       depType: 'dependencies',
-      packageJsonType: 'app',
     };
-    expect(getRangeStrategy(config)).toBe('pin');
+    expect(getRangeStrategy(config)).toBe('replace');
   });
 
   it('widens peerDependencies', () => {
diff --git a/lib/modules/manager/npm/range.ts b/lib/modules/manager/npm/range.ts
index 6c676a7472..ed56cb1070 100644
--- a/lib/modules/manager/npm/range.ts
+++ b/lib/modules/manager/npm/range.ts
@@ -4,8 +4,7 @@ import type { RangeStrategy } from '../../../types';
 import type { RangeConfig } from '../types';
 
 export function getRangeStrategy(config: RangeConfig): RangeStrategy {
-  const { depType, depName, packageJsonType, currentValue, rangeStrategy } =
-    config;
+  const { depType, currentValue, rangeStrategy } = config;
   // TODO #7154
   const isComplexRange = parseRange(currentValue!).length > 1;
   if (rangeStrategy === 'bump' && isComplexRange) {
@@ -18,16 +17,6 @@ export function getRangeStrategy(config: RangeConfig): RangeStrategy {
   if (rangeStrategy !== 'auto') {
     return rangeStrategy;
   }
-  if (depType === 'devDependencies') {
-    // Always pin devDependencies
-    logger.trace({ dependency: depName }, 'Pinning devDependency');
-    return 'pin';
-  }
-  if (depType === 'dependencies' && packageJsonType === 'app') {
-    // Pin dependencies if we're pretty sure it's not a browser library
-    logger.trace({ dependency: depName }, 'Pinning app dependency');
-    return 'pin';
-  }
   if (depType === 'peerDependencies') {
     // Widen peer dependencies
     logger.debug('Widening peer dependencies');
diff --git a/lib/modules/manager/pip_requirements/index.ts b/lib/modules/manager/pip_requirements/index.ts
index 2e9fe5ed44..688ffbd3f8 100644
--- a/lib/modules/manager/pip_requirements/index.ts
+++ b/lib/modules/manager/pip_requirements/index.ts
@@ -4,7 +4,6 @@ import { PypiDatasource } from '../../datasource/pypi';
 
 export { updateArtifacts } from './artifacts';
 export { extractPackageFile } from './extract';
-export { getRangeStrategy } from './range';
 
 export const language = ProgrammingLanguage.Python;
 
diff --git a/lib/modules/manager/pip_requirements/range.spec.ts b/lib/modules/manager/pip_requirements/range.spec.ts
deleted file mode 100644
index 990d06cfd1..0000000000
--- a/lib/modules/manager/pip_requirements/range.spec.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import type { RangeConfig } from '../types';
-import { getRangeStrategy } from '.';
-
-describe('modules/manager/pip_requirements/range', () => {
-  it('returns same if not auto', () => {
-    const config: RangeConfig = { rangeStrategy: 'widen' };
-    expect(getRangeStrategy(config)).toBe('widen');
-  });
-
-  it('pins if auto', () => {
-    const config: RangeConfig = { rangeStrategy: 'auto' };
-    expect(getRangeStrategy(config)).toBe('pin');
-  });
-});
diff --git a/lib/modules/manager/pip_requirements/range.ts b/lib/modules/manager/pip_requirements/range.ts
deleted file mode 100644
index 463c5442e9..0000000000
--- a/lib/modules/manager/pip_requirements/range.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import type { RangeStrategy } from '../../../types';
-import type { RangeConfig } from '../types';
-
-export function getRangeStrategy(config: RangeConfig): RangeStrategy {
-  if (config.rangeStrategy === 'auto') {
-    return 'pin';
-  }
-  return config.rangeStrategy;
-}
diff --git a/lib/modules/manager/range.spec.ts b/lib/modules/manager/range.spec.ts
index 1deed59061..0cfbbe5a51 100644
--- a/lib/modules/manager/range.spec.ts
+++ b/lib/modules/manager/range.spec.ts
@@ -15,9 +15,8 @@ describe('modules/manager/range', () => {
       manager: 'npm',
       rangeStrategy: 'auto',
       depType: 'dependencies',
-      packageJsonType: 'app',
     };
-    expect(getRangeStrategy(config)).toBe('pin');
+    expect(getRangeStrategy(config)).toBe('replace');
   });
 
   it('defaults to replace', () => {
diff --git a/lib/modules/manager/setup-cfg/index.ts b/lib/modules/manager/setup-cfg/index.ts
index abbb5548e4..d3143e2041 100644
--- a/lib/modules/manager/setup-cfg/index.ts
+++ b/lib/modules/manager/setup-cfg/index.ts
@@ -3,7 +3,6 @@ import { PypiDatasource } from '../../datasource/pypi';
 import { id as versioning } from '../../versioning/pep440';
 
 export { extractPackageFile } from './extract';
-export { getRangeStrategy } from './range';
 
 export const supportedDatasources = [PypiDatasource.id];
 
diff --git a/lib/modules/manager/setup-cfg/range.spec.ts b/lib/modules/manager/setup-cfg/range.spec.ts
deleted file mode 100644
index df75c3e17a..0000000000
--- a/lib/modules/manager/setup-cfg/range.spec.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import type { RangeConfig } from '../types';
-import { getRangeStrategy } from '.';
-
-describe('modules/manager/setup-cfg/range', () => {
-  it('returns same if not auto', () => {
-    const config: RangeConfig = { rangeStrategy: 'widen' };
-    expect(getRangeStrategy(config)).toBe('widen');
-  });
-
-  it('replaces if auto', () => {
-    const config: RangeConfig = { rangeStrategy: 'auto' };
-    expect(getRangeStrategy(config)).toBe('replace');
-  });
-});
diff --git a/lib/modules/manager/setup-cfg/range.ts b/lib/modules/manager/setup-cfg/range.ts
deleted file mode 100644
index 2487b5d015..0000000000
--- a/lib/modules/manager/setup-cfg/range.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import type { RangeStrategy } from '../../../types';
-import type { RangeConfig } from '../types';
-
-export function getRangeStrategy(config: RangeConfig): RangeStrategy {
-  return !config.rangeStrategy || config.rangeStrategy === 'auto'
-    ? 'replace'
-    : config.rangeStrategy;
-}
diff --git a/lib/modules/manager/types.ts b/lib/modules/manager/types.ts
index e636429e0d..3f8f9fbaaa 100644
--- a/lib/modules/manager/types.ts
+++ b/lib/modules/manager/types.ts
@@ -48,7 +48,6 @@ export interface RangeConfig<T = Record<string, any>> extends ManagerData<T> {
   depName?: string;
   depType?: string;
   manager?: string | null;
-  packageJsonType?: 'app' | 'library';
   rangeStrategy: RangeStrategy;
 }
 
@@ -78,7 +77,6 @@ export interface PackageFile<T = Record<string, any>>
   npmrc?: string;
   packageFile?: string | null;
   packageJsonName?: string;
-  packageJsonType?: 'app' | 'library';
   packageFileVersion?: string;
   parent?: string;
   skipInstalls?: boolean;
diff --git a/lib/workers/repository/__fixtures__/package-files.json b/lib/workers/repository/__fixtures__/package-files.json
index ae932d13fc..47449a32a0 100644
--- a/lib/workers/repository/__fixtures__/package-files.json
+++ b/lib/workers/repository/__fixtures__/package-files.json
@@ -226,7 +226,6 @@
           "fixedVersion": "2.0.14"
         }
       ],
-      "packageJsonType": "app",
       "managerData": {
         "yarnZeroInstall": false
       },
diff --git a/lib/workers/repository/extract/manager-files.spec.ts b/lib/workers/repository/extract/manager-files.spec.ts
index c81b8a3e1b..502ab7a53a 100644
--- a/lib/workers/repository/extract/manager-files.spec.ts
+++ b/lib/workers/repository/extract/manager-files.spec.ts
@@ -78,7 +78,6 @@ describe('workers/repository/extract/manager-files', () => {
       expect(res).toMatchObject([
         {
           packageFile: 'package.json',
-          packageJsonType: 'app',
           deps: [
             {
               currentValue: '2.0.0',
-- 
GitLab