<!-- 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 --> Currently, the default for remotes is to server them as development. Which means a separate node process for each remote that is inside the workspace. This does not scale well and can lead to out of memory exceptions. ## Expected Behavior <!-- This is the behavior we should expect with the changes in this PR --> Remotes will start as static by default, which allows for better scaling as the remotes increase. ## Related Issue(s) <!-- Please link the issue being fixed so it gets closed when this is merged. --> TODO - [ ] Migrations
58 lines
1.8 KiB
TypeScript
58 lines
1.8 KiB
TypeScript
import type { ExecutorContext } from '@nx/devkit';
|
|
import { basename, dirname } from 'path';
|
|
|
|
export type StaticRemoteConfig = {
|
|
basePath: string;
|
|
outputPath: string;
|
|
urlSegment: string;
|
|
port: number;
|
|
};
|
|
export type StaticRemotesConfig = {
|
|
remotes: string[];
|
|
config: Record<string, StaticRemoteConfig> | undefined;
|
|
};
|
|
|
|
export function parseStaticRemotesConfig(
|
|
staticRemotes: string[] | undefined,
|
|
context: ExecutorContext
|
|
): StaticRemotesConfig {
|
|
if (!staticRemotes?.length) {
|
|
return { remotes: [], config: undefined };
|
|
}
|
|
|
|
const config: Record<string, StaticRemoteConfig> = {};
|
|
for (const app of staticRemotes) {
|
|
const outputPath =
|
|
context.projectGraph.nodes[app].data.targets['build'].options.outputPath;
|
|
const basePath = dirname(outputPath);
|
|
const urlSegment = basename(outputPath);
|
|
const port =
|
|
context.projectGraph.nodes[app].data.targets['serve'].options.port;
|
|
config[app] = { basePath, outputPath, urlSegment, port };
|
|
}
|
|
|
|
return { remotes: staticRemotes, config };
|
|
}
|
|
|
|
export function parseStaticSsrRemotesConfig(
|
|
staticRemotes: string[] | undefined,
|
|
context: ExecutorContext
|
|
): StaticRemotesConfig {
|
|
if (!staticRemotes?.length) {
|
|
return { remotes: [], config: undefined };
|
|
}
|
|
const config: Record<string, StaticRemoteConfig> = {};
|
|
for (const app of staticRemotes) {
|
|
const outputPath = dirname(
|
|
context.projectGraph.nodes[app].data.targets['build'].options.outputPath // dist/checkout/browser -> checkout
|
|
) as string;
|
|
const basePath = dirname(outputPath); // dist/checkout -> dist
|
|
const urlSegment = basename(outputPath); // dist/checkout -> checkout
|
|
const port =
|
|
context.projectGraph.nodes[app].data.targets['serve'].options.port;
|
|
config[app] = { basePath, outputPath, urlSegment, port };
|
|
}
|
|
|
|
return { remotes: staticRemotes, config };
|
|
}
|