fix(core): handle --no-interative for create-nx-workspace (#27702)
<!-- Please make sure you have read the submission guidelines before posting an PR --> <!-- https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr --> <!-- Please make sure that your commit message follows our format --> <!-- Example: `fix(nx): must begin with lowercase` --> <!-- If this is a particularly complex change or feature addition, you can request a dedicated Nx release for this pull request branch. Mention someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they will confirm if the PR warrants its own release for testing purposes, and generate it for you if appropriate. --> ## Current Behavior <!-- This is the behavior we have today --> ## Expected Behavior <!-- This is the behavior we should expect with the changes in this PR --> ## Related Issue(s) <!-- Please link the issue being fixed so it gets closed when this is merged. --> Fixes #
This commit is contained in:
parent
2eb5592ac3
commit
24edc5ad99
@ -215,6 +215,20 @@ describe('create-nx-workspace', () => {
|
|||||||
expectCodeIsFormatted();
|
expectCodeIsFormatted();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should be able to create a react workspace without options and --no-interactive', () => {
|
||||||
|
const wsName = uniq('react');
|
||||||
|
|
||||||
|
runCreateWorkspace(wsName, {
|
||||||
|
preset: 'react-monorepo',
|
||||||
|
});
|
||||||
|
|
||||||
|
expectNoAngularDevkit();
|
||||||
|
expectNoTsJestInJestConfig(wsName);
|
||||||
|
const packageJson = readJson('package.json');
|
||||||
|
expect(packageJson.devDependencies['@nx/vite']).toBeDefined(); // vite should be default bundler
|
||||||
|
expectCodeIsFormatted();
|
||||||
|
});
|
||||||
|
|
||||||
it('should be able to create an next workspace', () => {
|
it('should be able to create an next workspace', () => {
|
||||||
const wsName = uniq('next');
|
const wsName = uniq('next');
|
||||||
const appName = uniq('app');
|
const appName = uniq('app');
|
||||||
|
|||||||
@ -29,6 +29,7 @@ import { showNxWarning } from '../src/utils/nx/show-nx-warning';
|
|||||||
import { messages, recordStat } from '../src/utils/nx/ab-testing';
|
import { messages, recordStat } from '../src/utils/nx/ab-testing';
|
||||||
import { mapErrorToBodyLines } from '../src/utils/error-utils';
|
import { mapErrorToBodyLines } from '../src/utils/error-utils';
|
||||||
import { existsSync } from 'fs';
|
import { existsSync } from 'fs';
|
||||||
|
import { isCI } from '../src/utils/ci/is-ci';
|
||||||
|
|
||||||
interface BaseArguments extends CreateWorkspaceOptions {
|
interface BaseArguments extends CreateWorkspaceOptions {
|
||||||
preset: Preset;
|
preset: Preset;
|
||||||
@ -320,13 +321,13 @@ async function determineFolder(
|
|||||||
? parsedArgs._[0].toString()
|
? parsedArgs._[0].toString()
|
||||||
: parsedArgs.name;
|
: parsedArgs.name;
|
||||||
if (folderName) return folderName;
|
if (folderName) return folderName;
|
||||||
|
|
||||||
const reply = await enquirer.prompt<{ folderName: string }>([
|
const reply = await enquirer.prompt<{ folderName: string }>([
|
||||||
{
|
{
|
||||||
name: 'folderName',
|
name: 'folderName',
|
||||||
message: `Where would you like to create your workspace?`,
|
message: `Where would you like to create your workspace?`,
|
||||||
initial: 'org',
|
initial: 'org',
|
||||||
type: 'input',
|
type: 'input',
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@ -369,6 +370,7 @@ async function determineStack(
|
|||||||
return 'vue';
|
return 'vue';
|
||||||
case Preset.Nest:
|
case Preset.Nest:
|
||||||
case Preset.NodeStandalone:
|
case Preset.NodeStandalone:
|
||||||
|
case Preset.NodeMonorepo:
|
||||||
case Preset.Express:
|
case Preset.Express:
|
||||||
return 'node';
|
return 'node';
|
||||||
case Preset.Apps:
|
case Preset.Apps:
|
||||||
@ -477,6 +479,7 @@ async function determineNoneOptions(
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
initial: 0,
|
initial: 0,
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
js = reply.ts === 'No';
|
js = reply.ts === 'No';
|
||||||
@ -578,6 +581,7 @@ async function determineReactOptions(
|
|||||||
message: `Default stylesheet format`,
|
message: `Default stylesheet format`,
|
||||||
initial: 0,
|
initial: 0,
|
||||||
type: 'autocomplete',
|
type: 'autocomplete',
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
choices: [
|
choices: [
|
||||||
{
|
{
|
||||||
name: 'css',
|
name: 'css',
|
||||||
@ -678,6 +682,7 @@ async function determineVueOptions(
|
|||||||
message: `Default stylesheet format`,
|
message: `Default stylesheet format`,
|
||||||
initial: 0,
|
initial: 0,
|
||||||
type: 'autocomplete',
|
type: 'autocomplete',
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
choices: [
|
choices: [
|
||||||
{
|
{
|
||||||
name: 'css',
|
name: 'css',
|
||||||
@ -764,6 +769,7 @@ async function determineAngularOptions(
|
|||||||
name: 'bundler',
|
name: 'bundler',
|
||||||
message: `Which bundler would you like to use?`,
|
message: `Which bundler would you like to use?`,
|
||||||
type: 'autocomplete',
|
type: 'autocomplete',
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
choices: [
|
choices: [
|
||||||
{
|
{
|
||||||
name: 'esbuild',
|
name: 'esbuild',
|
||||||
@ -789,6 +795,7 @@ async function determineAngularOptions(
|
|||||||
message: `Default stylesheet format`,
|
message: `Default stylesheet format`,
|
||||||
initial: 0,
|
initial: 0,
|
||||||
type: 'autocomplete',
|
type: 'autocomplete',
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
choices: [
|
choices: [
|
||||||
{
|
{
|
||||||
name: 'css',
|
name: 'css',
|
||||||
@ -819,6 +826,7 @@ async function determineAngularOptions(
|
|||||||
type: 'autocomplete',
|
type: 'autocomplete',
|
||||||
choices: [{ name: 'Yes' }, { name: 'No' }],
|
choices: [{ name: 'Yes' }, { name: 'No' }],
|
||||||
initial: 1,
|
initial: 1,
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
ssr = reply.ssr === 'Yes';
|
ssr = reply.ssr === 'Yes';
|
||||||
@ -887,6 +895,7 @@ async function determineNodeOptions(
|
|||||||
message:
|
message:
|
||||||
'Would you like to generate a Dockerfile? [https://docs.docker.com/]',
|
'Would you like to generate a Dockerfile? [https://docs.docker.com/]',
|
||||||
type: 'autocomplete',
|
type: 'autocomplete',
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
choices: [
|
choices: [
|
||||||
{
|
{
|
||||||
name: 'Yes',
|
name: 'Yes',
|
||||||
@ -1000,6 +1009,7 @@ async function determineAppName(
|
|||||||
message: `Application name`,
|
message: `Application name`,
|
||||||
type: 'input',
|
type: 'input',
|
||||||
initial: parsedArgs.name,
|
initial: parsedArgs.name,
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
invariant(appName, {
|
invariant(appName, {
|
||||||
@ -1059,6 +1069,7 @@ async function determineReactBundler(
|
|||||||
name: 'bundler',
|
name: 'bundler',
|
||||||
message: `Which bundler would you like to use?`,
|
message: `Which bundler would you like to use?`,
|
||||||
type: 'autocomplete',
|
type: 'autocomplete',
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
choices: [
|
choices: [
|
||||||
{
|
{
|
||||||
name: 'vite',
|
name: 'vite',
|
||||||
@ -1073,6 +1084,7 @@ async function determineReactBundler(
|
|||||||
message: 'Rspack [ https://www.rspack.dev/ ]',
|
message: 'Rspack [ https://www.rspack.dev/ ]',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
initial: 0,
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
return reply.bundler;
|
return reply.bundler;
|
||||||
@ -1087,6 +1099,7 @@ async function determineNextAppDir(
|
|||||||
name: 'nextAppDir',
|
name: 'nextAppDir',
|
||||||
message: 'Would you like to use the App Router (recommended)?',
|
message: 'Would you like to use the App Router (recommended)?',
|
||||||
type: 'autocomplete',
|
type: 'autocomplete',
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
choices: [
|
choices: [
|
||||||
{
|
{
|
||||||
name: 'Yes',
|
name: 'Yes',
|
||||||
@ -1110,6 +1123,7 @@ async function determineNextSrcDir(
|
|||||||
name: 'nextSrcDir',
|
name: 'nextSrcDir',
|
||||||
message: 'Would you like to use the src/ directory?',
|
message: 'Would you like to use the src/ directory?',
|
||||||
type: 'autocomplete',
|
type: 'autocomplete',
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
choices: [
|
choices: [
|
||||||
{
|
{
|
||||||
name: 'Yes',
|
name: 'Yes',
|
||||||
@ -1135,6 +1149,7 @@ async function determineVueFramework(
|
|||||||
name: 'framework',
|
name: 'framework',
|
||||||
message: 'What framework would you like to use?',
|
message: 'What framework would you like to use?',
|
||||||
type: 'autocomplete',
|
type: 'autocomplete',
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
choices: [
|
choices: [
|
||||||
{
|
{
|
||||||
name: 'none',
|
name: 'none',
|
||||||
@ -1155,7 +1170,7 @@ async function determineVueFramework(
|
|||||||
async function determineNodeFramework(
|
async function determineNodeFramework(
|
||||||
parsedArgs: yargs.Arguments<NodeArguments>
|
parsedArgs: yargs.Arguments<NodeArguments>
|
||||||
): Promise<'express' | 'fastify' | 'koa' | 'nest' | 'none'> {
|
): Promise<'express' | 'fastify' | 'koa' | 'nest' | 'none'> {
|
||||||
if (parsedArgs.framework) return parsedArgs.framework;
|
if (!!parsedArgs.framework) return parsedArgs.framework;
|
||||||
const reply = await enquirer.prompt<{
|
const reply = await enquirer.prompt<{
|
||||||
framework: 'express' | 'fastify' | 'koa' | 'nest' | 'none';
|
framework: 'express' | 'fastify' | 'koa' | 'nest' | 'none';
|
||||||
}>([
|
}>([
|
||||||
@ -1163,6 +1178,7 @@ async function determineNodeFramework(
|
|||||||
message: 'What framework should be used?',
|
message: 'What framework should be used?',
|
||||||
type: 'autocomplete',
|
type: 'autocomplete',
|
||||||
name: 'framework',
|
name: 'framework',
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
choices: [
|
choices: [
|
||||||
{
|
{
|
||||||
name: 'none',
|
name: 'none',
|
||||||
@ -1185,6 +1201,7 @@ async function determineNodeFramework(
|
|||||||
message: 'NestJs [ https://nestjs.com/ ]',
|
message: 'NestJs [ https://nestjs.com/ ]',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
initial: 0,
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
return reply.framework;
|
return reply.framework;
|
||||||
@ -1203,6 +1220,7 @@ async function determineE2eTestRunner(
|
|||||||
message: 'Test runner to use for end to end (E2E) tests',
|
message: 'Test runner to use for end to end (E2E) tests',
|
||||||
type: 'autocomplete',
|
type: 'autocomplete',
|
||||||
name: 'e2eTestRunner',
|
name: 'e2eTestRunner',
|
||||||
|
skip: !parsedArgs.interactive || isCI(),
|
||||||
choices: [
|
choices: [
|
||||||
{
|
{
|
||||||
name: 'playwright',
|
name: 'playwright',
|
||||||
@ -1217,6 +1235,7 @@ async function determineE2eTestRunner(
|
|||||||
message: 'None',
|
message: 'None',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
initial: 0,
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
return reply.e2eTestRunner;
|
return reply.e2eTestRunner;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user