From 13ece707d4ba04a8f62a8c7d84a3d47253b96f26 Mon Sep 17 00:00:00 2001 From: Rhys Arkins Date: Tue, 6 Apr 2021 13:06:40 +0200 Subject: [PATCH] feat(npm): remove ignoreNpmrcFile support (#9409) Removes support for the ignoreNpmrcFile config option. BREAKING CHANGE: ignoreNpmrcFile is no longer supported. Use an empty string for config.npmrc instead. --- docs/usage/configuration-options.md | 7 ---- .../__snapshots__/migration.spec.ts.snap | 1 + lib/config/definitions.ts | 6 --- lib/config/migration.spec.ts | 1 + lib/config/migration.ts | 3 ++ .../extract/__snapshots__/index.spec.ts.snap | 14 ------- lib/manager/npm/extract/index.spec.ts | 16 +++++++- lib/manager/npm/extract/index.ts | 39 ++++++++----------- lib/manager/npm/post-update/index.ts | 3 -- lib/manager/types.ts | 3 +- .../__snapshots__/manager-files.spec.ts.snap | 1 - lib/workers/repository/init/config.ts | 1 - 12 files changed, 37 insertions(+), 58 deletions(-) diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md index c7b4c91d667881..b21d513dc1b8a5 100644 --- a/docs/usage/configuration-options.md +++ b/docs/usage/configuration-options.md @@ -969,13 +969,6 @@ The above is the same as if you wrote this package rule: } ``` -## ignoreNpmrcFile - -By default, Renovate will look for and use any `.npmrc` file it finds in a repository. -Additionally, it will be read in by `npm` or `yarn` at the time of lock file generation. -Sometimes this causes problems, for example if the file contains placeholder values, so you can configure this to `true` and Renovate will ignore any `.npmrc` files it finds and temporarily remove the file before running `npm install` or `yarn install`. -Renovate will try to configure this to `true` also if you have configured any `npmrc` string within your config file. - ## ignorePaths Using this setting, you can selectively ignore package files that you don't want Renovate autodiscovering. diff --git a/lib/config/__snapshots__/migration.spec.ts.snap b/lib/config/__snapshots__/migration.spec.ts.snap index 27d5183112d3f3..c9c32342a28022 100644 --- a/lib/config/__snapshots__/migration.spec.ts.snap +++ b/lib/config/__snapshots__/migration.spec.ts.snap @@ -125,6 +125,7 @@ Object { "minor": Object { "automerge": true, }, + "npmrc": "", "nvmrc": Object { "packageRules": Array [ Object { diff --git a/lib/config/definitions.ts b/lib/config/definitions.ts index 6db106c11f72c6..bc4584035147ff 100644 --- a/lib/config/definitions.ts +++ b/lib/config/definitions.ts @@ -572,12 +572,6 @@ const options: RenovateOptions[] = [ default: 'auto', admin: true, }, - { - name: 'ignoreNpmrcFile', - description: 'Whether to ignore any .npmrc file found in repository.', - type: 'boolean', - default: false, - }, { name: 'autodiscover', description: 'Autodiscover all repositories.', diff --git a/lib/config/migration.spec.ts b/lib/config/migration.spec.ts index 477b523b2ead92..ba6fff96902167 100644 --- a/lib/config/migration.spec.ts +++ b/lib/config/migration.spec.ts @@ -44,6 +44,7 @@ describe(getName(__filename), () => { onboarding: 'false' as never, multipleMajorPrs: true, gitFs: false, + ignoreNpmrcFile: true, separateMajorReleases: true, separatePatchReleases: true, suppressNotifications: ['lockFileErrors', 'prEditNotification'], diff --git a/lib/config/migration.ts b/lib/config/migration.ts index 982da884faa34c..64cbd52c81ff19 100644 --- a/lib/config/migration.ts +++ b/lib/config/migration.ts @@ -207,6 +207,9 @@ export function migrateConfig( migratedConfig.allowScripts ??= true; migratedConfig.exposeAllEnv ??= true; } + } else if (key === 'ignoreNpmrcFile') { + delete migratedConfig.ignoreNpmrcFile; + migratedConfig.npmrc ||= ''; } else if ( key === 'branchName' && is.string(val) && diff --git a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap index 3200c3f4e36426..ec3e8ca7139576 100644 --- a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap +++ b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap @@ -11,7 +11,6 @@ Object { "skipReason": "invalid-name", }, ], - "ignoreNpmrcFile": undefined, "lernaClient": undefined, "lernaPackages": undefined, "managerData": Object { @@ -135,7 +134,6 @@ Object { "prettyDepType": "engine", }, ], - "ignoreNpmrcFile": undefined, "lernaClient": undefined, "lernaPackages": undefined, "managerData": Object { @@ -299,7 +297,6 @@ Object { "sourceUrl": "https://github.com/owner/n", }, ], - "ignoreNpmrcFile": undefined, "lernaClient": undefined, "lernaPackages": undefined, "managerData": Object { @@ -349,7 +346,6 @@ Object { "skipReason": "unknown-version", }, ], - "ignoreNpmrcFile": undefined, "lernaClient": undefined, "lernaPackages": undefined, "managerData": Object { @@ -410,7 +406,6 @@ Object { "skipReason": "unknown-volta", }, ], - "ignoreNpmrcFile": undefined, "lernaClient": undefined, "lernaPackages": undefined, "managerData": Object { @@ -465,7 +460,6 @@ Object { "skipReason": "unknown-version", }, ], - "ignoreNpmrcFile": undefined, "lernaClient": undefined, "lernaPackages": undefined, "managerData": Object { @@ -602,7 +596,6 @@ Object { "prettyDepType": "resolutions", }, ], - "ignoreNpmrcFile": undefined, "lernaClient": "npm", "lernaPackages": undefined, "managerData": Object { @@ -739,7 +732,6 @@ Object { "prettyDepType": "resolutions", }, ], - "ignoreNpmrcFile": undefined, "lernaClient": "yarn", "lernaPackages": undefined, "managerData": Object { @@ -876,7 +868,6 @@ Object { "prettyDepType": "resolutions", }, ], - "ignoreNpmrcFile": undefined, "lernaClient": undefined, "lernaPackages": undefined, "managerData": Object { @@ -899,7 +890,6 @@ exports[`manager/npm/extract/index .extractPackageFile() finds complex yarn work Object { "constraints": Object {}, "deps": Array [], - "ignoreNpmrcFile": undefined, "lernaClient": "npm", "lernaPackages": undefined, "managerData": Object { @@ -1038,7 +1028,6 @@ Object { "prettyDepType": "resolutions", }, ], - "ignoreNpmrcFile": undefined, "lernaClient": "npm", "lernaPackages": undefined, "managerData": Object { @@ -1061,7 +1050,6 @@ exports[`manager/npm/extract/index .extractPackageFile() finds simple yarn works Object { "constraints": Object {}, "deps": Array [], - "ignoreNpmrcFile": undefined, "lernaClient": "npm", "lernaPackages": undefined, "managerData": Object { @@ -1086,7 +1074,6 @@ exports[`manager/npm/extract/index .extractPackageFile() finds simple yarn works Object { "constraints": Object {}, "deps": Array [], - "ignoreNpmrcFile": undefined, "lernaClient": undefined, "lernaPackages": undefined, "managerData": Object { @@ -1225,7 +1212,6 @@ Object { "prettyDepType": "resolutions", }, ], - "ignoreNpmrcFile": undefined, "lernaClient": undefined, "lernaPackages": undefined, "managerData": Object { diff --git a/lib/manager/npm/extract/index.spec.ts b/lib/manager/npm/extract/index.spec.ts index fa78521e8218ba..e4d6bac61dc2b0 100644 --- a/lib/manager/npm/extract/index.spec.ts +++ b/lib/manager/npm/extract/index.spec.ts @@ -113,6 +113,20 @@ describe(getName(__filename), () => { ); expect(res.npmrc).toBeDefined(); }); + it('ignores .npmrc when config.npmrc is defined', async () => { + fs.readLocalFile = jest.fn((fileName) => { + if (fileName === '.npmrc') { + return 'some-npmrc\n'; + } + return null; + }); + const res = await npmExtract.extractPackageFile( + input01Content, + 'package.json', + { npmrc: 'some-configured-npmrc' } + ); + expect(res.npmrc).toBeUndefined(); + }); it('finds and discards .npmrc', async () => { fs.readLocalFile = jest.fn((fileName) => { if (fileName === '.npmrc') { @@ -126,7 +140,7 @@ describe(getName(__filename), () => { 'package.json', {} ); - expect(res.npmrc).toBeUndefined(); + expect(res.npmrc).toEqual(''); }); it('finds lerna', async () => { fs.readLocalFile = jest.fn((fileName) => { diff --git a/lib/manager/npm/extract/index.ts b/lib/manager/npm/extract/index.ts index 727484819f6183..cbc04c1596e629 100644 --- a/lib/manager/npm/extract/index.ts +++ b/lib/manager/npm/extract/index.ts @@ -6,11 +6,7 @@ import * as datasourceGithubTags from '../../../datasource/github-tags'; import { id as npmId } from '../../../datasource/npm'; import { logger } from '../../../logger'; import { SkipReason } from '../../../types'; -import { - deleteLocalFile, - getSiblingFileName, - readLocalFile, -} from '../../../util/fs'; +import { getSiblingFileName, readLocalFile } from '../../../util/fs'; import * as nodeVersioning from '../../../versioning/node'; import { isValid, isVersion } from '../../../versioning/npm'; import type { @@ -95,26 +91,24 @@ export async function extractPackageFile( delete lockFiles.shrinkwrapJson; let npmrc: string; - let ignoreNpmrcFile: boolean; const npmrcFileName = getSiblingFileName(fileName, '.npmrc'); - // istanbul ignore if - if (config.ignoreNpmrcFile) { - await deleteLocalFile(npmrcFileName); - } else { - npmrc = await readLocalFile(npmrcFileName, 'utf8'); - if (npmrc?.includes('package-lock')) { - logger.debug('Stripping package-lock setting from npmrc'); - npmrc = npmrc.replace(/(^|\n)package-lock.*?(\n|$)/g, '\n'); - } - if (is.string(npmrc)) { + const npmrcContent = await readLocalFile(npmrcFileName, 'utf8'); + if (is.string(npmrcContent)) { + if (is.string(config.npmrc)) { + logger.debug( + { npmrcFileName }, + 'Repo .npmrc file is ignored due to presence of config.npmrc' + ); + } else { + npmrc = npmrcContent; + if (npmrc?.includes('package-lock')) { + logger.debug('Stripping package-lock setting from .npmrc'); + npmrc = npmrc.replace(/(^|\n)package-lock.*?(\n|$)/g, '\n'); + } if (npmrc.includes('=${') && !getAdminConfig().exposeAllEnv) { - logger.debug('Discarding .npmrc file with variables'); - ignoreNpmrcFile = true; - npmrc = undefined; - await deleteLocalFile(npmrcFileName); + logger.debug('Overriding .npmrc file with variables'); + npmrc = ''; } - } else { - npmrc = undefined; } } const yarnrcFileName = getSiblingFileName(fileName, '.yarnrc'); @@ -354,7 +348,6 @@ export async function extractPackageFile( packageFileVersion, packageJsonType, npmrc, - ignoreNpmrcFile, yarnrc, ...lockFiles, managerData: { diff --git a/lib/manager/npm/post-update/index.ts b/lib/manager/npm/post-update/index.ts index 083272c1612b0f..aa992b653e70e8 100644 --- a/lib/manager/npm/post-update/index.ts +++ b/lib/manager/npm/post-update/index.ts @@ -144,9 +144,6 @@ export async function writeExistingFiles( } catch (err) /* istanbul ignore next */ { logger.warn({ npmrcFilename, err }, 'Error writing .npmrc'); } - } else if (config.ignoreNpmrcFile) { - logger.debug('Removing ignored .npmrc file before artifact generation'); - await remove(npmrcFilename); } if (packageFile.yarnrc) { logger.debug(`Writing .yarnrc to ${basedir}`); diff --git a/lib/manager/types.ts b/lib/manager/types.ts index a0e31935fe05eb..d19073f1ff208b 100644 --- a/lib/manager/types.ts +++ b/lib/manager/types.ts @@ -23,7 +23,7 @@ export interface ExtractConfig extends ManagerConfig { endpoint?: string; gradle?: { timeout?: number }; aliases?: Record; - ignoreNpmrcFile?: boolean; + npmrc?: string; yarnrc?: string; versioning?: string; updateInternalDeps?: boolean; @@ -89,7 +89,6 @@ export interface PackageFile> datasource?: string; registryUrls?: string[]; deps: PackageDependency[]; - ignoreNpmrcFile?: boolean; lernaClient?: string; lernaPackages?: string[]; mavenProps?: Record; diff --git a/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap b/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap index 917cd12286f155..579ce1c3515dc0 100644 --- a/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap +++ b/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap @@ -14,7 +14,6 @@ Array [ "prettyDepType": "dependency", }, ], - "ignoreNpmrcFile": undefined, "lernaClient": undefined, "lernaPackages": undefined, "managerData": Object { diff --git a/lib/workers/repository/init/config.ts b/lib/workers/repository/init/config.ts index fb802acef351f8..15a92b1e2f9b1a 100644 --- a/lib/workers/repository/init/config.ts +++ b/lib/workers/repository/init/config.ts @@ -203,7 +203,6 @@ export async function mergeRenovateConfig( 'Ignoring any .npmrc files in repository due to configured npmrc' ); npmApi.setNpmrc(resolvedConfig.npmrc); - resolvedConfig.ignoreNpmrcFile = true; } // istanbul ignore if if (resolvedConfig.hostRules) {