From 4625215934645d3a1d6380e3b10e3d01ce923143 Mon Sep 17 00:00:00 2001 From: Emily Xiong Date: Thu, 29 Aug 2024 11:58:38 -0400 Subject: [PATCH] fix(core): handle no interative for create-nx-workspace --- .../src/create-nx-workspace.test.ts | 14 +++++++++++ .../bin/create-nx-workspace.ts | 23 +++++++++++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/e2e/workspace-create/src/create-nx-workspace.test.ts b/e2e/workspace-create/src/create-nx-workspace.test.ts index 245e4c79a7aea..0a5d69041d4b9 100644 --- a/e2e/workspace-create/src/create-nx-workspace.test.ts +++ b/e2e/workspace-create/src/create-nx-workspace.test.ts @@ -215,6 +215,20 @@ describe('create-nx-workspace', () => { 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', () => { const wsName = uniq('next'); const appName = uniq('app'); diff --git a/packages/create-nx-workspace/bin/create-nx-workspace.ts b/packages/create-nx-workspace/bin/create-nx-workspace.ts index d041e93a623e8..b9f3e51a06a31 100644 --- a/packages/create-nx-workspace/bin/create-nx-workspace.ts +++ b/packages/create-nx-workspace/bin/create-nx-workspace.ts @@ -29,6 +29,7 @@ import { showNxWarning } from '../src/utils/nx/show-nx-warning'; import { messages, recordStat } from '../src/utils/nx/ab-testing'; import { mapErrorToBodyLines } from '../src/utils/error-utils'; import { existsSync } from 'fs'; +import { isCI } from '../src/utils/ci/is-ci'; interface BaseArguments extends CreateWorkspaceOptions { preset: Preset; @@ -320,13 +321,13 @@ async function determineFolder( ? parsedArgs._[0].toString() : parsedArgs.name; if (folderName) return folderName; - const reply = await enquirer.prompt<{ folderName: string }>([ { name: 'folderName', message: `Where would you like to create your workspace?`, initial: 'org', type: 'input', + skip: !parsedArgs.interactive || isCI(), }, ]); @@ -369,6 +370,7 @@ async function determineStack( return 'vue'; case Preset.Nest: case Preset.NodeStandalone: + case Preset.NodeMonorepo: case Preset.Express: return 'node'; case Preset.Apps: @@ -477,6 +479,7 @@ async function determineNoneOptions( }, ], initial: 0, + skip: !parsedArgs.interactive || isCI(), }, ]); js = reply.ts === 'No'; @@ -578,6 +581,7 @@ async function determineReactOptions( message: `Default stylesheet format`, initial: 0, type: 'autocomplete', + skip: !parsedArgs.interactive || isCI(), choices: [ { name: 'css', @@ -678,6 +682,7 @@ async function determineVueOptions( message: `Default stylesheet format`, initial: 0, type: 'autocomplete', + skip: !parsedArgs.interactive || isCI(), choices: [ { name: 'css', @@ -764,6 +769,7 @@ async function determineAngularOptions( name: 'bundler', message: `Which bundler would you like to use?`, type: 'autocomplete', + skip: !parsedArgs.interactive || isCI(), choices: [ { name: 'esbuild', @@ -789,6 +795,7 @@ async function determineAngularOptions( message: `Default stylesheet format`, initial: 0, type: 'autocomplete', + skip: !parsedArgs.interactive || isCI(), choices: [ { name: 'css', @@ -819,6 +826,7 @@ async function determineAngularOptions( type: 'autocomplete', choices: [{ name: 'Yes' }, { name: 'No' }], initial: 1, + skip: !parsedArgs.interactive || isCI(), }, ]); ssr = reply.ssr === 'Yes'; @@ -887,6 +895,7 @@ async function determineNodeOptions( message: 'Would you like to generate a Dockerfile? [https://docs.docker.com/]', type: 'autocomplete', + skip: !parsedArgs.interactive || isCI(), choices: [ { name: 'Yes', @@ -1000,6 +1009,7 @@ async function determineAppName( message: `Application name`, type: 'input', initial: parsedArgs.name, + skip: !parsedArgs.interactive || isCI(), }, ]); invariant(appName, { @@ -1059,6 +1069,7 @@ async function determineReactBundler( name: 'bundler', message: `Which bundler would you like to use?`, type: 'autocomplete', + skip: !parsedArgs.interactive || isCI(), choices: [ { name: 'vite', @@ -1073,6 +1084,7 @@ async function determineReactBundler( message: 'Rspack [ https://www.rspack.dev/ ]', }, ], + initial: 0, }, ]); return reply.bundler; @@ -1087,6 +1099,7 @@ async function determineNextAppDir( name: 'nextAppDir', message: 'Would you like to use the App Router (recommended)?', type: 'autocomplete', + skip: !parsedArgs.interactive || isCI(), choices: [ { name: 'Yes', @@ -1110,6 +1123,7 @@ async function determineNextSrcDir( name: 'nextSrcDir', message: 'Would you like to use the src/ directory?', type: 'autocomplete', + skip: !parsedArgs.interactive || isCI(), choices: [ { name: 'Yes', @@ -1135,6 +1149,7 @@ async function determineVueFramework( name: 'framework', message: 'What framework would you like to use?', type: 'autocomplete', + skip: !parsedArgs.interactive || isCI(), choices: [ { name: 'none', @@ -1155,7 +1170,7 @@ async function determineVueFramework( async function determineNodeFramework( parsedArgs: yargs.Arguments ): Promise<'express' | 'fastify' | 'koa' | 'nest' | 'none'> { - if (parsedArgs.framework) return parsedArgs.framework; + if (!!parsedArgs.framework) return parsedArgs.framework; const reply = await enquirer.prompt<{ framework: 'express' | 'fastify' | 'koa' | 'nest' | 'none'; }>([ @@ -1163,6 +1178,7 @@ async function determineNodeFramework( message: 'What framework should be used?', type: 'autocomplete', name: 'framework', + skip: !parsedArgs.interactive || isCI(), choices: [ { name: 'none', @@ -1185,6 +1201,7 @@ async function determineNodeFramework( message: 'NestJs [ https://nestjs.com/ ]', }, ], + initial: 0, }, ]); return reply.framework; @@ -1203,6 +1220,7 @@ async function determineE2eTestRunner( message: 'Test runner to use for end to end (E2E) tests', type: 'autocomplete', name: 'e2eTestRunner', + skip: !parsedArgs.interactive || isCI(), choices: [ { name: 'playwright', @@ -1217,6 +1235,7 @@ async function determineE2eTestRunner( message: 'None', }, ], + initial: 0, }, ]); return reply.e2eTestRunner;