diff --git a/packages/angular/src/generators/mfe-remote/mfe-remote.spec.ts b/packages/angular/src/generators/mfe-remote/mfe-remote.spec.ts index 716708c49a222..b31337d982625 100644 --- a/packages/angular/src/generators/mfe-remote/mfe-remote.spec.ts +++ b/packages/angular/src/generators/mfe-remote/mfe-remote.spec.ts @@ -1,6 +1,7 @@ import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing'; import mfeRemote from './mfe-remote'; import applicationGenerator from '../application/application'; +import { readProjectConfiguration } from '@nrwl/devkit'; describe('MFE Remote App Generator', () => { it('should generate a remote mfe app with no host', async () => { @@ -58,4 +59,22 @@ describe('MFE Remote App Generator', () => { ); } }); + + it('should generate a remote mfe app and automatically find the next port available', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace(2); + await mfeRemote(tree, { + name: 'existing', + port: 4201, + }); + + // ACT + await mfeRemote(tree, { + name: 'test', + }); + + // ASSERT + const project = readProjectConfiguration(tree, 'test'); + expect(project.targets.serve.options.port).toEqual(4202); + }); }); diff --git a/packages/angular/src/generators/mfe-remote/mfe-remote.ts b/packages/angular/src/generators/mfe-remote/mfe-remote.ts index f4308dff490b5..8378ce1cc94fe 100644 --- a/packages/angular/src/generators/mfe-remote/mfe-remote.ts +++ b/packages/angular/src/generators/mfe-remote/mfe-remote.ts @@ -1,7 +1,23 @@ import type { Tree } from '@nrwl/devkit'; import type { Schema } from './schema'; -import { getProjects } from '@nrwl/devkit'; +import { getProjects, readProjectConfiguration } from '@nrwl/devkit'; import applicationGenerator from '../application/application'; +import { getMfeProjects } from '../../utils/get-mfe-projects'; + +function findNextAvailablePort(tree: Tree) { + const mfeProjects = getMfeProjects(tree); + + const ports = new Set(); + for (const mfeProject of mfeProjects) { + const { targets } = readProjectConfiguration(tree, mfeProject); + const port = targets?.serve?.options?.port ?? 4200; + ports.add(port); + } + + const nextAvailablePort = Math.max(...ports) + 1; + + return nextAvailablePort; +} export default async function mfeRemote(tree: Tree, options: Schema) { const projects = getProjects(tree); @@ -17,7 +33,7 @@ export default async function mfeRemote(tree: Tree, options: Schema) { mfeType: 'remote', routing: true, host: options.host, - port: options.port ?? 4200, + port: options.port ?? findNextAvailablePort(tree), }); return installTask;