create-nx-workspace
Version:
213 lines (212 loc) • 7.53 kB
JavaScript
"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)();
}