96 lines
2.6 KiB
TypeScript

import { join } from 'path';
import {
formatFiles,
generateFiles,
GeneratorCallback,
joinPathFragments,
names,
readProjectConfiguration,
runTasksInSerial,
Tree,
updateProjectConfiguration,
} from '@nrwl/devkit';
import { normalizeOptions } from '../application/lib/normalize-options';
import applicationGenerator from '../application/application';
import { NormalizedSchema } from '../application/schema';
import { updateHostWithRemote } from './lib/update-host-with-remote';
import { updateModuleFederationProject } from '../../rules/update-module-federation-project';
import { Schema } from './schema';
import setupSsrGenerator from '../setup-ssr/setup-ssr';
import { setupSsrForRemote } from './lib/setup-ssr-for-remote';
export function addModuleFederationFiles(
host: Tree,
options: NormalizedSchema
) {
const templateVariables = {
...names(options.name),
...options,
tmpl: '',
};
generateFiles(
host,
join(__dirname, `./files/module-federation`),
options.appProjectRoot,
templateVariables
);
}
export async function remoteGenerator(host: Tree, schema: Schema) {
const tasks: GeneratorCallback[] = [];
const options = normalizeOptions<Schema>(host, schema);
const initAppTask = await applicationGenerator(host, {
...options,
// Only webpack works with module federation for now.
bundler: 'webpack',
});
tasks.push(initAppTask);
if (schema.host) {
updateHostWithRemote(host, schema.host, options.name);
}
// Module federation requires bootstrap code to be dynamically imported.
// Renaming original entry file so we can use `import(./bootstrap)` in
// new entry file.
host.rename(
join(options.appProjectRoot, 'src/main.tsx'),
join(options.appProjectRoot, 'src/bootstrap.tsx')
);
addModuleFederationFiles(host, options);
updateModuleFederationProject(host, options);
if (options.ssr) {
const setupSsrTask = await setupSsrGenerator(host, {
project: options.projectName,
serverPort: options.devServerPort,
});
tasks.push(setupSsrTask);
const setupSsrForRemoteTask = await setupSsrForRemote(
host,
options,
options.projectName
);
tasks.push(setupSsrForRemoteTask);
const projectConfig = readProjectConfiguration(host, options.projectName);
projectConfig.targets.server.options.webpackConfig = joinPathFragments(
projectConfig.root,
'webpack.server.config.js'
);
updateProjectConfiguration(host, options.projectName, projectConfig);
}
if (!options.skipFormat) {
await formatFiles(host);
}
return runTasksInSerial(...tasks);
}
export default remoteGenerator;