From a2dd9f00f9f9f9e4296532c66f8a461ecf129fd2 Mon Sep 17 00:00:00 2001 From: Colum Ferry Date: Mon, 6 Feb 2023 15:10:55 +0000 Subject: [PATCH] feat(angular): add routing option to CNW --- docs/generated/cli/create-nx-workspace.md | 6 +++ .../nx/documents/create-nx-workspace.md | 6 +++ .../packages/workspace/generators/new.json | 5 ++ .../packages/workspace/generators/preset.json | 5 ++ e2e/utils/index.ts | 6 +++ .../src/create-nx-workspace.test.ts | 22 ++++++++- .../bin/create-nx-workspace.ts | 48 ++++++++++++++++++- .../src/generators/new/generate-preset.ts | 1 + packages/workspace/src/generators/new/new.ts | 1 + .../workspace/src/generators/new/schema.json | 5 ++ .../workspace/src/generators/preset/preset.ts | 2 + .../src/generators/preset/schema.d.ts | 1 + .../src/generators/preset/schema.json | 5 ++ 13 files changed, 111 insertions(+), 2 deletions(-) diff --git a/docs/generated/cli/create-nx-workspace.md b/docs/generated/cli/create-nx-workspace.md index 042ddb6bacdfc..960e640c7da68 100644 --- a/docs/generated/cli/create-nx-workspace.md +++ b/docs/generated/cli/create-nx-workspace.md @@ -125,6 +125,12 @@ Type: `string` Customizes the initial content of your workspace. Default presets include: ["apps", "empty", "core", "npm", "ts", "web-components", "angular-monorepo", "angular-standalone", "react-monorepo", "react-standalone", "react-native", "expo", "next", "nest", "express", "react", "angular", "node-server"]. To build your own see https://nx.dev/packages/nx-plugin#preset +### routing + +Type: `string` + +Add a routing setup when a preset with pregenerated app is selected + ### skipGit Type: `boolean` diff --git a/docs/generated/packages/nx/documents/create-nx-workspace.md b/docs/generated/packages/nx/documents/create-nx-workspace.md index 042ddb6bacdfc..960e640c7da68 100644 --- a/docs/generated/packages/nx/documents/create-nx-workspace.md +++ b/docs/generated/packages/nx/documents/create-nx-workspace.md @@ -125,6 +125,12 @@ Type: `string` Customizes the initial content of your workspace. Default presets include: ["apps", "empty", "core", "npm", "ts", "web-components", "angular-monorepo", "angular-standalone", "react-monorepo", "react-standalone", "react-native", "expo", "next", "nest", "express", "react", "angular", "node-server"]. To build your own see https://nx.dev/packages/nx-plugin#preset +### routing + +Type: `string` + +Add a routing setup when a preset with pregenerated app is selected + ### skipGit Type: `boolean` diff --git a/docs/generated/packages/workspace/generators/new.json b/docs/generated/packages/workspace/generators/new.json index 94eb6df3bc372..0be6552206c65 100644 --- a/docs/generated/packages/workspace/generators/new.json +++ b/docs/generated/packages/workspace/generators/new.json @@ -20,6 +20,11 @@ "type": "string", "default": "css" }, + "routing": { + "description": "Add routing to the generated application.", + "type": "boolean", + "default": true + }, "npmScope": { "type": "string", "description": "Npm scope for importing libs." diff --git a/docs/generated/packages/workspace/generators/preset.json b/docs/generated/packages/workspace/generators/preset.json index e503f873cd527..7bc8082f2bb79 100644 --- a/docs/generated/packages/workspace/generators/preset.json +++ b/docs/generated/packages/workspace/generators/preset.json @@ -24,6 +24,11 @@ "enum": ["eslint"], "default": "eslint" }, + "routing": { + "description": "Add routing to the generated application.", + "type": "boolean", + "default": true + }, "style": { "description": "The file extension to be used for style files.", "type": "string", diff --git a/e2e/utils/index.ts b/e2e/utils/index.ts index 4a5738c1daf0d..8e88386b226a4 100644 --- a/e2e/utils/index.ts +++ b/e2e/utils/index.ts @@ -138,6 +138,7 @@ export function runCreateWorkspace( useDetectedPm = false, cwd = e2eCwd, bundler, + routing, }: { preset: string; appName?: string; @@ -149,6 +150,7 @@ export function runCreateWorkspace( useDetectedPm?: boolean; cwd?: string; bundler?: 'webpack' | 'vite'; + routing?: boolean; } ) { projName = name; @@ -170,6 +172,10 @@ export function runCreateWorkspace( command += ` --bundler=${bundler}`; } + if (routing !== undefined) { + command += ` --routing=${routing}`; + } + if (base) { command += ` --defaultBase="${base}"`; } diff --git a/e2e/workspace-create/src/create-nx-workspace.test.ts b/e2e/workspace-create/src/create-nx-workspace.test.ts index 3304272ca90b7..7fa048efccf2e 100644 --- a/e2e/workspace-create/src/create-nx-workspace.test.ts +++ b/e2e/workspace-create/src/create-nx-workspace.test.ts @@ -18,7 +18,7 @@ describe('create-nx-workspace', () => { afterEach(() => cleanupProject()); - it('should create a workspace with a single angular app at the root', () => { + it('should create a workspace with a single angular app at the root with routing', () => { const wsName = uniq('angular'); runCreateWorkspace(wsName, { @@ -26,6 +26,23 @@ describe('create-nx-workspace', () => { appName: wsName, style: 'css', packageManager, + routing: true, + }); + + checkFilesExist('package.json'); + checkFilesExist('src/app/app.routes.ts'); + checkFilesExist('project.json'); + }); + + it('should create a workspace with a single angular app at the root without routing', () => { + const wsName = uniq('angular'); + + runCreateWorkspace(wsName, { + preset: 'angular-standalone', + appName: wsName, + style: 'css', + packageManager, + routing: false, }); checkFilesExist('package.json'); @@ -112,6 +129,7 @@ describe('create-nx-workspace', () => { style: 'css', appName, packageManager, + routing: true, }); }); @@ -127,6 +145,7 @@ describe('create-nx-workspace', () => { style: 'css', appName, packageManager, + routing: true, }); } catch (e) { expect(e).toBeTruthy(); @@ -293,6 +312,7 @@ describe('create-nx-workspace', () => { appName, style: 'css', packageManager: 'npm', + routing: true, }); checkFilesDoNotExist('yarn.lock'); diff --git a/packages/create-nx-workspace/bin/create-nx-workspace.ts b/packages/create-nx-workspace/bin/create-nx-workspace.ts index 6d655523a6080..0a8d74450e276 100644 --- a/packages/create-nx-workspace/bin/create-nx-workspace.ts +++ b/packages/create-nx-workspace/bin/create-nx-workspace.ts @@ -33,6 +33,7 @@ type Arguments = { framework: string; docker: boolean; nxCloud: boolean; + routing: string; allPrompts: boolean; packageManager: PackageManager; defaultBase: string; @@ -143,6 +144,10 @@ export const commandsObject: yargs.Argv = yargs describe: chalk.dim`Style option to be used when a preset with pregenerated app is selected`, type: 'string', }) + .option('routing', { + describe: chalk.dim`Add a routing setup when a preset with pregenerated app is selected`, + type: 'string', + }) .option('bundler', { describe: chalk.dim`Bundler to be used to build the application`, type: 'string', @@ -227,6 +232,7 @@ async function main(parsedArgs: yargs.Arguments) { preset, appName, style, + routing, nxCloud, packageManager, defaultBase, @@ -257,6 +263,7 @@ async function main(parsedArgs: yargs.Arguments) { preset, appName, style, + routing, nxCloud, defaultBase, framework, @@ -314,7 +321,7 @@ async function getConfiguration( argv: yargs.Arguments ): Promise { try { - let name, appName, style, preset, framework, bundler, docker; + let name, appName, style, preset, framework, bundler, docker, routing; output.log({ title: @@ -366,12 +373,20 @@ async function getConfiguration( if (preset === Preset.ReactStandalone) { bundler = await determineBundler(argv); } + + if (preset === Preset.AngularStandalone) { + routing = await determineRouting(argv); + } } else { name = await determineRepoName(argv); appName = await determineAppName(preset, argv); if (preset === Preset.ReactMonorepo) { bundler = await determineBundler(argv); } + + if (preset === Preset.AngularMonorepo) { + routing = await determineRouting(argv); + } } style = await determineStyle(preset, argv); } @@ -386,6 +401,7 @@ async function getConfiguration( preset, appName, style, + routing, framework, nxCloud, packageManager, @@ -855,6 +871,36 @@ async function determineStyle( return Promise.resolve(parsedArgs.style); } +async function determineRouting( + parsedArgs: yargs.Arguments +): Promise { + if (!parsedArgs.routing) { + return enquirer + .prompt([ + { + name: 'routing', + message: 'Would you like to add routing?', + type: 'autocomplete', + choices: [ + { + name: 'Yes', + }, + + { + name: 'No', + }, + ], + initial: 'Yes' as any, + }, + ]) + .then((a: { routing: 'Yes' | 'No' }) => + a.routing === 'Yes' ? 'true' : 'false' + ); + } + + return parsedArgs.routing; +} + async function determineBundler( parsedArgs: yargs.Arguments ): Promise<'vite' | 'webpack'> { diff --git a/packages/workspace/src/generators/new/generate-preset.ts b/packages/workspace/src/generators/new/generate-preset.ts index 48a4f8de38732..ed11d5c6e2942 100644 --- a/packages/workspace/src/generators/new/generate-preset.ts +++ b/packages/workspace/src/generators/new/generate-preset.ts @@ -78,6 +78,7 @@ export function generatePreset(host: Tree, opts: NormalizedSchema) { opts.docker ? `--docker=${opts.docker}` : null, opts.packageManager ? `--packageManager=${opts.packageManager}` : null, parsedArgs.interactive ? '--interactive=true' : '--interactive=false', + opts.routing !== undefined ? `--routing=${opts.routing}` : null, ].filter((e) => !!e); } } diff --git a/packages/workspace/src/generators/new/new.ts b/packages/workspace/src/generators/new/new.ts index b64d1f12dcf81..076edf9cebc8f 100644 --- a/packages/workspace/src/generators/new/new.ts +++ b/packages/workspace/src/generators/new/new.ts @@ -27,6 +27,7 @@ interface Schema { docker?: boolean; linter?: Linter; bundler?: 'vite' | 'webpack'; + routing?: boolean; packageManager?: PackageManager; } diff --git a/packages/workspace/src/generators/new/schema.json b/packages/workspace/src/generators/new/schema.json index 5f79e51dfa8ec..1fe308151b13a 100644 --- a/packages/workspace/src/generators/new/schema.json +++ b/packages/workspace/src/generators/new/schema.json @@ -20,6 +20,11 @@ "type": "string", "default": "css" }, + "routing": { + "description": "Add routing to the generated application.", + "type": "boolean", + "default": true + }, "npmScope": { "type": "string", "description": "Npm scope for importing libs." diff --git a/packages/workspace/src/generators/preset/preset.ts b/packages/workspace/src/generators/preset/preset.ts index 8e14c0b3bc735..1774a9ccdc4e9 100644 --- a/packages/workspace/src/generators/preset/preset.ts +++ b/packages/workspace/src/generators/preset/preset.ts @@ -32,6 +32,7 @@ async function createPreset(tree: Tree, options: Schema) { name: options.name, style: options.style, linter: options.linter, + routing: options.routing, }); } else if (options.preset === Preset.AngularStandalone) { const { @@ -42,6 +43,7 @@ async function createPreset(tree: Tree, options: Schema) { name: options.name, style: options.style, linter: options.linter, + routing: options.routing, rootProject: true, }); } else if (options.preset === Preset.ReactMonorepo) { diff --git a/packages/workspace/src/generators/preset/schema.d.ts b/packages/workspace/src/generators/preset/schema.d.ts index c09523af65ade..1b896eb84f706 100644 --- a/packages/workspace/src/generators/preset/schema.d.ts +++ b/packages/workspace/src/generators/preset/schema.d.ts @@ -12,4 +12,5 @@ export interface Schema { packageManager?: PackageManager; bundler?: 'vite' | 'webpack'; docker?: boolean; + routing?: boolean; } diff --git a/packages/workspace/src/generators/preset/schema.json b/packages/workspace/src/generators/preset/schema.json index ad0fdcf2af4f3..22e24dcc48398 100644 --- a/packages/workspace/src/generators/preset/schema.json +++ b/packages/workspace/src/generators/preset/schema.json @@ -24,6 +24,11 @@ "enum": ["eslint"], "default": "eslint" }, + "routing": { + "description": "Add routing to the generated application.", + "type": "boolean", + "default": true + }, "style": { "description": "The file extension to be used for style files.", "type": "string",