From 743df6ebaf823334ce9ba1d2380cf871e6696667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leosvel=20P=C3=A9rez=20Espinosa?= Date: Fri, 5 May 2023 11:33:27 +0100 Subject: [PATCH] feat(core): log a note after an interactive migration run where package updates were opted out --- packages/nx/src/command-line/migrate.spec.ts | 10 ++++++ packages/nx/src/command-line/migrate.ts | 35 +++++++++++++++++--- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/packages/nx/src/command-line/migrate.spec.ts b/packages/nx/src/command-line/migrate.spec.ts index 680c8fe799a5ab..9ed861c018ffcb 100644 --- a/packages/nx/src/command-line/migrate.spec.ts +++ b/packages/nx/src/command-line/migrate.spec.ts @@ -426,6 +426,7 @@ describe('Migration', () => { }, '@my-company/lib-4': { version: '2.0.1', addToPackageJson: false }, }, + minVersionWithSkippedUpdates: undefined, }); }); @@ -503,6 +504,7 @@ describe('Migration', () => { '@my-company/lib-1': { version: '3.0.0', addToPackageJson: false }, '@my-company/lib-2': { version: '3.0.0', addToPackageJson: false }, }, + minVersionWithSkippedUpdates: undefined, }); }); @@ -635,6 +637,7 @@ describe('Migration', () => { child2: { version: '3.0.0', addToPackageJson: false }, child3: { version: '3.0.0', addToPackageJson: false }, }, + minVersionWithSkippedUpdates: undefined, }); expect(enquirer.prompt).toHaveBeenCalledWith( expect.arrayContaining([ @@ -693,6 +696,7 @@ describe('Migration', () => { mypackage: { version: '2.0.0', addToPackageJson: false }, child1: { version: '3.0.0', addToPackageJson: false }, }, + minVersionWithSkippedUpdates: '2.0.0', }); expect(enquirer.prompt).toHaveBeenCalled(); }); @@ -749,6 +753,7 @@ describe('Migration', () => { child2: { version: '3.0.0', addToPackageJson: false }, child3: { version: '3.0.0', addToPackageJson: false }, }, + minVersionWithSkippedUpdates: undefined, }); expect(enquirer.prompt).not.toHaveBeenCalled(); }); @@ -831,6 +836,7 @@ describe('Migration', () => { child2: { version: '3.0.0', addToPackageJson: false }, child3: { version: '3.0.0', addToPackageJson: false }, }, + minVersionWithSkippedUpdates: undefined, }); }); @@ -913,6 +919,7 @@ describe('Migration', () => { pkg1: { version: '2.0.0', addToPackageJson: false }, pkg2: { version: '2.0.0', addToPackageJson: false }, }, + minVersionWithSkippedUpdates: undefined, }); }); @@ -961,6 +968,7 @@ describe('Migration', () => { mypackage: { version: '2.0.0', addToPackageJson: false }, child1: { version: '3.0.0', addToPackageJson: false }, }, + minVersionWithSkippedUpdates: undefined, }); expect(enquirer.prompt).toHaveBeenCalledWith( expect.arrayContaining([ @@ -1013,6 +1021,7 @@ describe('Migration', () => { packageUpdates: { mypackage: { version: '2.0.0', addToPackageJson: false }, }, + minVersionWithSkippedUpdates: undefined, }); expect(enquirer.prompt).not.toHaveBeenCalled(); }); @@ -1257,6 +1266,7 @@ describe('Migration', () => { packageUpdates: { parent: { version: '2.0.0', addToPackageJson: false }, }, + minVersionWithSkippedUpdates: '2.0.0', }); expect(enquirer.prompt).toHaveBeenCalled(); }); diff --git a/packages/nx/src/command-line/migrate.ts b/packages/nx/src/command-line/migrate.ts index a30c981bad0ec4..6d08c6a4307f00 100644 --- a/packages/nx/src/command-line/migrate.ts +++ b/packages/nx/src/command-line/migrate.ts @@ -137,6 +137,7 @@ export class Migrator { private readonly collectedVersions: Record = {}; private readonly promptAnswers: Record = {}; private readonly nxInstallation: NxJsonConfiguration['installation'] | null; + private minVersionWithSkippedUpdates: string | undefined; constructor(opts: MigratorOptions) { this.packageJson = opts.packageJson; @@ -156,7 +157,11 @@ export class Migrator { }); const migrations = await this.createMigrateJson(); - return { packageUpdates: this.packageUpdates, migrations }; + return { + packageUpdates: this.packageUpdates, + migrations, + minVersionWithSkippedUpdates: this.minVersionWithSkippedUpdates, + }; } private async createMigrateJson() { @@ -567,6 +572,15 @@ export class Migrator { }, ]).then(({ shouldApply }: { shouldApply: boolean }) => { this.promptAnswers[promptKey] = shouldApply; + + if ( + !shouldApply && + (!this.minVersionWithSkippedUpdates || + lt(packageUpdate.version, this.minVersionWithSkippedUpdates)) + ) { + this.minVersionWithSkippedUpdates = packageUpdate.version; + } + return shouldApply; }); } @@ -1232,10 +1246,8 @@ async function generateMigrationsJsonAndUpdatePackageJson( excludeAppliedMigrations: opts.excludeAppliedMigrations, }); - const { migrations, packageUpdates } = await migrator.migrate( - opts.targetPackage, - opts.targetVersion - ); + const { migrations, packageUpdates, minVersionWithSkippedUpdates } = + await migrator.migrate(opts.targetPackage, opts.targetVersion); updatePackageJson(root, packageUpdates); await updateInstallationDetails(root, packageUpdates); @@ -1275,6 +1287,19 @@ async function generateMigrationsJsonAndUpdatePackageJson( : []), ], }); + + if (opts.interactive && minVersionWithSkippedUpdates) { + output.note({ + title: 'Opted out package updates', + bodyLines: [ + 'Based on this migration run, to later apply the package updates you opted out you can run:', + `nx migrate ${opts.targetPackage}@${opts.targetVersion} --from ${minVersionWithSkippedUpdates} --exclude-applied-migrations`, + `The version passed in the '--from' flag above is the version you'd need to use to get those package updates.`, + `Please keep track of that version so you don't miss the package updates you opted out of during this migration run and can apply them later.`, + `If you haven't applied other package updates you opted out of in previous migrations, use the oldest version you're keeping track of.`, + ], + }); + } } catch (e) { output.error({ title: `The migrate command failed.`,