2023-11-07 15:45:42 -05:00

100 lines
2.8 KiB
TypeScript

import {
addDependenciesToPackageJson,
formatFiles,
getProjects,
runTasksInSerial,
Tree,
} from '@nx/devkit';
import { determineProjectNameAndRootOptions } from '@nx/devkit/src/generators/project-name-and-root-utils';
import { E2eTestRunner } from '../../utils/test-runners';
import { applicationGenerator } from '../application/application';
import { setupMf } from '../setup-mf/setup-mf';
import { findNextAvailablePort, updateSsrSetup } from './lib';
import type { Schema } from './schema';
import { swcHelpersVersion } from '@nx/js/src/utils/versions';
export async function remote(tree: Tree, options: Schema) {
return await remoteInternal(tree, {
projectNameAndRootFormat: 'derived',
...options,
});
}
export async function remoteInternal(tree: Tree, schema: Schema) {
const { typescriptConfiguration = true, ...options }: Schema = schema;
options.standalone = options.standalone ?? true;
const projects = getProjects(tree);
if (options.host && !projects.has(options.host)) {
throw new Error(
`The name of the application to be used as the host app does not exist. (${options.host})`
);
}
const { projectName: remoteProjectName, projectNameAndRootFormat } =
await determineProjectNameAndRootOptions(tree, {
name: options.name,
projectType: 'application',
directory: options.directory,
projectNameAndRootFormat: options.projectNameAndRootFormat,
callingGenerator: '@nx/angular:remote',
});
options.projectNameAndRootFormat = projectNameAndRootFormat;
const port = options.port ?? findNextAvailablePort(tree);
const appInstallTask = await applicationGenerator(tree, {
...options,
standalone: options.standalone,
routing: true,
port,
skipFormat: true,
bundler: 'webpack',
});
const skipE2E =
!options.e2eTestRunner || options.e2eTestRunner === E2eTestRunner.None;
await setupMf(tree, {
appName: remoteProjectName,
mfType: 'remote',
routing: true,
host: options.host,
port,
skipPackageJson: options.skipPackageJson,
skipFormat: true,
skipE2E,
e2eProjectName: skipE2E ? undefined : `${remoteProjectName}-e2e`,
standalone: options.standalone,
prefix: options.prefix,
typescriptConfiguration,
});
const installSwcHelpersTask = addDependenciesToPackageJson(
tree,
{},
{
'@swc/helpers': swcHelpersVersion,
}
);
let installTasks = [appInstallTask, installSwcHelpersTask];
if (options.ssr) {
let ssrInstallTask = await updateSsrSetup(tree, {
appName: remoteProjectName,
port,
typescriptConfiguration,
standalone: options.standalone,
});
installTasks.push(ssrInstallTask);
}
if (!options.skipFormat) {
await formatFiles(tree);
}
return runTasksInSerial(...installTasks);
}
export default remote;