From a162bfb420c2421319bdb7abdcefe7ecdc32fecb Mon Sep 17 00:00:00 2001 From: Craigory Coppola Date: Thu, 14 Apr 2022 17:17:39 -0400 Subject: [PATCH] feat(core): prompt users to connect to nx cloud when upgrading major versions (#9849) --- .../src/command-line/connect-to-nx-cloud.ts | 10 +++-- packages/nx/src/command-line/migrate.ts | 37 +++++++++++++++++-- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/packages/nx/src/command-line/connect-to-nx-cloud.ts b/packages/nx/src/command-line/connect-to-nx-cloud.ts index cc00d199692b3..56798b077648f 100644 --- a/packages/nx/src/command-line/connect-to-nx-cloud.ts +++ b/packages/nx/src/command-line/connect-to-nx-cloud.ts @@ -29,7 +29,9 @@ export async function connectToNxCloudUsingScan(scan: boolean): Promise { } } -export async function connectToNxCloudCommand(): Promise { +export async function connectToNxCloudCommand( + promptOverride?: string +): Promise { const nxJson = readNxJson(); const nxCloudUsed = Object.values(nxJson.tasksRunnerOptions).find( (r) => r.runner == '@nrwl/nx-cloud' @@ -50,14 +52,16 @@ export async function connectToNxCloudCommand(): Promise { }); } -async function connectToNxCloudPrompt() { +async function connectToNxCloudPrompt(prompt?: string) { return await ( await import('enquirer') ) .prompt([ { name: 'NxCloud', - message: `Connect to Nx Cloud? (It's free and doesn't require registration.)`, + message: + prompt ?? + `Connect to Nx Cloud? (It's free and doesn't require registration.)`, type: 'select', choices: [ { diff --git a/packages/nx/src/command-line/migrate.ts b/packages/nx/src/command-line/migrate.ts index 77cd6f7e14eb1..505ff9f1c7dbd 100644 --- a/packages/nx/src/command-line/migrate.ts +++ b/packages/nx/src/command-line/migrate.ts @@ -1,7 +1,7 @@ import { exec, execSync } from 'child_process'; import { remove } from 'fs-extra'; import { dirname, join } from 'path'; -import { gt, lt, lte } from 'semver'; +import { gt, lt, lte, major, valid } from 'semver'; import { promisify } from 'util'; import { MigrationsJson, @@ -29,6 +29,7 @@ import { resolvePackageVersionUsingRegistry, } from '../utils/package-manager'; import { handleErrors } from '../utils/params'; +import { connectToNxCloudCommand } from './connect-to-nx-cloud'; export interface ResolvedMigrationConfiguration extends MigrationsJson { packageGroup?: NxMigrationsConfiguration['packageGroup']; @@ -793,6 +794,19 @@ function updatePackageJson( }); } +async function isMigratingToNewMajor(from: string, to: string) { + from = normalizeVersion(from); + to = ['latest', 'next'].includes(to) ? to : normalizeVersion(to); + if (!valid(from)) { + from = await resolvePackageVersionUsingRegistry('nx', from); + } + if (!valid(to)) { + to = await resolvePackageVersionUsingRegistry('nx', to); + } + console.log({ from, to }); + return major(from) < major(to); +} + async function generateMigrationsJsonAndUpdatePackageJson( root: string, opts: { @@ -804,11 +818,28 @@ async function generateMigrationsJsonAndUpdatePackageJson( ) { const pmc = getPackageManagerCommand(); try { + let originalPackageJson = readJsonFile( + join(root, 'package.json') + ); + if ( + ['nx', '@nrwl/workspace'].includes(opts.targetPackage) && + (await isMigratingToNewMajor( + originalPackageJson.devDependencies?.['nx'] ?? + originalPackageJson.devDependencies?.['@nrwl/workspace'], + opts.targetVersion + )) + ) { + await connectToNxCloudCommand( + 'We noticed you are migrating to a new major version, but are not taking advantage of Nx Cloud. Nx Cloud can make your CI up to 10 times faster. Learn more about it here: nx.app. Would you like to add it?' + ); + originalPackageJson = readJsonFile( + join(root, 'package.json') + ); + } + logger.info(`Fetching meta data about packages.`); logger.info(`It may take a few minutes.`); - const originalPackageJson = readJsonFile(join(root, 'package.json')); - const migrator = new Migrator({ packageJson: originalPackageJson, versions: versions(root, opts.from),