From f77e85dc564f5c9fadd67e66c52511573563a166 Mon Sep 17 00:00:00 2001 From: Colum Ferry Date: Tue, 13 Dec 2022 10:09:19 +0000 Subject: [PATCH 1/2] fix(react): module-federation-ssr-dev-server should use fork --- .../module-federation-ssr-dev-server.impl.ts | 68 ++++++++++++++----- 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/packages/react/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.ts b/packages/react/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.ts index 87cc9e21e6203..7fbba4d6b4851 100644 --- a/packages/react/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.ts +++ b/packages/react/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.ts @@ -1,4 +1,9 @@ -import { ExecutorContext, logger, runExecutor } from '@nrwl/devkit'; +import { + ExecutorContext, + logger, + runExecutor, + workspaceRoot, +} from '@nrwl/devkit'; import ssrDevServerExecutor from '@nrwl/webpack/src/executors/ssr-dev-server/ssr-dev-server.impl'; import { WebSsrDevServerOptions } from '@nrwl/webpack/src/executors/ssr-dev-server/schema'; import { join } from 'path'; @@ -7,6 +12,7 @@ import { combineAsyncIterableIterators, tapAsyncIterable, } from '@nrwl/devkit/src/utils/async-iterable'; +import { execSync, fork } from 'child_process'; type ModuleFederationDevServerOptions = WebSsrDevServerOptions & { devRemotes?: string | string[]; @@ -18,7 +24,10 @@ export default async function* moduleFederationSsrDevServer( options: ModuleFederationDevServerOptions, context: ExecutorContext ) { - let iter = ssrDevServerExecutor(options, context); + let iter: AsyncGenerator = ssrDevServerExecutor( + options, + context + ); const p = context.workspace.projects[context.projectName]; const moduleFederationConfigPath = join( @@ -51,20 +60,47 @@ export default async function* moduleFederationSsrDevServer( for (const app of knownRemotes) { const [appName] = Array.isArray(app) ? app : [app]; const isDev = devServeApps.includes(appName); - iter = combineAsyncIterableIterators( - iter, - await runExecutor( - { - project: appName, - target: isDev ? 'serve' : 'serve-server', - configuration: context.configurationName, - }, - { - watch: isDev, - }, - context - ) - ); + const remoteServeIter = (async function* () { + if (isDev) { + yield await runExecutor( + { + project: appName, + target: 'serve', + configuration: context.configurationName, + }, + { + watch: isDev, + }, + context + ); + } else { + yield await new Promise((res) => { + const remoteProject = context.workspace.projects[appName]; + const remoteServerOutput = join( + workspaceRoot, + remoteProject.targets.server.options.outputPath, + 'main.js' + ); + execSync( + `npx nx run ${appName}:server${ + context.configurationName ? `:${context.configurationName}` : '' + }`, + { stdio: 'inherit' } + ); + const child = fork(remoteServerOutput, { + env: { port: remoteProject.targets['serve-browser'].options.port }, + }); + + child.on('message', (msg) => { + if (msg === 'nx.server.ready') { + res(true); + } + }); + }); + } + })(); + + iter = combineAsyncIterableIterators(iter, remoteServeIter); } let numAwaiting = knownRemotes.length + 1; // remotes + host From 51666e39c64d1610aa6f6ed2673db96a5b804e47 Mon Sep 17 00:00:00 2001 From: Colum Ferry Date: Tue, 13 Dec 2022 18:39:23 +0000 Subject: [PATCH 2/2] fix(react): use createAsyncIterable instead of generator function --- .../module-federation-ssr-dev-server.impl.ts | 67 ++++++++++--------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/packages/react/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.ts b/packages/react/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.ts index 7fbba4d6b4851..1d8afd9090392 100644 --- a/packages/react/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.ts +++ b/packages/react/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.ts @@ -10,6 +10,8 @@ import { join } from 'path'; import * as chalk from 'chalk'; import { combineAsyncIterableIterators, + createAsyncIterable, + mapAsyncIterable, tapAsyncIterable, } from '@nrwl/devkit/src/utils/async-iterable'; import { execSync, fork } from 'child_process'; @@ -24,10 +26,7 @@ export default async function* moduleFederationSsrDevServer( options: ModuleFederationDevServerOptions, context: ExecutorContext ) { - let iter: AsyncGenerator = ssrDevServerExecutor( - options, - context - ); + let iter: any = ssrDevServerExecutor(options, context); const p = context.workspace.projects[context.projectName]; const moduleFederationConfigPath = join( @@ -60,9 +59,8 @@ export default async function* moduleFederationSsrDevServer( for (const app of knownRemotes) { const [appName] = Array.isArray(app) ? app : [app]; const isDev = devServeApps.includes(appName); - const remoteServeIter = (async function* () { - if (isDev) { - yield await runExecutor( + const remoteServeIter = isDev + ? await runExecutor( { project: appName, target: 'serve', @@ -72,33 +70,36 @@ export default async function* moduleFederationSsrDevServer( watch: isDev, }, context - ); - } else { - yield await new Promise((res) => { - const remoteProject = context.workspace.projects[appName]; - const remoteServerOutput = join( - workspaceRoot, - remoteProject.targets.server.options.outputPath, - 'main.js' - ); - execSync( - `npx nx run ${appName}:server${ - context.configurationName ? `:${context.configurationName}` : '' - }`, - { stdio: 'inherit' } - ); - const child = fork(remoteServerOutput, { - env: { port: remoteProject.targets['serve-browser'].options.port }, - }); + ) + : mapAsyncIterable( + createAsyncIterable(async ({ next, done }) => { + const remoteProject = context.workspace.projects[appName]; + const remoteServerOutput = join( + workspaceRoot, + remoteProject.targets.server.options.outputPath, + 'main.js' + ); + execSync( + `npx nx run ${appName}:server${ + context.configurationName ? `:${context.configurationName}` : '' + }`, + { stdio: 'inherit' } + ); + const child = fork(remoteServerOutput, { + env: { + PORT: remoteProject.targets['serve-browser'].options.port, + }, + }); - child.on('message', (msg) => { - if (msg === 'nx.server.ready') { - res(true); - } - }); - }); - } - })(); + child.on('message', (msg) => { + if (msg === 'nx.server.ready') { + next(true); + done(); + } + }); + }), + (x) => x + ); iter = combineAsyncIterableIterators(iter, remoteServeIter); }