From 0f1f9aac43e1c5d70757ec90ee0c019c83e996de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20M=C3=B6gelin?= Date: Thu, 23 Feb 2023 17:58:56 +0100 Subject: [PATCH 1/3] feat(rush-lib): Support --peer flag for rush add command --- .../rush-lib/src/cli/actions/AddAction.ts | 7 +++++++ .../rush-lib/src/logic/PackageJsonUpdater.ts | 21 ++++++++++++++----- .../src/logic/PackageJsonUpdaterTypes.ts | 4 ++++ libraries/rush-lib/src/npm-check-typings.d.ts | 1 + 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/libraries/rush-lib/src/cli/actions/AddAction.ts b/libraries/rush-lib/src/cli/actions/AddAction.ts index 81c84f081b..532e19d261 100644 --- a/libraries/rush-lib/src/cli/actions/AddAction.ts +++ b/libraries/rush-lib/src/cli/actions/AddAction.ts @@ -20,6 +20,7 @@ export class AddAction extends BaseAddAndRemoveAction { private readonly _exactFlag: CommandLineFlagParameter; private readonly _caretFlag: CommandLineFlagParameter; private readonly _devDependencyFlag: CommandLineFlagParameter; + private readonly _peerDependencyFlag: CommandLineFlagParameter; private readonly _makeConsistentFlag: CommandLineFlagParameter; public constructor(parser: RushCommandLineParser) { @@ -68,6 +69,11 @@ export class AddAction extends BaseAddAndRemoveAction { description: 'If specified, the package will be added to the "devDependencies" section of the package.json' }); + this._peerDependencyFlag = this.defineFlagParameter({ + parameterLongName: '--peer', + description: + 'If specified, the package will be added to the "peerDependencies" section of the package.json' + }); this._makeConsistentFlag = this.defineFlagParameter({ parameterLongName: '--make-consistent', parameterShortName: '-m', @@ -147,6 +153,7 @@ export class AddAction extends BaseAddAndRemoveAction { projects: projects, packagesToUpdate: packagesToAdd, devDependency: this._devDependencyFlag.value, + peerDependency: this._peerDependencyFlag.value, updateOtherPackages: this._makeConsistentFlag.value, skipUpdate: this._skipUpdateFlag.value, debugInstall: this.parser.isDebug, diff --git a/libraries/rush-lib/src/logic/PackageJsonUpdater.ts b/libraries/rush-lib/src/logic/PackageJsonUpdater.ts index 1f1b29aa1b..0fe3147694 100644 --- a/libraries/rush-lib/src/logic/PackageJsonUpdater.ts +++ b/libraries/rush-lib/src/logic/PackageJsonUpdater.ts @@ -132,8 +132,15 @@ export class PackageJsonUpdater { const dependenciesToUpdate: Record = {}; const devDependenciesToUpdate: Record = {}; - - for (const { moduleName, latest: latestVersion, packageJson, devDependency } of packagesToAdd) { + const peerDependenciesToUpdate: Record = {}; + + for (const { + moduleName, + latest: latestVersion, + packageJson, + devDependency, + peerDependency + } of packagesToAdd) { const inferredRangeStyle: SemVerStyle = this._cheaplyDetectSemVerRangeStyle(packageJson); const implicitlyPreferredVersion: string | undefined = implicitlyPreferredVersionByPackageName.get(moduleName); @@ -152,6 +159,8 @@ export class PackageJsonUpdater { if (devDependency) { devDependenciesToUpdate[moduleName] = version; + } else if (peerDependency) { + peerDependenciesToUpdate[moduleName] = version; } else { dependenciesToUpdate[moduleName] = version; } @@ -183,7 +192,8 @@ export class PackageJsonUpdater { const allPackageUpdates: Map = new Map(); const allDependenciesToUpdate: [string, string][] = [ ...Object.entries(dependenciesToUpdate), - ...Object.entries(devDependenciesToUpdate) + ...Object.entries(devDependenciesToUpdate), + ...Object.entries(peerDependenciesToUpdate) ]; for (const project of projects) { @@ -318,7 +328,8 @@ export class PackageJsonUpdater { private async _doRushAddAsync( options: IPackageJsonUpdaterRushAddOptions ): Promise { - const { projects, packagesToUpdate, devDependency, updateOtherPackages, variant } = options; + const { projects, packagesToUpdate, devDependency, peerDependency, updateOtherPackages, variant } = + options; const { DependencyAnalyzer } = await import( /* webpackChunkName: 'DependencyAnalyzer' */ @@ -384,7 +395,7 @@ export class PackageJsonUpdater { const currentProjectUpdate: IUpdateProjectOptions = { project: new VersionMismatchFinderProject(project), dependenciesToAddOrUpdateOrRemove: dependenciesToAddOrUpdate, - dependencyType: devDependency ? DependencyType.Dev : undefined + dependencyType: devDependency ? DependencyType.Dev : peerDependency ? DependencyType.Peer : undefined }; this.updateProject(currentProjectUpdate); diff --git a/libraries/rush-lib/src/logic/PackageJsonUpdaterTypes.ts b/libraries/rush-lib/src/logic/PackageJsonUpdaterTypes.ts index a9807bcb1b..d57aa82f73 100644 --- a/libraries/rush-lib/src/logic/PackageJsonUpdaterTypes.ts +++ b/libraries/rush-lib/src/logic/PackageJsonUpdaterTypes.ts @@ -67,6 +67,10 @@ export interface IPackageJsonUpdaterRushAddOptions extends IPackageJsonUpdaterRu * Whether or not this dependency should be added as a devDependency or a regular dependency. */ devDependency: boolean; + /** + * Whether or not this dependency should be added as a peerDependency or a regular dependency. + */ + peerDependency: boolean; /** * If specified, other packages that use this dependency will also have their package.json's updated. */ diff --git a/libraries/rush-lib/src/npm-check-typings.d.ts b/libraries/rush-lib/src/npm-check-typings.d.ts index fe2a2115c5..5c25d1d8c9 100644 --- a/libraries/rush-lib/src/npm-check-typings.d.ts +++ b/libraries/rush-lib/src/npm-check-typings.d.ts @@ -31,6 +31,7 @@ declare module 'npm-check' { packageWanted: string; // Requested version from the package.json. packageJson: string; // Version or range requested in the parent package.json. devDependency: boolean; // Is this a devDependency? + peerDependency: boolean; // Is this a peerDependency? usedInScripts: undefined | string[]; // Array of `scripts` in package.json that use this module. mismatch: boolean; // Does the version installed not match the range in package.json? semverValid: string; // Is the installed version valid semver? From c35e4583e59d20815f612bc21375e098c446c4ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20M=C3=B6gelin?= Date: Thu, 23 Feb 2023 18:05:44 +0100 Subject: [PATCH 2/3] Update changelogs --- .../changes/@microsoft/rush/main_2023-02-23-17-02.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 common/changes/@microsoft/rush/main_2023-02-23-17-02.json diff --git a/common/changes/@microsoft/rush/main_2023-02-23-17-02.json b/common/changes/@microsoft/rush/main_2023-02-23-17-02.json new file mode 100644 index 0000000000..b56861bf83 --- /dev/null +++ b/common/changes/@microsoft/rush/main_2023-02-23-17-02.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@microsoft/rush", + "comment": "Add `--peer` flag to `rush add` command to add peerDependencies", + "type": "none" + } + ], + "packageName": "@microsoft/rush" +} From a63e8022e524900880d6825fdf9a13bb107ca14b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20M=C3=B6gelin?= Date: Fri, 24 Feb 2023 08:45:12 +0100 Subject: [PATCH 3/3] test(rush-lib): Update snapshot for new rush add "--peer" flag --- .../src/cli/test/__snapshots__/CommandLineHelp.test.ts.snap | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/rush-lib/src/cli/test/__snapshots__/CommandLineHelp.test.ts.snap b/libraries/rush-lib/src/cli/test/__snapshots__/CommandLineHelp.test.ts.snap index cf1c6349f9..39c2b0dc4a 100644 --- a/libraries/rush-lib/src/cli/test/__snapshots__/CommandLineHelp.test.ts.snap +++ b/libraries/rush-lib/src/cli/test/__snapshots__/CommandLineHelp.test.ts.snap @@ -77,7 +77,9 @@ Optional arguments: `; exports[`CommandLineHelp prints the help for each action: add 1`] = ` -"usage: rush add [-h] [-s] -p PACKAGE [--exact] [--caret] [--dev] [-m] [--all] +"usage: rush add [-h] [-s] -p PACKAGE [--exact] [--caret] [--dev] [--peer] [-m] + [--all] + Adds specified package(s) to the dependencies of the current project (as determined by the current working directory) and then runs \\"rush update\\". If @@ -111,6 +113,8 @@ Optional arguments: specifier (\\"^\\"). --dev If specified, the package will be added to the \\"devDependencies\\" section of the package.json + --peer If specified, the package will be added to the + \\"peerDependencies\\" section of the package.json -m, --make-consistent If specified, other packages with this dependency will have their package.json files updated to use the