<!-- 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 --> The `withModuleFederation` helper currently lives in the `@nx/angular` package. With the goal of consolidating the module federation support into a single package, this introduces a divergence in where module-federation support lies ## Expected Behavior <!-- This is the behavior we should expect with the changes in this PR --> Move `withModuleFederation` helper for angular into the `@nx/module-federation` package, exposed via `@nx/module-federation/angular`. Adds a migration to migrate existing projects to use the new package ## Related Issue(s) <!-- Please link the issue being fixed so it gets closed when this is merged. --> Fixes #
58 lines
1.7 KiB
TypeScript
58 lines
1.7 KiB
TypeScript
import {
|
|
type Tree,
|
|
formatFiles,
|
|
readProjectConfiguration,
|
|
visitNotIgnoredFiles,
|
|
} from '@nx/devkit';
|
|
import { forEachExecutorOptions } from '@nx/devkit/src/generators/executor-options-utils';
|
|
import { tsquery } from '@phenomnomnominal/tsquery';
|
|
|
|
const NX_ANGULAR_MODULE_FEDERATION_IMPORT_SELECTOR =
|
|
'ImportDeclaration > StringLiteral[value=@nx/angular/module-federation], VariableStatement CallExpression:has(Identifier[name=require]) > StringLiteral[value=@nx/angular/module-federation]';
|
|
const NEW_IMPORT_PATH = `'@nx/module-federation/angular'`;
|
|
|
|
export default async function migrateWithMfImport(tree: Tree) {
|
|
const projects = new Set<string>();
|
|
|
|
forEachExecutorOptions(
|
|
tree,
|
|
'@nx/angular:webpack-browser',
|
|
(options, project, target) => {
|
|
const projectConfig = readProjectConfiguration(tree, project);
|
|
projects.add(projectConfig.root);
|
|
}
|
|
);
|
|
|
|
for (const projectRoot of projects) {
|
|
visitNotIgnoredFiles(tree, projectRoot, (filePath) => {
|
|
if (!filePath.endsWith('.ts') && !filePath.endsWith('.js')) {
|
|
return;
|
|
}
|
|
let contents = tree.read(filePath, 'utf-8');
|
|
if (!contents.includes('@nx/angular/module-federation')) {
|
|
return;
|
|
}
|
|
|
|
const ast = tsquery.ast(contents);
|
|
const importNodes = tsquery(
|
|
ast,
|
|
NX_ANGULAR_MODULE_FEDERATION_IMPORT_SELECTOR
|
|
);
|
|
|
|
if (importNodes.length === 0) {
|
|
return;
|
|
}
|
|
const importPathNode = importNodes[0];
|
|
|
|
contents = `${contents.slice(
|
|
0,
|
|
importPathNode.getStart()
|
|
)}${NEW_IMPORT_PATH}${contents.slice(importPathNode.getEnd())}`;
|
|
|
|
tree.write(filePath, contents);
|
|
});
|
|
}
|
|
|
|
await formatFiles(tree);
|
|
}
|