UNPKG

nx

Version:

The core Nx plugin contains the core functionality of Nx like the project graph, nx commands and task orchestration.

150 lines (149 loc) 6.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.onlyDefaultRunnerIsUsed = onlyDefaultRunnerIsUsed; exports.connectToNxCloudIfExplicitlyAsked = connectToNxCloudIfExplicitlyAsked; exports.connectWorkspaceToCloud = connectWorkspaceToCloud; exports.connectToNxCloudCommand = connectToNxCloudCommand; exports.connectExistingRepoToNxCloudPrompt = connectExistingRepoToNxCloudPrompt; exports.connectToNxCloudWithPrompt = connectToNxCloudWithPrompt; const output_1 = require("../../utils/output"); const configuration_1 = require("../../config/configuration"); const tree_1 = require("../../generators/tree"); const connect_to_nx_cloud_1 = require("../../nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud"); const url_shorten_1 = require("../../nx-cloud/utilities/url-shorten"); const nx_cloud_utils_1 = require("../../utils/nx-cloud-utils"); const child_process_1 = require("../../utils/child-process"); const ab_testing_1 = require("../../utils/ab-testing"); const versions_1 = require("../../utils/versions"); const workspace_root_1 = require("../../utils/workspace-root"); const chalk = require("chalk"); const ora = require("ora"); const open = require("open"); function onlyDefaultRunnerIsUsed(nxJson) { const defaultRunner = nxJson.tasksRunnerOptions?.default?.runner; if (!defaultRunner) { // No tasks runner options OR no default runner defined: // - If access token defined, uses cloud runner // - If no access token defined, uses default return (!(nxJson.nxCloudAccessToken ?? process.env.NX_CLOUD_ACCESS_TOKEN) && !nxJson.nxCloudId); } return defaultRunner === 'nx/tasks-runners/default'; } async function connectToNxCloudIfExplicitlyAsked(opts) { if (opts['cloud'] === true) { const nxJson = (0, configuration_1.readNxJson)(); if (!onlyDefaultRunnerIsUsed(nxJson)) return; output_1.output.log({ title: '--cloud requires the workspace to be connected to Nx Cloud.', }); (0, child_process_1.runNxSync)(`connect-to-nx-cloud`, { stdio: [0, 1, 2], }); output_1.output.success({ title: 'Your workspace has been successfully connected to Nx Cloud.', }); process.exit(0); } } async function connectWorkspaceToCloud(options, directory = workspace_root_1.workspaceRoot) { const tree = new tree_1.FsTree(directory, false, 'connect-to-nx-cloud'); const accessToken = await (0, connect_to_nx_cloud_1.connectToNxCloud)(tree, options); tree.lock(); (0, tree_1.flushChanges)(directory, tree.listChanges()); return accessToken; } async function connectToNxCloudCommand(options, command) { const nxJson = (0, configuration_1.readNxJson)(); const installationSource = process.env.NX_CONSOLE ? 'nx-console' : 'nx-connect'; if ((0, nx_cloud_utils_1.isNxCloudUsed)(nxJson)) { const token = process.env.NX_CLOUD_ACCESS_TOKEN || nxJson.nxCloudAccessToken || nxJson.nxCloudId; if (!token) { throw new Error(`Unable to authenticate. If you are connecting to Nx Cloud locally, set Nx Cloud ID in nx.json. If you are connecting in a CI context, either define accessToken in nx.json or set the NX_CLOUD_ACCESS_TOKEN env variable.`); } const connectCloudUrl = await (0, url_shorten_1.createNxCloudOnboardingURL)(installationSource, token, options?.generateToken !== true); output_1.output.log({ title: '✔ This workspace already has Nx Cloud set up', bodyLines: [ 'If you have not done so already, connect your workspace to your Nx Cloud account with the following URL:', '', `${connectCloudUrl}`, ], }); return false; } const token = await connectWorkspaceToCloud({ generateToken: options?.generateToken, installationSource: command ?? installationSource, }); const connectCloudUrl = await (0, url_shorten_1.createNxCloudOnboardingURL)('nx-connect', token, options?.generateToken !== true); try { const cloudConnectSpinner = ora(`Opening Nx Cloud ${connectCloudUrl} in your browser to connect your workspace.`).start(); await sleep(2000); await open(connectCloudUrl); cloudConnectSpinner.succeed(); } catch (e) { output_1.output.note({ title: `Your Nx Cloud workspace is ready.`, bodyLines: [ `To claim it, connect it to your Nx Cloud account:`, `- Go to the following URL to connect your workspace to Nx Cloud:`, '', `${connectCloudUrl}`, ], }); } return true; } function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } async function connectExistingRepoToNxCloudPrompt(command = 'init', key = 'setupNxCloud') { const res = await nxCloudPrompt(key).then((value) => value === 'yes'); await (0, ab_testing_1.recordStat)({ command, nxVersion: versions_1.nxVersion, useCloud: res, meta: ab_testing_1.messages.codeOfSelectedPromptMessage(key), }); return res; } async function connectToNxCloudWithPrompt(command) { const setNxCloud = await nxCloudPrompt('setupNxCloud'); const useCloud = setNxCloud === 'yes' ? await connectToNxCloudCommand({ generateToken: false }, command) : false; await (0, ab_testing_1.recordStat)({ command, nxVersion: versions_1.nxVersion, useCloud, meta: ab_testing_1.messages.codeOfSelectedPromptMessage('setupNxCloud'), }); } async function nxCloudPrompt(key) { const { message, choices, initial, footer, hint } = ab_testing_1.messages.getPrompt(key); const promptConfig = { name: 'NxCloud', message, type: 'autocomplete', choices, initial, }; // meeroslav: types in enquirer are not up to date if (footer) { promptConfig.footer = () => chalk.dim(footer); } if (hint) { promptConfig.hint = () => chalk.dim(hint); } return await (await Promise.resolve().then(() => require('enquirer'))) .prompt([promptConfig]) .then((a) => { return a.NxCloud; }); }