nx/packages/angular/src/migrations/update-20-2-0/migrate-with-mf-import-to-new-package.ts
Colum Ferry 9ca15f75b0
feat(module-federation): move withModuleFederation for angular to new package (#29021)
<!-- 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 #
2024-11-21 11:07:51 -05:00

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);
}