UNPKG

create-nx-workspace

Version:

Smart Repos · Fast Builds

213 lines (212 loc) • 7.53 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.determineNxCloud = determineNxCloud; exports.determineNxCloudV2 = determineNxCloudV2; exports.determineIfGitHubWillBeUsed = determineIfGitHubWillBeUsed; exports.determineTemplate = determineTemplate; exports.determineAiAgents = determineAiAgents; exports.determineDefaultBase = determineDefaultBase; exports.determinePackageManager = determinePackageManager; const enquirer = require("enquirer"); const chalk = require("chalk"); const ab_testing_1 = require("../utils/nx/ab-testing"); const default_base_1 = require("../utils/git/default-base"); const git_1 = require("../utils/git/git"); const package_manager_1 = require("../utils/package-manager"); const string_utils_1 = require("../utils/string-utils"); const is_ci_1 = require("../utils/ci/is-ci"); const create_workspace_options_1 = require("../create-workspace-options"); const error_utils_1 = require("../utils/error-utils"); async function determineNxCloud(parsedArgs) { if (parsedArgs.nxCloud) { return parsedArgs.nxCloud; } else if (!parsedArgs.interactive || (0, is_ci_1.isCI)()) { return 'skip'; } else { return nxCloudPrompt('setupCI'); } } async function determineNxCloudV2(parsedArgs) { // Provided via flag if (parsedArgs.nxCloud) { return parsedArgs.nxCloud === 'skip' ? 'skip' : 'github'; } // Non-interactive mode if (!parsedArgs.interactive || (0, is_ci_1.isCI)()) { return 'skip'; } // Show simplified prompt const { message, choices, initial, footer, hint } = ab_testing_1.messages.getPrompt('setupNxCloudV2'); const promptConfig = { name: 'nxCloud', message, type: 'autocomplete', choices, initial, }; // types in enquirer are not up to date if (footer) { promptConfig.footer = () => footer; } if (hint) { promptConfig.hint = () => hint; } const result = await enquirer.prompt([ promptConfig, ]); return result.nxCloud; } async function determineIfGitHubWillBeUsed(parsedArgs) { if (parsedArgs.nxCloud === 'yes' || parsedArgs.nxCloud === 'circleci') { if (parsedArgs?.useGitHub) return true; const reply = await enquirer.prompt([ { name: 'github', message: 'Will you be using GitHub as your git hosting provider?', type: 'autocomplete', choices: [{ name: 'Yes' }, { name: 'No' }], initial: 0, }, ]); return reply.github === 'Yes'; } return false; } async function nxCloudPrompt(key) { const { message, choices, initial, fallback, 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 enquirer.prompt([promptConfig]).then((a) => { if (fallback && a.NxCloud === fallback.value) { return nxCloudPrompt(fallback.key); } return a.NxCloud; }); } async function determineTemplate(parsedArgs) { if (parsedArgs.template) return parsedArgs.template; if (parsedArgs.preset) return 'custom'; if (!parsedArgs.interactive || (0, is_ci_1.isCI)()) return 'custom'; // Docs generation needs preset flow to document all presets if (process.env.NX_GENERATE_DOCS_PROCESS === 'true') return 'custom'; // Template flow requires git for cloning - fall back to custom preset if git is not available if (!(0, git_1.isGitAvailable)()) return 'custom'; const { template } = await enquirer.prompt([ { name: 'template', message: 'Which starter do you want to use?', type: 'autocomplete', choices: [ { name: 'nrwl/empty-template', message: 'Minimal (empty monorepo without projects)', }, { name: 'nrwl/react-template', message: 'React (fullstack monorepo with React and Express)', }, { name: 'nrwl/angular-template', message: 'Angular (fullstack monorepo with Angular and Express)', }, { name: 'nrwl/typescript-template', message: 'NPM Packages (monorepo with TypeScript packages ready to publish)', }, { name: 'custom', message: 'Custom (advanced setup with additional frameworks)', }, ], initial: 0, }, ]); return template; } async function determineAiAgents(parsedArgs) { return parsedArgs.aiAgents ?? []; } async function aiAgentsPrompt() { const promptConfig = { name: 'agents', message: 'Which AI agents, if any, would you like to set up?', type: 'multiselect', choices: create_workspace_options_1.supportedAgents.map((a) => ({ name: a, message: create_workspace_options_1.agentDisplayMap[a], })), footer: () => chalk.dim('Multiple selections possible. <Space> to select. <Enter> to confirm.'), }; return (await enquirer.prompt([promptConfig])).agents; } async function determineDefaultBase(parsedArgs) { if (parsedArgs.defaultBase) { return parsedArgs.defaultBase; } else if (parsedArgs.allPrompts) { return enquirer .prompt([ { name: 'DefaultBase', message: `Main branch name`, initial: `main`, type: 'input', }, ]) .then((a) => { if (!a.DefaultBase) { throw new error_utils_1.CnwError('INVALID_BRANCH_NAME', 'Branch name cannot be empty'); } return a.DefaultBase; }); } return (0, default_base_1.deduceDefaultBase)(); } async function determinePackageManager(parsedArgs) { const packageManager = parsedArgs.packageManager; if (packageManager) { if (package_manager_1.packageManagerList.includes(packageManager)) { return packageManager; } throw new error_utils_1.CnwError('INVALID_PACKAGE_MANAGER', `Package manager must be one of ${(0, string_utils_1.stringifyCollection)([ ...package_manager_1.packageManagerList, ])}`); } else if (parsedArgs.allPrompts) { return enquirer .prompt([ { name: 'packageManager', message: `Which package manager to use`, initial: 0, type: 'autocomplete', choices: [ { name: 'npm', message: 'NPM' }, { name: 'yarn', message: 'Yarn' }, { name: 'pnpm', message: 'PNPM' }, { name: 'bun', message: 'Bun' }, ], }, ]) .then((a) => a.packageManager); } return (0, package_manager_1.detectInvokedPackageManager)(); }