Skip to content

Commit

Permalink
feat: updateInternalDeps (#8809)
Browse files Browse the repository at this point in the history
  • Loading branch information
rarkins committed Feb 22, 2021
1 parent c2029ec commit 9171e71
Show file tree
Hide file tree
Showing 9 changed files with 156 additions and 23 deletions.
7 changes: 7 additions & 0 deletions docs/usage/configuration-options.md
Original file line number Diff line number Diff line change
Expand Up @@ -2062,6 +2062,13 @@ Please see the above link for valid timezone names.

If enabled emoji shortcodes (`:warning:`) are replaced with their unicode equivalents (`⚠️`)

## updateInternalDeps

Renovate defaults to skipping any internal package dependencies within monorepos.
In such case dependency versions won't be updated by Renovate.

To opt in to letting Renovate update internal package versions normally, set this configuration option to true.

## updateLockFiles

## updateNotScheduled
Expand Down
7 changes: 7 additions & 0 deletions lib/config/definitions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -767,6 +767,13 @@ const options: RenovateOptions[] = [
stage: 'package',
mergeable: true,
},
{
name: 'updateInternalDeps',
description:
'Whether to update internal dep versions in a monorepo (Lerna or Yarn Workspaces).',
type: 'boolean',
stage: 'package',
},
{
name: 'packageRules',
description: 'Rules for matching package names.',
Expand Down
2 changes: 1 addition & 1 deletion lib/manager/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export interface ExtractConfig extends ManagerConfig {
yarnrc?: string;
skipInstalls?: boolean;
versioning?: string;
updateInternalDeps?: boolean;
}

export interface CustomExtractConfig extends ExtractConfig {
Expand Down Expand Up @@ -81,7 +82,6 @@ export interface PackageFile<T = Record<string, any>>
extends NpmLockFiles,
ManagerData<T> {
hasYarnWorkspaces?: boolean;
internalPackages?: string[]; // TODO: remove
constraints?: Record<string, string>;
datasource?: string;
registryUrls?: string[];
Expand Down
56 changes: 56 additions & 0 deletions lib/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap
Original file line number Diff line number Diff line change
@@ -1,5 +1,61 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`manager/npm/extract .extractPackageFile() updates internal packages 1`] = `
Array [
Object {
"deps": Array [
Object {
"depName": "@org/a",
},
Object {
"depName": "@org/b",
},
Object {
"depName": "@org/c",
},
Object {
"depName": "foo",
},
],
"lernaDir": ".",
"lernaPackages": Array [
"packages/*",
],
"packageFile": "package.json",
"packages": Array [
"packages/*",
],
},
Object {
"deps": Array [
Object {
"depName": "@org/b",
},
Object {
"depName": "@org/c",
},
Object {
"depName": "bar",
},
],
"lernaClient": undefined,
"lernaDir": ".",
"npmLock": undefined,
"packageFile": "packages/a/package.json",
"packageJsonName": "@org/a",
"yarnLock": undefined,
},
Object {
"lernaClient": undefined,
"lernaDir": ".",
"npmLock": undefined,
"packageFile": "packages/b/package.json",
"packageJsonName": "@org/b",
"yarnLock": undefined,
},
]
`;

exports[`manager/npm/extract .extractPackageFile() uses lerna package settings 1`] = `
Array [
Object {
Expand Down
2 changes: 1 addition & 1 deletion lib/manager/npm/extract/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ describe('manager/npm/extract', () => {
});
describe('.postExtract()', () => {
it('runs', async () => {
await expect(npmExtract.postExtract([])).resolves.not.toThrow();
await expect(npmExtract.postExtract([], false)).resolves.not.toThrow();
});
});
});
9 changes: 6 additions & 3 deletions lib/manager/npm/extract/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -375,8 +375,11 @@ export async function extractPackageFile(
};
}

export async function postExtract(packageFiles: PackageFile[]): Promise<void> {
detectMonorepos(packageFiles);
export async function postExtract(
packageFiles: PackageFile[],
updateInternalDeps: boolean
): Promise<void> {
detectMonorepos(packageFiles, updateInternalDeps);
await getLockedVersions(packageFiles);
}

Expand All @@ -400,6 +403,6 @@ export async function extractAllPackageFiles(
logger.debug({ packageFile }, 'packageFile has no content');
}
}
await postExtract(npmFiles);
await postExtract(npmFiles, config.updateInternalDeps);
return npmFiles;
}
64 changes: 60 additions & 4 deletions lib/manager/npm/extract/monorepo.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,66 @@ describe('manager/npm/extract', () => {
packageFile: 'packages/b/package.json',
packageJsonName: '@org/b',
},
];
detectMonorepos(packageFiles);
] as any;
detectMonorepos(packageFiles, false);
expect(packageFiles).toMatchSnapshot();
expect(packageFiles[1].lernaDir).toEqual('.');
expect(
packageFiles.some((packageFile) =>
packageFile.deps?.some((dep) => dep.skipReason)
)
).toBe(true);
});
it('updates internal packages', () => {
const packageFiles = [
{
packageFile: 'package.json',
lernaDir: '.',
lernaPackages: ['packages/*'],
packages: ['packages/*'],
deps: [
{
depName: '@org/a',
},
{
depName: '@org/b',
},
{
depName: '@org/c',
},
{
depName: 'foo',
},
],
},
{
packageFile: 'packages/a/package.json',
packageJsonName: '@org/a',
deps: [
{
depName: '@org/b',
},
{
depName: '@org/c',
},
{
depName: 'bar',
},
],
},
{
packageFile: 'packages/b/package.json',
packageJsonName: '@org/b',
},
] as any;
detectMonorepos(packageFiles, true);
expect(packageFiles).toMatchSnapshot();
expect(packageFiles[1].lernaDir).toEqual('.');
expect(
packageFiles.some((packageFile) =>
packageFile.deps?.some((dep) => dep.skipReason)
)
).toBe(false);
});
it('uses yarn workspaces package settings with lerna', () => {
const packageFiles = [
Expand All @@ -66,7 +122,7 @@ describe('manager/npm/extract', () => {
packageJsonName: '@org/b',
},
];
detectMonorepos(packageFiles);
detectMonorepos(packageFiles, false);
expect(packageFiles).toMatchSnapshot();
expect(packageFiles[1].lernaDir).toEqual('.');
});
Expand All @@ -86,7 +142,7 @@ describe('manager/npm/extract', () => {
packageJsonName: '@org/b',
},
];
detectMonorepos(packageFiles);
detectMonorepos(packageFiles, false);
expect(packageFiles).toMatchSnapshot();
});
});
Expand Down
29 changes: 18 additions & 11 deletions lib/manager/npm/extract/monorepo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ function matchesAnyPattern(val: string, patterns: string[]): boolean {
return res;
}

export function detectMonorepos(packageFiles: Partial<PackageFile>[]): void {
export function detectMonorepos(
packageFiles: Partial<PackageFile>[],
updateInternalDeps: boolean
): void {
logger.debug('Detecting Lerna and Yarn Workspaces');
for (const p of packageFiles) {
const {
Expand Down Expand Up @@ -45,11 +48,13 @@ export function detectMonorepos(packageFiles: Partial<PackageFile>[]): void {
const internalPackageNames = internalPackageFiles
.map((sp) => sp.packageJsonName)
.filter(Boolean);
p.deps?.forEach((dep) => {
if (internalPackageNames.includes(dep.depName)) {
dep.skipReason = SkipReason.InternalPackage; // eslint-disable-line no-param-reassign
}
});
if (!updateInternalDeps) {
p.deps?.forEach((dep) => {
if (internalPackageNames.includes(dep.depName)) {
dep.skipReason = SkipReason.InternalPackage; // eslint-disable-line no-param-reassign
}
});
}
for (const subPackage of internalPackageFiles) {
subPackage.lernaDir = lernaDir;
subPackage.lernaClient = lernaClient;
Expand All @@ -58,11 +63,13 @@ export function detectMonorepos(packageFiles: Partial<PackageFile>[]): void {
if (subPackage.yarnLock) {
subPackage.hasYarnWorkspaces = !!yarnWorkspacesPackages;
}
subPackage.deps?.forEach((dep) => {
if (internalPackageNames.includes(dep.depName)) {
dep.skipReason = SkipReason.InternalPackage; // eslint-disable-line no-param-reassign
}
});
if (!updateInternalDeps) {
subPackage.deps?.forEach((dep) => {
if (internalPackageNames.includes(dep.depName)) {
dep.skipReason = SkipReason.InternalPackage; // eslint-disable-line no-param-reassign
}
});
}
}
}
}
Expand Down
3 changes: 0 additions & 3 deletions lib/workers/repository/process/fetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,6 @@ async function fetchDepUpdates(
if (depConfig.ignoreDeps.includes(depName)) {
logger.debug({ dependency: dep.depName }, 'Dependency is ignored');
dep.skipReason = SkipReason.Ignored;
} else if (depConfig.internalPackages?.includes(depName)) {
// istanbul ignore next
dep.skipReason = SkipReason.InternalPackage;
} else if (depConfig.enabled === false) {
logger.debug({ dependency: dep.depName }, 'Dependency is disabled');
dep.skipReason = SkipReason.Disabled;
Expand Down

0 comments on commit 9171e71

Please sign in to comment.