@nx/angular 20.0.2 → 20.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +7 -7
- package/src/executors/module-federation-dev-server/module-federation-dev-server.impl.js +2 -2
- package/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.js +2 -2
- package/src/migrations/update-14-2-0/remove-show-circular-dependencies-option.d.ts +0 -2
- package/src/migrations/update-14-2-0/remove-show-circular-dependencies-option.js +0 -23
- package/src/migrations/update-14-2-0/update-angular-cli.d.ts +0 -2
- package/src/migrations/update-14-2-0/update-angular-cli.js +0 -22
- package/src/migrations/update-14-2-0/update-libraries-secondary-entrypoints.d.ts +0 -2
- package/src/migrations/update-14-2-0/update-libraries-secondary-entrypoints.js +0 -34
- package/src/migrations/update-14-2-0/update-ngcc-target.d.ts +0 -2
- package/src/migrations/update-14-2-0/update-ngcc-target.js +0 -17
- package/src/migrations/update-14-2-0/update-router-initial-navigation.d.ts +0 -2
- package/src/migrations/update-14-2-0/update-router-initial-navigation.js +0 -73
- package/src/migrations/update-14-2-0/update-tsconfig-target.d.ts +0 -2
- package/src/migrations/update-14-2-0/update-tsconfig-target.js +0 -155
- package/src/migrations/update-14-5-0/migrate-mfe-to-mf.d.ts +0 -5
- package/src/migrations/update-14-5-0/migrate-mfe-to-mf.js +0 -90
- package/src/migrations/update-14-5-2/update-angular-cli.d.ts +0 -2
- package/src/migrations/update-14-5-2/update-angular-cli.js +0 -22
- package/src/migrations/update-14-6-0/update-angular-cli.d.ts +0 -2
- package/src/migrations/update-14-6-0/update-angular-cli.js +0 -22
- package/src/migrations/update-14-8-0/rename-webpack-server.d.ts +0 -2
- package/src/migrations/update-14-8-0/rename-webpack-server.js +0 -21
- package/src/migrations/update-15-0-0/add-karma-inputs.d.ts +0 -2
- package/src/migrations/update-15-0-0/add-karma-inputs.js +0 -41
- package/src/migrations/update-15-0-0/switch-to-jasmine-marbles.d.ts +0 -2
- package/src/migrations/update-15-0-0/switch-to-jasmine-marbles.js +0 -102
- package/src/migrations/update-15-2-0/remove-browserlist-config.d.ts +0 -4
- package/src/migrations/update-15-2-0/remove-browserlist-config.js +0 -59
- package/src/migrations/update-15-2-0/remove-platform-server-exports.d.ts +0 -2
- package/src/migrations/update-15-2-0/remove-platform-server-exports.js +0 -62
- package/src/migrations/update-15-2-0/update-angular-cli.d.ts +0 -2
- package/src/migrations/update-15-2-0/update-angular-cli.js +0 -22
- package/src/migrations/update-15-2-0/update-karma-main-file.d.ts +0 -2
- package/src/migrations/update-15-2-0/update-karma-main-file.js +0 -72
- package/src/migrations/update-15-2-0/update-typescript-target.d.ts +0 -2
- package/src/migrations/update-15-2-0/update-typescript-target.js +0 -52
- package/src/migrations/update-15-2-0/update-workspace-config.d.ts +0 -2
- package/src/migrations/update-15-2-0/update-workspace-config.js +0 -24
- package/src/migrations/update-15-5-0/update-angular-cli.d.ts +0 -2
- package/src/migrations/update-15-5-0/update-angular-cli.js +0 -22
- package/src/migrations/update-15-7-0/install-required-packages.d.ts +0 -2
- package/src/migrations/update-15-7-0/install-required-packages.js +0 -36
- package/src/migrations/update-15-8-0/update-angular-cli.d.ts +0 -2
- package/src/migrations/update-15-8-0/update-angular-cli.js +0 -22
- package/src/migrations/update-15-9-0/update-file-server-executor.d.ts +0 -2
- package/src/migrations/update-15-9-0/update-file-server-executor.js +0 -42
- package/src/migrations/update-15-9-0/update-testing-tsconfig.d.ts +0 -3
- package/src/migrations/update-15-9-0/update-testing-tsconfig.js +0 -32
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@nx/angular",
|
3
|
-
"version": "20.0.
|
3
|
+
"version": "20.0.4",
|
4
4
|
"private": false,
|
5
5
|
"description": "The Nx Plugin for Angular contains executors, generators, and utilities for managing Angular applications and libraries within an Nx workspace. It provides: \n\n- Integration with libraries such as Storybook, Jest, ESLint, Tailwind CSS, Playwright and Cypress. \n\n- Generators to help scaffold code quickly (like: Micro Frontends, Libraries, both internal to your codebase and publishable to npm) \n\n- Single Component Application Modules (SCAMs) \n\n- NgRx helpers. \n\n- Utilities for automatic workspace refactoring.",
|
6
6
|
"repository": {
|
@@ -80,12 +80,12 @@
|
|
80
80
|
"webpack-merge": "^5.8.0",
|
81
81
|
"webpack": "^5.88.0",
|
82
82
|
"@module-federation/enhanced": "0.6.6",
|
83
|
-
"@nx/devkit": "20.0.
|
84
|
-
"@nx/js": "20.0.
|
85
|
-
"@nx/eslint": "20.0.
|
86
|
-
"@nx/webpack": "20.0.
|
87
|
-
"@nx/web": "20.0.
|
88
|
-
"@nx/workspace": "20.0.
|
83
|
+
"@nx/devkit": "20.0.4",
|
84
|
+
"@nx/js": "20.0.4",
|
85
|
+
"@nx/eslint": "20.0.4",
|
86
|
+
"@nx/webpack": "20.0.4",
|
87
|
+
"@nx/web": "20.0.4",
|
88
|
+
"@nx/workspace": "20.0.4",
|
89
89
|
"piscina": "^4.4.0"
|
90
90
|
},
|
91
91
|
"peerDependencies": {
|
@@ -67,8 +67,8 @@ async function* moduleFederationDevServerExecutor(schema, context) {
|
|
67
67
|
options.staticRemotesPort ??= remotes.staticRemotePort;
|
68
68
|
// Set NX_MF_DEV_REMOTES for the Nx Runtime Library Control Plugin
|
69
69
|
process.env.NX_MF_DEV_REMOTES = JSON.stringify([
|
70
|
-
...(remotes.devRemotes.map((r) => typeof r === 'string' ? r : r.remoteName) ?? []),
|
71
|
-
project.name,
|
70
|
+
...(remotes.devRemotes.map((r) => typeof r === 'string' ? r : r.remoteName) ?? []).map((r) => r.replace(/-/g, '_')),
|
71
|
+
project.name.replace(/-/g, '_'),
|
72
72
|
]);
|
73
73
|
const staticRemotesConfig = (0, parse_static_remotes_config_1.parseStaticRemotesConfig)([...remotes.staticRemotes, ...remotes.dynamicRemotes], context);
|
74
74
|
const mappedLocationsOfStaticRemotes = await (0, lib_1.buildStaticRemotes)(staticRemotesConfig, nxBin, context, options);
|
package/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.js
CHANGED
@@ -62,8 +62,8 @@ async function* moduleFederationSsrDevServerExecutor(schema, context) {
|
|
62
62
|
const mappedLocationsOfStaticRemotes = await (0, build_static_remotes_1.buildStaticRemotes)(staticRemotesConfig, nxBin, context, options);
|
63
63
|
// Set NX_MF_DEV_REMOTES for the Nx Runtime Library Control Plugin
|
64
64
|
process.env.NX_MF_DEV_REMOTES = JSON.stringify([
|
65
|
-
...(options.devRemotes ?? []),
|
66
|
-
project.name,
|
65
|
+
...(options.devRemotes.map((r) => typeof r === 'string' ? r : r.remoteName) ?? []).map((r) => r.replace(/-/g, '_')),
|
66
|
+
project.name.replace(/-/g, '_'),
|
67
67
|
]);
|
68
68
|
const devRemotes = await (0, start_dev_remotes_1.startRemotes)(remotes.devRemotes, workspaceProjects, options, context);
|
69
69
|
const staticRemotes = (0, start_static_remotes_1.startStaticRemotes)(staticRemotesConfig, context, options);
|
@@ -1,23 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.default = default_1;
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
5
|
-
const executor_options_utils_1 = require("@nx/devkit/src/generators/executor-options-utils");
|
6
|
-
const executors = [
|
7
|
-
'@angular-devkit/build-angular:browser',
|
8
|
-
'@angular-devkit/build-angular:server',
|
9
|
-
'@nrwl/angular:webpack-browser',
|
10
|
-
];
|
11
|
-
async function default_1(tree) {
|
12
|
-
executors.forEach((executor) => {
|
13
|
-
(0, executor_options_utils_1.forEachExecutorOptions)(tree, executor, (_options, projectName, targetName, configurationName) => {
|
14
|
-
const projectConfiguration = (0, devkit_1.readProjectConfiguration)(tree, projectName);
|
15
|
-
const config = configurationName
|
16
|
-
? projectConfiguration.targets[targetName].configurations[configurationName]
|
17
|
-
: projectConfiguration.targets[targetName].options;
|
18
|
-
delete config.showCircularDependencies;
|
19
|
-
(0, devkit_1.updateProjectConfiguration)(tree, projectName, projectConfiguration);
|
20
|
-
});
|
21
|
-
});
|
22
|
-
await (0, devkit_1.formatFiles)(tree);
|
23
|
-
}
|
@@ -1,22 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.default = default_1;
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
5
|
-
const angularCliVersion = '~14.0.0';
|
6
|
-
async function default_1(tree) {
|
7
|
-
let shouldFormat = false;
|
8
|
-
(0, devkit_1.updateJson)(tree, 'package.json', (json) => {
|
9
|
-
if (json.devDependencies?.['@angular/cli']) {
|
10
|
-
json.devDependencies['@angular/cli'] = angularCliVersion;
|
11
|
-
shouldFormat = true;
|
12
|
-
}
|
13
|
-
else if (json.dependencies?.['@angular/cli']) {
|
14
|
-
json.dependencies['@angular/cli'] = angularCliVersion;
|
15
|
-
shouldFormat = true;
|
16
|
-
}
|
17
|
-
return json;
|
18
|
-
});
|
19
|
-
if (shouldFormat) {
|
20
|
-
await (0, devkit_1.formatFiles)(tree);
|
21
|
-
}
|
22
|
-
}
|
@@ -1,34 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.default = default_1;
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
5
|
-
const path_1 = require("path");
|
6
|
-
const libraryExecutors = [
|
7
|
-
'@angular-devkit/build-angular:ng-packagr',
|
8
|
-
'@nrwl/angular:ng-packagr-lite',
|
9
|
-
'@nrwl/angular:package',
|
10
|
-
];
|
11
|
-
async function default_1(tree) {
|
12
|
-
const projects = (0, devkit_1.getProjects)(tree);
|
13
|
-
for (const [, project] of projects) {
|
14
|
-
if (!Object.values(project.targets ?? {}).some((target) => libraryExecutors.includes(target.executor))) {
|
15
|
-
continue;
|
16
|
-
}
|
17
|
-
(0, devkit_1.visitNotIgnoredFiles)(tree, project.root, (filePath) => {
|
18
|
-
if ((0, path_1.basename)(filePath) !== 'package.json' ||
|
19
|
-
(0, devkit_1.normalizePath)(filePath) ===
|
20
|
-
(0, devkit_1.joinPathFragments)(project.root, 'package.json')) {
|
21
|
-
return;
|
22
|
-
}
|
23
|
-
const json = (0, devkit_1.readJson)(tree, filePath);
|
24
|
-
if (json.ngPackage) {
|
25
|
-
// Migrate ng-packagr config to an ng-packagr config file.
|
26
|
-
const configFilePath = (0, devkit_1.joinPathFragments)((0, path_1.dirname)(filePath), 'ng-package.json');
|
27
|
-
(0, devkit_1.writeJson)(tree, configFilePath, json.ngPackage);
|
28
|
-
}
|
29
|
-
// Delete package.json as it is no longer needed in APF 14.
|
30
|
-
tree.delete(filePath);
|
31
|
-
});
|
32
|
-
}
|
33
|
-
await (0, devkit_1.formatFiles)(tree);
|
34
|
-
}
|
@@ -1,17 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.default = default_1;
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
5
|
-
async function default_1(tree) {
|
6
|
-
let shouldFormat = false;
|
7
|
-
(0, devkit_1.updateJson)(tree, 'package.json', (json) => {
|
8
|
-
if (json.scripts?.postinstall?.includes('ngcc ')) {
|
9
|
-
json.scripts.postinstall = json.scripts.postinstall.replace(/(.*)(ngcc --properties es2015 )(.*)/, '$1ngcc --properties es2020 $3');
|
10
|
-
shouldFormat = true;
|
11
|
-
}
|
12
|
-
return json;
|
13
|
-
});
|
14
|
-
if (shouldFormat) {
|
15
|
-
await (0, devkit_1.formatFiles)(tree);
|
16
|
-
}
|
17
|
-
}
|
@@ -1,73 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.default = default_1;
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
5
|
-
const tsquery_1 = require("@phenomnomnominal/tsquery");
|
6
|
-
const typescript_1 = require("typescript");
|
7
|
-
async function default_1(tree) {
|
8
|
-
const printer = (0, typescript_1.createPrinter)();
|
9
|
-
const projects = await getProjectsWithAngularRouter(tree);
|
10
|
-
for (const project of projects) {
|
11
|
-
(0, devkit_1.visitNotIgnoredFiles)(tree, project.root, (filePath) => {
|
12
|
-
// we are only interested in .ts files
|
13
|
-
if (!filePath.endsWith('.ts')) {
|
14
|
-
return;
|
15
|
-
}
|
16
|
-
const content = tree.read(filePath, 'utf-8');
|
17
|
-
const ast = tsquery_1.tsquery.ast(content);
|
18
|
-
const routerModuleForRootCall = getRouterModuleForRootCall(ast);
|
19
|
-
if (!routerModuleForRootCall) {
|
20
|
-
return;
|
21
|
-
}
|
22
|
-
const initialNavigationAssignment = getInitialNavigationAssignment(routerModuleForRootCall.arguments[1]);
|
23
|
-
if (!initialNavigationAssignment) {
|
24
|
-
return;
|
25
|
-
}
|
26
|
-
const updatedInitialNavigationAssignment = printer.printNode(typescript_1.EmitHint.Unspecified, typescript_1.factory.updatePropertyAssignment(initialNavigationAssignment, initialNavigationAssignment.name, typescript_1.factory.createIdentifier(`'enabledBlocking'`)), initialNavigationAssignment.getSourceFile());
|
27
|
-
const updatedContent = `${content.slice(0, initialNavigationAssignment.getStart())}${updatedInitialNavigationAssignment}${content.slice(initialNavigationAssignment.getEnd())}`;
|
28
|
-
tree.write(filePath, updatedContent);
|
29
|
-
});
|
30
|
-
}
|
31
|
-
await (0, devkit_1.formatFiles)(tree);
|
32
|
-
}
|
33
|
-
function getInitialNavigationAssignment(extraOptionsLiteral) {
|
34
|
-
for (const prop of extraOptionsLiteral.properties) {
|
35
|
-
if ((0, typescript_1.isPropertyAssignment)(prop) &&
|
36
|
-
((0, typescript_1.isIdentifier)(prop.name) || (0, typescript_1.isStringLiteralLike)(prop.name)) &&
|
37
|
-
prop.name.text === 'initialNavigation' &&
|
38
|
-
needsMigration(prop)) {
|
39
|
-
return prop;
|
40
|
-
}
|
41
|
-
}
|
42
|
-
return null;
|
43
|
-
}
|
44
|
-
async function getProjectsWithAngularRouter(tree) {
|
45
|
-
const projectGraph = await (0, devkit_1.createProjectGraphAsync)();
|
46
|
-
return Object.entries(projectGraph.dependencies)
|
47
|
-
.filter(([node, dep]) => dep.some(({ target }) => target === 'npm:@angular/router' &&
|
48
|
-
!projectGraph.externalNodes?.[node]))
|
49
|
-
.map(([projectName]) => (0, devkit_1.readProjectConfiguration)(tree, projectName));
|
50
|
-
}
|
51
|
-
function getRouterModuleForRootCall(sourceFile) {
|
52
|
-
// narrow down call expressions
|
53
|
-
const routerModuleForRootCalls = (0, tsquery_1.tsquery)(sourceFile, 'CallExpression:has(PropertyAccessExpression:has(Identifier[name=RouterModule]):has(Identifier[name=forRoot]))', { visitAllChildren: true });
|
54
|
-
for (const node of routerModuleForRootCalls) {
|
55
|
-
if (isRouterModuleForRoot(node) &&
|
56
|
-
node.arguments.length >= 2 &&
|
57
|
-
(0, typescript_1.isObjectLiteralExpression)(node.arguments[1])) {
|
58
|
-
return node;
|
59
|
-
}
|
60
|
-
}
|
61
|
-
return null;
|
62
|
-
}
|
63
|
-
function isRouterModuleForRoot(node) {
|
64
|
-
// make sure is not an outer call expression (NgModule call)
|
65
|
-
return ((0, typescript_1.isPropertyAccessExpression)(node.expression) &&
|
66
|
-
(0, typescript_1.isIdentifier)(node.expression.expression) &&
|
67
|
-
node.expression.expression.text === 'RouterModule' &&
|
68
|
-
(0, typescript_1.isIdentifier)(node.expression.name) &&
|
69
|
-
node.expression.name.text === 'forRoot');
|
70
|
-
}
|
71
|
-
function needsMigration(node) {
|
72
|
-
return ((0, typescript_1.isStringLiteralLike)(node.initializer) && node.initializer.text === 'enabled');
|
73
|
-
}
|
@@ -1,155 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.default = default_1;
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
5
|
-
const devkit_2 = require("@nx/devkit");
|
6
|
-
const tsquery_1 = require("@phenomnomnominal/tsquery");
|
7
|
-
const path_1 = require("path");
|
8
|
-
const jestExecutor = '@nrwl/jest:jest';
|
9
|
-
const executors = [
|
10
|
-
'@angular-devkit/build-angular:browser',
|
11
|
-
'@angular-devkit/build-angular:karma',
|
12
|
-
'@angular-devkit/build-angular:ng-packagr',
|
13
|
-
'@nrwl/angular:webpack-browser',
|
14
|
-
'@nrwl/angular:delegate-build',
|
15
|
-
'@nrwl/angular:ng-packagr-lite',
|
16
|
-
'@nrwl/angular:package',
|
17
|
-
];
|
18
|
-
const skipTargets = ['es2020', 'es2021', 'es2022', 'esnext'];
|
19
|
-
async function default_1(tree) {
|
20
|
-
const tsConfigPaths = await collectTsConfigPaths(tree);
|
21
|
-
for (const tsConfigPath of tsConfigPaths) {
|
22
|
-
(0, devkit_2.updateJson)(tree, tsConfigPath, (json) => {
|
23
|
-
if (!json.compilerOptions?.target ||
|
24
|
-
(json.compilerOptions?.target &&
|
25
|
-
!skipTargets.includes(json.compilerOptions.target.toLowerCase()))) {
|
26
|
-
json.compilerOptions ??= {};
|
27
|
-
json.compilerOptions.target = 'es2020';
|
28
|
-
}
|
29
|
-
return json;
|
30
|
-
}, {
|
31
|
-
allowTrailingComma: true,
|
32
|
-
disallowComments: false,
|
33
|
-
});
|
34
|
-
}
|
35
|
-
await (0, devkit_2.formatFiles)(tree);
|
36
|
-
}
|
37
|
-
async function collectTsConfigPaths(tree) {
|
38
|
-
const uniqueTsConfigs = new Set([]);
|
39
|
-
const projectGraph = await (0, devkit_2.createProjectGraphAsync)();
|
40
|
-
const angularProjects = Object.entries(projectGraph.dependencies)
|
41
|
-
.filter(([node, dep]) => dep.some(({ target }) => target === 'npm:@angular/core' && !projectGraph.externalNodes?.[node]))
|
42
|
-
.map(([projectName]) => ({
|
43
|
-
projectName,
|
44
|
-
project: (0, devkit_2.readProjectConfiguration)(tree, projectName),
|
45
|
-
}));
|
46
|
-
for (const { projectName, project } of angularProjects) {
|
47
|
-
const tsConfigPath = (0, devkit_2.joinPathFragments)(project.root, 'tsconfig.json');
|
48
|
-
if (tree.exists(tsConfigPath)) {
|
49
|
-
uniqueTsConfigs.add(tsConfigPath);
|
50
|
-
const targetTsConfigPaths = getProjectTsConfigPaths(tree, project, projectName, false);
|
51
|
-
targetTsConfigPaths.forEach((tsConfigPath) => {
|
52
|
-
const tsConfig = (0, devkit_1.readJson)(tree, tsConfigPath, {
|
53
|
-
allowTrailingComma: true,
|
54
|
-
disallowComments: false,
|
55
|
-
});
|
56
|
-
if (tsConfig.compilerOptions?.target) {
|
57
|
-
uniqueTsConfigs.add(tsConfigPath);
|
58
|
-
}
|
59
|
-
});
|
60
|
-
continue;
|
61
|
-
}
|
62
|
-
const tsConfigPaths = getProjectTsConfigPaths(tree, project, projectName);
|
63
|
-
for (const tsConfigPath of tsConfigPaths) {
|
64
|
-
uniqueTsConfigs.add(tsConfigPath);
|
65
|
-
}
|
66
|
-
}
|
67
|
-
return Array.from(uniqueTsConfigs);
|
68
|
-
}
|
69
|
-
function getProjectTsConfigPaths(tree, project, projectName, shouldWarn = true) {
|
70
|
-
const tsConfigPaths = new Set();
|
71
|
-
for (const [targetName, target] of Object.entries(project.targets || {})) {
|
72
|
-
if (executors.includes(target.executor)) {
|
73
|
-
const tsConfigPathsFromTarget = getPathValuesFromTarget(target, 'tsConfig');
|
74
|
-
tsConfigPathsFromTarget.forEach((tsConfigPath) => {
|
75
|
-
if (tree.exists(tsConfigPath)) {
|
76
|
-
tsConfigPaths.add(tsConfigPath);
|
77
|
-
}
|
78
|
-
else if (shouldWarn) {
|
79
|
-
devkit_2.logger.warn(`The "${tsConfigPath}" file specified in the "${targetName}" target of the "${projectName}" project could not be found. ` +
|
80
|
-
'Skipping setting the target to ES2020.');
|
81
|
-
}
|
82
|
-
});
|
83
|
-
}
|
84
|
-
else if (target.executor === jestExecutor) {
|
85
|
-
const tsConfigPathsFromJestTarget = getTsConfigPathsFromJestTarget(tree, target, targetName, projectName, shouldWarn);
|
86
|
-
tsConfigPathsFromJestTarget.forEach((tsConfigPath) => {
|
87
|
-
tsConfigPaths.add(tsConfigPath);
|
88
|
-
});
|
89
|
-
}
|
90
|
-
else if (shouldWarn) {
|
91
|
-
devkit_2.logger.warn(`The "${targetName}" target of the "${projectName}" project is using an executor not supported by the migration. ` +
|
92
|
-
'Skipping setting the TS target to ES2020 for the project.');
|
93
|
-
}
|
94
|
-
}
|
95
|
-
return Array.from(tsConfigPaths);
|
96
|
-
}
|
97
|
-
function getTsConfigPathsFromJestTarget(tree, target, targetName, projectName, shouldWarn) {
|
98
|
-
const tsConfigPaths = [];
|
99
|
-
const jestConfigPaths = getPathValuesFromTarget(target, 'jestConfig');
|
100
|
-
if (!jestConfigPaths.length && shouldWarn) {
|
101
|
-
devkit_2.logger.warn(`The "${targetName}" target of the "${projectName}" project is using the "${jestExecutor}" executor but no "jestConfig" property was specified. ` +
|
102
|
-
'Skipping setting the TS compilation target to ES2020 for the project.');
|
103
|
-
}
|
104
|
-
for (const jestConfigPath of jestConfigPaths) {
|
105
|
-
const tsConfigPath = getTsConfigFromJestConfig(tree, jestConfigPath, targetName, projectName, shouldWarn);
|
106
|
-
if (tsConfigPath) {
|
107
|
-
tsConfigPaths.push(tsConfigPath);
|
108
|
-
}
|
109
|
-
}
|
110
|
-
return tsConfigPaths;
|
111
|
-
}
|
112
|
-
function getTsConfigFromJestConfig(tree, jestConfigPath, targetName, projectName, shouldWarn) {
|
113
|
-
if (!tree.exists(jestConfigPath)) {
|
114
|
-
if (shouldWarn) {
|
115
|
-
devkit_2.logger.warn(`The "${jestConfigPath}" file specified in the "${targetName}" target of the "${projectName}" project could not be found. ` +
|
116
|
-
`The TS config file used by the target can't be determined. Skipping setting the target to ES2020.`);
|
117
|
-
}
|
118
|
-
return undefined;
|
119
|
-
}
|
120
|
-
const jestConfig = tree.read(jestConfigPath, 'utf-8');
|
121
|
-
const jestConfigAst = tsquery_1.tsquery.ast(jestConfig);
|
122
|
-
const tsJestTsConfigStringLiteral = (0, tsquery_1.tsquery)(jestConfigAst, 'PropertyAssignment:has(Identifier[name=globals]) PropertyAssignment:has(StringLiteral[value=ts-jest]) PropertyAssignment:has(Identifier[name=tsconfig]) > StringLiteral', { visitAllChildren: true })[0];
|
123
|
-
if (!tsJestTsConfigStringLiteral) {
|
124
|
-
if (shouldWarn) {
|
125
|
-
devkit_2.logger.warn(`Couldn't find the "tsconfig" property for "ts-jest" in the Jest configuration file "${jestConfigPath}" specified in the ` +
|
126
|
-
`"${targetName}" target of the "${projectName}" project. The TS config file used by the target can't be determined. ` +
|
127
|
-
'Skipping setting the target to ES2020.');
|
128
|
-
}
|
129
|
-
return undefined;
|
130
|
-
}
|
131
|
-
const tsJestTsConfigValue = tsJestTsConfigStringLiteral
|
132
|
-
.getText()
|
133
|
-
.replace(/['"]/g, '');
|
134
|
-
const tsConfigPath = tsJestTsConfigValue.replace('<rootDir>', (0, path_1.dirname)(jestConfigPath));
|
135
|
-
if (!tree.exists(tsConfigPath)) {
|
136
|
-
if (shouldWarn) {
|
137
|
-
devkit_2.logger.warn(`The "${tsJestTsConfigValue}" file specified in the Jest configuration file "${jestConfigPath}" of the "${targetName}" target ` +
|
138
|
-
`of the "${projectName}" project could not be found. Skipping setting the target to ES2020.`);
|
139
|
-
}
|
140
|
-
return undefined;
|
141
|
-
}
|
142
|
-
return tsConfigPath;
|
143
|
-
}
|
144
|
-
function getPathValuesFromTarget(target, option) {
|
145
|
-
const values = [];
|
146
|
-
if (target.options?.[option]) {
|
147
|
-
values.push(target.options[option]);
|
148
|
-
}
|
149
|
-
Object.values(target.configurations ?? {}).forEach((options) => {
|
150
|
-
if (options[option]) {
|
151
|
-
values.push(options[option]);
|
152
|
-
}
|
153
|
-
});
|
154
|
-
return values;
|
155
|
-
}
|
@@ -1,5 +0,0 @@
|
|
1
|
-
import type { Tree } from '@nx/devkit';
|
2
|
-
export declare function replaceNrwlAngularMfImport(fileContents: string): string;
|
3
|
-
export declare function replaceExportedMFETypes(fileContents: string): string;
|
4
|
-
export declare function renameSetupMfeGeneratorUsages(fileContents: string): string;
|
5
|
-
export default function (tree: Tree): Promise<void>;
|
@@ -1,90 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.replaceNrwlAngularMfImport = replaceNrwlAngularMfImport;
|
4
|
-
exports.replaceExportedMFETypes = replaceExportedMFETypes;
|
5
|
-
exports.renameSetupMfeGeneratorUsages = renameSetupMfeGeneratorUsages;
|
6
|
-
exports.default = default_1;
|
7
|
-
const devkit_1 = require("@nx/devkit");
|
8
|
-
const path_1 = require("path");
|
9
|
-
const tsquery_1 = require("@phenomnomnominal/tsquery");
|
10
|
-
const NRWL_ANGULAR_MFE_STATIC_IMPORT_SELECTOR = 'ImportDeclaration > StringLiteral[value="@nrwl/angular/mfe"]';
|
11
|
-
const NRWL_ANGULAR_MFE_DYNAMIC_IMPORT_SELECTOR = 'CallExpression:has(ImportKeyword) > StringLiteral[value="@nrwl/angular/mfe"]';
|
12
|
-
const NRWL_ANGULAR_MFE_TYPES_SELECTOR = 'ImportDeclaration:has(StringLiteral[value=@nrwl/angular/module-federation]) > ImportClause > NamedImports';
|
13
|
-
function replaceNrwlAngularMfImport(fileContents) {
|
14
|
-
let fileAst = tsquery_1.tsquery.ast(fileContents);
|
15
|
-
if (fileContents.includes('@nrwl/angular/mfe')) {
|
16
|
-
// This file definitely contains the string, however, we're interested in whether it is an import
|
17
|
-
const staticQueryResult = (0, tsquery_1.tsquery)(fileAst, NRWL_ANGULAR_MFE_STATIC_IMPORT_SELECTOR, {
|
18
|
-
visitAllChildren: true,
|
19
|
-
});
|
20
|
-
if (staticQueryResult && staticQueryResult.length > 0) {
|
21
|
-
fileContents = `${fileContents.slice(0, staticQueryResult[0].getStart())}'@nrwl/angular/mf'${fileContents.slice(staticQueryResult[0].getEnd())}`;
|
22
|
-
}
|
23
|
-
fileAst = tsquery_1.tsquery.ast(fileContents);
|
24
|
-
const dynamicQueryResult = (0, tsquery_1.tsquery)(fileAst, NRWL_ANGULAR_MFE_DYNAMIC_IMPORT_SELECTOR, {
|
25
|
-
visitAllChildren: true,
|
26
|
-
});
|
27
|
-
if (dynamicQueryResult && dynamicQueryResult.length > 0) {
|
28
|
-
fileContents = `${fileContents.slice(0, dynamicQueryResult[0].getStart())}'@nrwl/angular/mf'${fileContents.slice(dynamicQueryResult[0].getEnd())}`;
|
29
|
-
}
|
30
|
-
}
|
31
|
-
return fileContents;
|
32
|
-
}
|
33
|
-
function replaceExportedMFETypes(fileContents) {
|
34
|
-
const ast = tsquery_1.tsquery.ast(fileContents);
|
35
|
-
const queryResult = (0, tsquery_1.tsquery)(ast, NRWL_ANGULAR_MFE_TYPES_SELECTOR, {
|
36
|
-
visitAllChildren: true,
|
37
|
-
});
|
38
|
-
if (queryResult && queryResult.length > 0) {
|
39
|
-
const TYPES_IMPORTED_FROM_NRWL_REGEX = /(MFERemotes|MFEConfig)+.*from+.+(@nrwl\/angular\/module-federation)+/g;
|
40
|
-
if (TYPES_IMPORTED_FROM_NRWL_REGEX.test(fileContents)) {
|
41
|
-
fileContents = fileContents.replace(/MFERemotes/g, 'MFRemotes');
|
42
|
-
fileContents = fileContents.replace(/MFEConfig/g, 'MFConfig');
|
43
|
-
}
|
44
|
-
}
|
45
|
-
return fileContents;
|
46
|
-
}
|
47
|
-
function renameSetupMfeGeneratorUsages(fileContents) {
|
48
|
-
// Attempt to update any custom generator usage of the changed generators
|
49
|
-
const NRWL_SETUP_MFE_IMPORT_SELECTOR = 'ImportDeclaration:has(StringLiteral[value=@nrwl/angular/generators]) > ImportClause:has(NamedImports:has(ImportSpecifier > Identifier[name=setupMfe]))';
|
50
|
-
const SETUP_MFE_IMPORTED_FROM_NRWL_REGEX = /(setupMfe)+.*from+.+(@nrwl\/angular\/generators)+/g;
|
51
|
-
const SETUP_MFE_FUNCTION_CALL_MFE_TYPE_PROPERTY_ASSIGNMENT_SELECTOR = 'CallExpression:has(Identifier[name=setupMf]) ObjectLiteralExpression > PropertyAssignment > Identifier[name=mfeType]';
|
52
|
-
let ast = tsquery_1.tsquery.ast(fileContents);
|
53
|
-
let queryResult = (0, tsquery_1.tsquery)(ast, NRWL_SETUP_MFE_IMPORT_SELECTOR, {
|
54
|
-
visitAllChildren: true,
|
55
|
-
});
|
56
|
-
if (queryResult &&
|
57
|
-
queryResult.length > 0 &&
|
58
|
-
SETUP_MFE_IMPORTED_FROM_NRWL_REGEX.test(fileContents)) {
|
59
|
-
fileContents = fileContents.replace(/setupMfe/g, 'setupMf');
|
60
|
-
}
|
61
|
-
ast = tsquery_1.tsquery.ast(fileContents);
|
62
|
-
queryResult = (0, tsquery_1.tsquery)(ast, SETUP_MFE_FUNCTION_CALL_MFE_TYPE_PROPERTY_ASSIGNMENT_SELECTOR, {
|
63
|
-
visitAllChildren: true,
|
64
|
-
});
|
65
|
-
while (queryResult && queryResult.length > 0) {
|
66
|
-
const node = queryResult[0];
|
67
|
-
fileContents = `${fileContents.slice(0, node.getStart())}mfType${fileContents.slice(node.getEnd())}`;
|
68
|
-
ast = tsquery_1.tsquery.ast(fileContents);
|
69
|
-
queryResult = (0, tsquery_1.tsquery)(ast, SETUP_MFE_FUNCTION_CALL_MFE_TYPE_PROPERTY_ASSIGNMENT_SELECTOR, {
|
70
|
-
visitAllChildren: true,
|
71
|
-
});
|
72
|
-
}
|
73
|
-
return fileContents;
|
74
|
-
}
|
75
|
-
async function default_1(tree) {
|
76
|
-
(0, devkit_1.visitNotIgnoredFiles)(tree, '/', (path) => {
|
77
|
-
const pathExtName = (0, path_1.extname)(path);
|
78
|
-
if (pathExtName !== '.ts' && pathExtName !== '.js') {
|
79
|
-
return;
|
80
|
-
}
|
81
|
-
let fileContents = tree.read(path, 'utf-8');
|
82
|
-
fileContents = replaceNrwlAngularMfImport(fileContents);
|
83
|
-
if (pathExtName === '.ts') {
|
84
|
-
// Only TS files can import types and interfaces
|
85
|
-
fileContents = replaceExportedMFETypes(fileContents);
|
86
|
-
fileContents = renameSetupMfeGeneratorUsages(fileContents);
|
87
|
-
}
|
88
|
-
tree.write(path, fileContents);
|
89
|
-
});
|
90
|
-
}
|
@@ -1,22 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.default = default_1;
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
5
|
-
const angularCliVersion = '~14.1.0';
|
6
|
-
async function default_1(tree) {
|
7
|
-
let shouldFormat = false;
|
8
|
-
(0, devkit_1.updateJson)(tree, 'package.json', (json) => {
|
9
|
-
if (json.devDependencies?.['@angular/cli']) {
|
10
|
-
json.devDependencies['@angular/cli'] = angularCliVersion;
|
11
|
-
shouldFormat = true;
|
12
|
-
}
|
13
|
-
else if (json.dependencies?.['@angular/cli']) {
|
14
|
-
json.dependencies['@angular/cli'] = angularCliVersion;
|
15
|
-
shouldFormat = true;
|
16
|
-
}
|
17
|
-
return json;
|
18
|
-
});
|
19
|
-
if (shouldFormat) {
|
20
|
-
await (0, devkit_1.formatFiles)(tree);
|
21
|
-
}
|
22
|
-
}
|
@@ -1,22 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.default = default_1;
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
5
|
-
const angularCliVersion = '~14.2.0';
|
6
|
-
async function default_1(tree) {
|
7
|
-
let shouldFormat = false;
|
8
|
-
(0, devkit_1.updateJson)(tree, 'package.json', (json) => {
|
9
|
-
if (json.devDependencies?.['@angular/cli']) {
|
10
|
-
json.devDependencies['@angular/cli'] = angularCliVersion;
|
11
|
-
shouldFormat = true;
|
12
|
-
}
|
13
|
-
else if (json.dependencies?.['@angular/cli']) {
|
14
|
-
json.dependencies['@angular/cli'] = angularCliVersion;
|
15
|
-
shouldFormat = true;
|
16
|
-
}
|
17
|
-
return json;
|
18
|
-
});
|
19
|
-
if (shouldFormat) {
|
20
|
-
await (0, devkit_1.formatFiles)(tree);
|
21
|
-
}
|
22
|
-
}
|
@@ -1,21 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.default = renameWebpackServer;
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
5
|
-
function renameWebpackServer(tree) {
|
6
|
-
const projects = (0, devkit_1.getProjects)(tree);
|
7
|
-
const oldExecutorName = '@nrwl/angular:webpack-server';
|
8
|
-
const newExecutorName = '@nrwl/angular:webpack-dev-server';
|
9
|
-
for (const [projectName, project] of projects.entries()) {
|
10
|
-
let stringifiedProject = JSON.stringify(project);
|
11
|
-
if (!stringifiedProject.includes(oldExecutorName)) {
|
12
|
-
continue;
|
13
|
-
}
|
14
|
-
for (const [targetName, target] of Object.entries(project.targets)) {
|
15
|
-
if (target.executor === oldExecutorName) {
|
16
|
-
target.executor = newExecutorName;
|
17
|
-
}
|
18
|
-
}
|
19
|
-
(0, devkit_1.updateProjectConfiguration)(tree, projectName, project);
|
20
|
-
}
|
21
|
-
}
|
@@ -1,41 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.default = default_1;
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
5
|
-
const executor_options_utils_1 = require("@nx/devkit/src/generators/executor-options-utils");
|
6
|
-
async function default_1(tree) {
|
7
|
-
const nxJson = (0, devkit_1.readNxJson)(tree);
|
8
|
-
const karmaTargets = getKarmaTargetNames(tree);
|
9
|
-
const hasProductionFileset = !!nxJson.namedInputs?.production;
|
10
|
-
if (karmaTargets.size > 0 && hasProductionFileset) {
|
11
|
-
const productionFileset = new Set(nxJson.namedInputs.production);
|
12
|
-
for (const exclusion of [
|
13
|
-
'!{projectRoot}/**/*.spec.[jt]s',
|
14
|
-
'!{projectRoot}/tsconfig.spec.json',
|
15
|
-
'!{projectRoot}/karma.conf.js',
|
16
|
-
]) {
|
17
|
-
productionFileset.add(exclusion);
|
18
|
-
}
|
19
|
-
nxJson.namedInputs.production = Array.from(productionFileset);
|
20
|
-
}
|
21
|
-
for (const targetName of karmaTargets) {
|
22
|
-
nxJson.targetDefaults ??= {};
|
23
|
-
const jestTargetDefaults = (nxJson.targetDefaults[targetName] ??= {});
|
24
|
-
jestTargetDefaults.inputs ??= [
|
25
|
-
'default',
|
26
|
-
hasProductionFileset ? '^production' : '^default',
|
27
|
-
...(tree.exists('karma.conf.js')
|
28
|
-
? ['{workspaceRoot}/karma.conf.js']
|
29
|
-
: []),
|
30
|
-
];
|
31
|
-
}
|
32
|
-
(0, devkit_1.updateNxJson)(tree, nxJson);
|
33
|
-
await (0, devkit_1.formatFiles)(tree);
|
34
|
-
}
|
35
|
-
function getKarmaTargetNames(tree) {
|
36
|
-
const karmaTargetNames = new Set();
|
37
|
-
(0, executor_options_utils_1.forEachExecutorOptions)(tree, '@angular-devkit/build-angular:karma', (_, __, target) => {
|
38
|
-
karmaTargetNames.add(target);
|
39
|
-
});
|
40
|
-
return karmaTargetNames;
|
41
|
-
}
|