diff --git a/docs/generated/cli/connect.md b/docs/generated/cli/connect.md index 247c3df195..98ad6ef555 100644 --- a/docs/generated/cli/connect.md +++ b/docs/generated/cli/connect.md @@ -17,12 +17,24 @@ Install `nx` globally to invoke the command directly using `nx`, or use `npx nx` ## Options +### generateToken + +Type: `boolean` + +Explicitly asks for a token to be created, do not override existing tokens from Nx Cloud + ### help Type: `boolean` Show help +### verbose + +Type: `boolean` + +Prints additional information about the commands (e.g., stack traces) + ### version Type: `boolean` diff --git a/docs/generated/packages/nx/documents/connect-to-nx-cloud.md b/docs/generated/packages/nx/documents/connect-to-nx-cloud.md index 247c3df195..98ad6ef555 100644 --- a/docs/generated/packages/nx/documents/connect-to-nx-cloud.md +++ b/docs/generated/packages/nx/documents/connect-to-nx-cloud.md @@ -17,12 +17,24 @@ Install `nx` globally to invoke the command directly using `nx`, or use `npx nx` ## Options +### generateToken + +Type: `boolean` + +Explicitly asks for a token to be created, do not override existing tokens from Nx Cloud + ### help Type: `boolean` Show help +### verbose + +Type: `boolean` + +Prints additional information about the commands (e.g., stack traces) + ### version Type: `boolean` diff --git a/docs/generated/packages/nx/generators/connect-to-nx-cloud.json b/docs/generated/packages/nx/generators/connect-to-nx-cloud.json index 7090a0a839..9afc2e1db9 100644 --- a/docs/generated/packages/nx/generators/connect-to-nx-cloud.json +++ b/docs/generated/packages/nx/generators/connect-to-nx-cloud.json @@ -24,6 +24,10 @@ "description": "Hide formatting logs", "x-priority": "internal" }, + "generateToken": { + "type": "boolean", + "description": "Explicitly asks for a token to be created, do not override existing tokens from Nx Cloud" + }, "github": { "type": "boolean", "description": "If the user will be using GitHub as their git hosting provider", diff --git a/packages/nx/src/command-line/connect/command-object.ts b/packages/nx/src/command-line/connect/command-object.ts index 6825f83201..31e0f5aaa9 100644 --- a/packages/nx/src/command-line/connect/command-object.ts +++ b/packages/nx/src/command-line/connect/command-object.ts @@ -1,14 +1,16 @@ -import { CommandModule } from 'yargs'; +import { Argv, CommandModule } from 'yargs'; import { linkToNxDevAndExamples } from '../yargs-utils/documentation'; import { nxVersion } from '../../utils/versions'; +import { withVerbose } from '../yargs-utils/shared-options'; export const yargsConnectCommand: CommandModule = { command: 'connect', aliases: ['connect-to-nx-cloud'], describe: `Connect workspace to Nx Cloud`, - builder: (yargs) => linkToNxDevAndExamples(yargs, 'connect-to-nx-cloud'), - handler: async () => { - await (await import('./connect-to-nx-cloud')).connectToNxCloudCommand(); + builder: (yargs) => + linkToNxDevAndExamples(withConnectOptions(yargs), 'connect-to-nx-cloud'), + handler: async (args: any) => { + await (await import('./connect-to-nx-cloud')).connectToNxCloudCommand(args); await ( await import('../../utils/ab-testing') ).recordStat({ @@ -20,6 +22,14 @@ export const yargsConnectCommand: CommandModule = { }, }; +function withConnectOptions(yargs: Argv) { + return withVerbose(yargs).option('generateToken', { + type: 'boolean', + description: + 'Explicitly asks for a token to be created, do not override existing tokens from Nx Cloud', + }); +} + export const yargsViewLogsCommand: CommandModule = { command: 'view-logs', describe: diff --git a/packages/nx/src/command-line/connect/connect-to-nx-cloud.ts b/packages/nx/src/command-line/connect/connect-to-nx-cloud.ts index a1c37c3947..67740c7542 100644 --- a/packages/nx/src/command-line/connect/connect-to-nx-cloud.ts +++ b/packages/nx/src/command-line/connect/connect-to-nx-cloud.ts @@ -70,6 +70,7 @@ export async function connectWorkspaceToCloud( } export async function connectToNxCloudCommand( + options: { generateToken?: boolean }, command?: string ): Promise { const nxJson = readNxJson(); @@ -90,7 +91,8 @@ export async function connectToNxCloudCommand( } const connectCloudUrl = await createNxCloudOnboardingURL( installationSource, - token + token, + options?.generateToken !== true ); output.log({ title: '✔ This workspace already has Nx Cloud set up', @@ -104,10 +106,15 @@ export async function connectToNxCloudCommand( return false; } const token = await connectWorkspaceToCloud({ + generateToken: options?.generateToken, installationSource: command ?? installationSource, }); - const connectCloudUrl = await createNxCloudOnboardingURL('nx-connect', token); + const connectCloudUrl = await createNxCloudOnboardingURL( + 'nx-connect', + token, + options?.generateToken !== true + ); try { const cloudConnectSpinner = ora( `Opening Nx Cloud ${connectCloudUrl} in your browser to connect your workspace.` @@ -153,7 +160,9 @@ export async function connectExistingRepoToNxCloudPrompt( export async function connectToNxCloudWithPrompt(command: string) { const setNxCloud = await nxCloudPrompt('setupNxCloud'); const useCloud = - setNxCloud === 'yes' ? await connectToNxCloudCommand(command) : false; + setNxCloud === 'yes' + ? await connectToNxCloudCommand({ generateToken: false }, command) + : false; await recordStat({ command, nxVersion, diff --git a/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.ts b/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.ts index 401d3543da..acf9da15f6 100644 --- a/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.ts +++ b/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.ts @@ -100,6 +100,7 @@ export interface ConnectToNxCloudOptions { hideFormatLogs?: boolean; github?: boolean; directory?: string; + generateToken?: boolean; } function addNxCloudIdToNxJson( @@ -129,42 +130,49 @@ export async function connectToNxCloud( tree: Tree, schema: ConnectToNxCloudOptions, nxJson = readNxJson(tree) -): Promise { +): Promise { schema.installationSource ??= 'user'; if (nxJson?.neverConnectToCloud) { printCloudConnectionDisabledMessage(); return null; - } else { - const usesGithub = schema.github ?? (await repoUsesGithub(schema.github)); - - let responseFromCreateNxCloudWorkspaceV2: - | { - nxCloudId: string; - } - | undefined; - - // do NOT create Nx Cloud token (createNxCloudWorkspace) - // if user is using github and is running nx-connect - if (!(usesGithub && schema.installationSource === 'nx-connect')) { - responseFromCreateNxCloudWorkspaceV2 = await createNxCloudWorkspaceV2( - getRootPackageName(tree), - schema.installationSource, - getNxInitDate() - ); - - addNxCloudIdToNxJson( - tree, - responseFromCreateNxCloudWorkspaceV2?.nxCloudId, - schema.directory - ); - - await formatChangedFilesWithPrettierIfAvailable(tree, { - silent: schema.hideFormatLogs, - }); - return responseFromCreateNxCloudWorkspaceV2.nxCloudId; - } } + const isGitHubDetected = + schema.github ?? (await repoUsesGithub(schema.github)); + + let responseFromCreateNxCloudWorkspaceV2: + | { + nxCloudId: string; + } + | undefined; + + /** + * Do not create an Nx Cloud token if the user is using GitHub and + * is running `nx-connect` AND `token` is undefined (override) + */ + if ( + !schema.generateToken && + isGitHubDetected && + schema.installationSource === 'nx-connect' + ) + return null; + + responseFromCreateNxCloudWorkspaceV2 = await createNxCloudWorkspaceV2( + getRootPackageName(tree), + schema.installationSource, + getNxInitDate() + ); + + addNxCloudIdToNxJson( + tree, + responseFromCreateNxCloudWorkspaceV2?.nxCloudId, + schema.directory + ); + + await formatChangedFilesWithPrettierIfAvailable(tree, { + silent: schema.hideFormatLogs, + }); + return responseFromCreateNxCloudWorkspaceV2.nxCloudId; } async function connectToNxCloudGenerator( diff --git a/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/schema.json b/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/schema.json index e6c75887ef..d03ff05d39 100644 --- a/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/schema.json +++ b/packages/nx/src/nx-cloud/generators/connect-to-nx-cloud/schema.json @@ -21,6 +21,10 @@ "description": "Hide formatting logs", "x-priority": "internal" }, + "generateToken": { + "type": "boolean", + "description": "Explicitly asks for a token to be created, do not override existing tokens from Nx Cloud" + }, "github": { "type": "boolean", "description": "If the user will be using GitHub as their git hosting provider",