@nx/angular 21.1.1 → 21.2.0-canary.20250522-7e0719c
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 +9 -9
- package/src/generators/convert-to-rspack/convert-to-rspack.js +2 -6
- package/src/generators/convert-to-rspack/lib/get-custom-webpack-config.js +1 -1
- package/src/generators/host/host.js +21 -1
- package/src/generators/host/schema.d.ts +1 -0
- package/src/generators/host/schema.json +6 -0
- package/src/generators/remote/remote.js +23 -0
- package/src/generators/remote/schema.d.ts +1 -0
- package/src/generators/remote/schema.json +6 -0
- package/src/generators/utils/assert-mf-utils.d.ts +1 -0
- package/src/generators/utils/assert-mf-utils.js +11 -0
- package/src/utils/backward-compatible-versions.js +2 -0
- package/src/utils/versions.d.ts +1 -0
- package/src/utils/versions.js +2 -1
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@nx/angular",
|
3
|
-
"version": "21.
|
3
|
+
"version": "21.2.0-canary.20250522-7e0719c",
|
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": {
|
@@ -67,14 +67,14 @@
|
|
67
67
|
"semver": "^7.5.3",
|
68
68
|
"tslib": "^2.3.0",
|
69
69
|
"webpack-merge": "^5.8.0",
|
70
|
-
"@nx/devkit": "21.
|
71
|
-
"@nx/js": "21.
|
72
|
-
"@nx/eslint": "21.
|
73
|
-
"@nx/webpack": "21.
|
74
|
-
"@nx/rspack": "21.
|
75
|
-
"@nx/module-federation": "21.
|
76
|
-
"@nx/web": "21.
|
77
|
-
"@nx/workspace": "21.
|
70
|
+
"@nx/devkit": "21.2.0-canary.20250522-7e0719c",
|
71
|
+
"@nx/js": "21.2.0-canary.20250522-7e0719c",
|
72
|
+
"@nx/eslint": "21.2.0-canary.20250522-7e0719c",
|
73
|
+
"@nx/webpack": "21.2.0-canary.20250522-7e0719c",
|
74
|
+
"@nx/rspack": "21.2.0-canary.20250522-7e0719c",
|
75
|
+
"@nx/module-federation": "21.2.0-canary.20250522-7e0719c",
|
76
|
+
"@nx/web": "21.2.0-canary.20250522-7e0719c",
|
77
|
+
"@nx/workspace": "21.2.0-canary.20250522-7e0719c",
|
78
78
|
"piscina": "^4.4.0"
|
79
79
|
},
|
80
80
|
"peerDependencies": {
|
@@ -27,12 +27,7 @@ const RENAMED_OPTIONS = {
|
|
27
27
|
ngswConfigPath: 'serviceWorker',
|
28
28
|
};
|
29
29
|
const DEFAULT_PORT = 4200;
|
30
|
-
const REMOVED_OPTIONS = [
|
31
|
-
'buildOptimizer',
|
32
|
-
'buildTarget',
|
33
|
-
'browserTarget',
|
34
|
-
'publicHost',
|
35
|
-
];
|
30
|
+
const REMOVED_OPTIONS = ['buildOptimizer', 'buildTarget', 'browserTarget'];
|
36
31
|
function normalizeFromProjectRoot(tree, path, projectRoot) {
|
37
32
|
if (projectRoot === '.') {
|
38
33
|
if (!path.startsWith('./')) {
|
@@ -349,6 +344,7 @@ async function convertToRspack(tree, schema) {
|
|
349
344
|
if (!schema.skipInstall) {
|
350
345
|
const installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
|
351
346
|
'@nx/angular-rspack': versions_1.angularRspackVersion,
|
347
|
+
'webpack-merge': versions_1.webpackMergeVersion,
|
352
348
|
'ts-node': versions_1.tsNodeVersion,
|
353
349
|
});
|
354
350
|
tasks.push(installTask);
|
@@ -30,7 +30,7 @@ function convertWebpackConfigToUseNxModuleFederationPlugin(webpackConfigContents
|
|
30
30
|
const withModuleFederationImportNodes = (0, tsquery_1.tsquery)(ast, 'ImportDeclaration:has(StringLiteral[value=@nx/module-federation/angular])');
|
31
31
|
if (withModuleFederationImportNodes.length > 0) {
|
32
32
|
const withModuleFederationImportNode = withModuleFederationImportNodes[0];
|
33
|
-
newWebpackConfigContents = `${webpackConfigContents.slice(0, withModuleFederationImportNode.getStart())}import { NxModuleFederationPlugin, NxModuleFederationDevServerPlugin } from '@nx/module-federation/
|
33
|
+
newWebpackConfigContents = `${webpackConfigContents.slice(0, withModuleFederationImportNode.getStart())}import { NxModuleFederationPlugin, NxModuleFederationDevServerPlugin } from '@nx/module-federation/angular';${webpackConfigContents.slice(withModuleFederationImportNode.getEnd())}`;
|
34
34
|
ast = tsquery_1.tsquery.ast(newWebpackConfigContents);
|
35
35
|
const exportedWithModuleFederationNodes = (0, tsquery_1.tsquery)(ast, 'ExportAssignment:has(CallExpression > Identifier[name=withModuleFederation])');
|
36
36
|
if (exportedWithModuleFederationNodes.length > 0) {
|
@@ -12,8 +12,14 @@ const remote_1 = tslib_1.__importDefault(require("../remote/remote"));
|
|
12
12
|
const setup_mf_1 = require("../setup-mf/setup-mf");
|
13
13
|
const add_mf_env_to_inputs_1 = require("../utils/add-mf-env-to-inputs");
|
14
14
|
const lib_1 = require("./lib");
|
15
|
+
const assert_mf_utils_1 = require("../utils/assert-mf-utils");
|
16
|
+
const convert_to_rspack_1 = tslib_1.__importDefault(require("../convert-to-rspack/convert-to-rspack"));
|
15
17
|
async function host(tree, schema) {
|
16
18
|
(0, ts_solution_setup_1.assertNotUsingTsSolutionSetup)(tree, 'angular', 'host');
|
19
|
+
// TODO: Replace with Rspack when confidence is high enough
|
20
|
+
schema.bundler ??= 'webpack';
|
21
|
+
const isRspack = schema.bundler === 'rspack';
|
22
|
+
(0, assert_mf_utils_1.assertRspackIsCSR)(schema.bundler, schema.ssr ?? false, schema.serverRouting ?? false);
|
17
23
|
const { typescriptConfiguration = true, ...options } = schema;
|
18
24
|
options.standalone = options.standalone ?? true;
|
19
25
|
const projects = (0, devkit_1.getProjects)(tree);
|
@@ -75,7 +81,8 @@ async function host(tree, schema) {
|
|
75
81
|
let ssrInstallTask = await (0, lib_1.updateSsrSetup)(tree, options, hostProjectName, typescriptConfiguration);
|
76
82
|
installTasks.push(ssrInstallTask);
|
77
83
|
}
|
78
|
-
for (
|
84
|
+
for (let i = 0; i < remotesToGenerate.length; i++) {
|
85
|
+
const remote = remotesToGenerate[i];
|
79
86
|
const remoteDirectory = options.directory
|
80
87
|
? (0, devkit_1.joinPathFragments)(options.directory, '..', remote)
|
81
88
|
: appRoot === '.'
|
@@ -86,12 +93,25 @@ async function host(tree, schema) {
|
|
86
93
|
name: remote,
|
87
94
|
directory: remoteDirectory,
|
88
95
|
host: hostProjectName,
|
96
|
+
port: isRspack ? 4200 + i + 1 : undefined,
|
89
97
|
skipFormat: true,
|
90
98
|
standalone: options.standalone,
|
91
99
|
typescriptConfiguration,
|
92
100
|
});
|
93
101
|
}
|
94
102
|
(0, add_mf_env_to_inputs_1.addMfEnvToTargetDefaultInputs)(tree);
|
103
|
+
if (isRspack) {
|
104
|
+
await (0, convert_to_rspack_1.default)(tree, {
|
105
|
+
project: hostProjectName,
|
106
|
+
skipInstall: options.skipPackageJson,
|
107
|
+
skipFormat: true,
|
108
|
+
});
|
109
|
+
}
|
110
|
+
const project = (0, devkit_1.readProjectConfiguration)(tree, hostProjectName);
|
111
|
+
project.targets.serve ??= {};
|
112
|
+
project.targets.serve.options ??= {};
|
113
|
+
project.targets.serve.options.port = 4200;
|
114
|
+
(0, devkit_1.updateProjectConfiguration)(tree, hostProjectName, project);
|
95
115
|
if (!options.skipFormat) {
|
96
116
|
await (0, devkit_1.formatFiles)(tree);
|
97
117
|
}
|
@@ -37,6 +37,12 @@
|
|
37
37
|
"x-priority": "important",
|
38
38
|
"alias": "producers"
|
39
39
|
},
|
40
|
+
"bundler": {
|
41
|
+
"type": "string",
|
42
|
+
"description": "The bundler to use for the host application.",
|
43
|
+
"default": "webpack",
|
44
|
+
"enum": ["webpack", "rspack"]
|
45
|
+
},
|
40
46
|
"dynamic": {
|
41
47
|
"type": "boolean",
|
42
48
|
"description": "Should the host application use dynamic federation?",
|
@@ -1,6 +1,7 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.remote = remote;
|
4
|
+
const tslib_1 = require("tslib");
|
4
5
|
const devkit_1 = require("@nx/devkit");
|
5
6
|
const project_name_and_root_utils_1 = require("@nx/devkit/src/generators/project-name-and-root-utils");
|
6
7
|
const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
|
@@ -10,8 +11,14 @@ const application_1 = require("../application/application");
|
|
10
11
|
const setup_mf_1 = require("../setup-mf/setup-mf");
|
11
12
|
const add_mf_env_to_inputs_1 = require("../utils/add-mf-env-to-inputs");
|
12
13
|
const lib_1 = require("./lib");
|
14
|
+
const assert_mf_utils_1 = require("../utils/assert-mf-utils");
|
15
|
+
const convert_to_rspack_1 = tslib_1.__importDefault(require("../convert-to-rspack/convert-to-rspack"));
|
13
16
|
async function remote(tree, schema) {
|
14
17
|
(0, ts_solution_setup_1.assertNotUsingTsSolutionSetup)(tree, 'angular', 'remote');
|
18
|
+
// TODO: Replace with Rspack when confidence is high enough
|
19
|
+
schema.bundler ??= 'webpack';
|
20
|
+
const isRspack = schema.bundler === 'rspack';
|
21
|
+
(0, assert_mf_utils_1.assertRspackIsCSR)(schema.bundler, schema.ssr ?? false, schema.serverRouting ?? false);
|
15
22
|
const { typescriptConfiguration = true, ...options } = schema;
|
16
23
|
options.standalone = options.standalone ?? true;
|
17
24
|
const projects = (0, devkit_1.getProjects)(tree);
|
@@ -75,6 +82,22 @@ async function remote(tree, schema) {
|
|
75
82
|
installTasks.push(ssrInstallTask);
|
76
83
|
}
|
77
84
|
(0, add_mf_env_to_inputs_1.addMfEnvToTargetDefaultInputs)(tree);
|
85
|
+
if (isRspack) {
|
86
|
+
await (0, convert_to_rspack_1.default)(tree, {
|
87
|
+
project: remoteProjectName,
|
88
|
+
skipInstall: options.skipPackageJson,
|
89
|
+
skipFormat: true,
|
90
|
+
});
|
91
|
+
}
|
92
|
+
const project = (0, devkit_1.readProjectConfiguration)(tree, remoteProjectName);
|
93
|
+
project.targets.serve ??= {};
|
94
|
+
project.targets.serve.options ??= {};
|
95
|
+
if (options.host) {
|
96
|
+
project.targets.serve.dependsOn ??= [];
|
97
|
+
project.targets.serve.dependsOn.push(`${options.host}:serve`);
|
98
|
+
}
|
99
|
+
project.targets.serve.options.port = port;
|
100
|
+
(0, devkit_1.updateProjectConfiguration)(tree, remoteProjectName, project);
|
78
101
|
if (!options.skipFormat) {
|
79
102
|
await (0, devkit_1.formatFiles)(tree);
|
80
103
|
}
|
@@ -42,6 +42,12 @@
|
|
42
42
|
"type": "number",
|
43
43
|
"description": "The port on which this app should be served."
|
44
44
|
},
|
45
|
+
"bundler": {
|
46
|
+
"type": "string",
|
47
|
+
"description": "The bundler to use for the remote application.",
|
48
|
+
"default": "webpack",
|
49
|
+
"enum": ["webpack", "rspack"]
|
50
|
+
},
|
45
51
|
"style": {
|
46
52
|
"description": "The file extension to be used for style files.",
|
47
53
|
"type": "string",
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare function assertRspackIsCSR(bundler: 'webpack' | 'rspack', ssr: boolean, serverRouting: boolean): void;
|
@@ -0,0 +1,11 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.assertRspackIsCSR = assertRspackIsCSR;
|
4
|
+
function assertRspackIsCSR(bundler, ssr, serverRouting) {
|
5
|
+
if (bundler === 'rspack' && serverRouting) {
|
6
|
+
throw new Error('Server Routing is not currently supported for Angular Rspack Module Federation. Please use webpack instead.');
|
7
|
+
}
|
8
|
+
if (bundler === 'rspack' && ssr) {
|
9
|
+
throw new Error('SSR is not currently supported for Angular Rspack Module Federation. Please use webpack instead.');
|
10
|
+
}
|
11
|
+
}
|
@@ -29,6 +29,7 @@ exports.backwardCompatibleVersions = {
|
|
29
29
|
typesNodeVersion: '18.16.9',
|
30
30
|
jasmineMarblesVersion: '^0.9.2',
|
31
31
|
jsoncEslintParserVersion: '^2.1.0',
|
32
|
+
webpackMergeVersion: '^5.8.0',
|
32
33
|
},
|
33
34
|
angularV18: {
|
34
35
|
angularVersion: '~18.2.0',
|
@@ -58,5 +59,6 @@ exports.backwardCompatibleVersions = {
|
|
58
59
|
typesNodeVersion: '18.16.9',
|
59
60
|
jasmineMarblesVersion: '^0.9.2',
|
60
61
|
jsoncEslintParserVersion: '^2.1.0',
|
62
|
+
webpackMergeVersion: '^5.8.0',
|
61
63
|
},
|
62
64
|
};
|
package/src/utils/versions.d.ts
CHANGED
@@ -15,6 +15,7 @@ export declare const typesExpressVersion = "^4.17.21";
|
|
15
15
|
export declare const browserSyncVersion = "^3.0.0";
|
16
16
|
export declare const moduleFederationNodeVersion = "^2.6.26";
|
17
17
|
export declare const moduleFederationEnhancedVersion = "^0.9.0";
|
18
|
+
export declare const webpackMergeVersion = "^5.8.0";
|
18
19
|
export declare const angularEslintVersion = "^19.2.0";
|
19
20
|
export declare const typescriptEslintVersion = "^7.16.0";
|
20
21
|
export declare const tailwindVersion = "^3.0.2";
|
package/src/utils/versions.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.jsoncEslintParserVersion = exports.jasmineMarblesVersion = exports.typesNodeVersion = exports.jestPresetAngularVersion = exports.tsNodeVersion = exports.autoprefixerVersion = exports.postcssUrlVersion = exports.postcssVersion = exports.tailwindVersion = exports.typescriptEslintVersion = exports.angularEslintVersion = exports.moduleFederationEnhancedVersion = exports.moduleFederationNodeVersion = exports.browserSyncVersion = exports.typesExpressVersion = exports.expressVersion = exports.typesCorsVersion = exports.corsVersion = exports.tsLibVersion = exports.angularJsVersion = exports.zoneJsVersion = exports.rxjsVersion = exports.ngrxVersion = exports.angularRspackVersion = exports.ngPackagrVersion = exports.angularDevkitVersion = exports.angularVersion = exports.nxVersion = void 0;
|
3
|
+
exports.jsoncEslintParserVersion = exports.jasmineMarblesVersion = exports.typesNodeVersion = exports.jestPresetAngularVersion = exports.tsNodeVersion = exports.autoprefixerVersion = exports.postcssUrlVersion = exports.postcssVersion = exports.tailwindVersion = exports.typescriptEslintVersion = exports.angularEslintVersion = exports.webpackMergeVersion = exports.moduleFederationEnhancedVersion = exports.moduleFederationNodeVersion = exports.browserSyncVersion = exports.typesExpressVersion = exports.expressVersion = exports.typesCorsVersion = exports.corsVersion = exports.tsLibVersion = exports.angularJsVersion = exports.zoneJsVersion = exports.rxjsVersion = exports.ngrxVersion = exports.angularRspackVersion = exports.ngPackagrVersion = exports.angularDevkitVersion = exports.angularVersion = exports.nxVersion = void 0;
|
4
4
|
exports.nxVersion = require('../../package.json').version;
|
5
5
|
exports.angularVersion = '~19.2.0';
|
6
6
|
exports.angularDevkitVersion = '~19.2.0';
|
@@ -18,6 +18,7 @@ exports.typesExpressVersion = '^4.17.21';
|
|
18
18
|
exports.browserSyncVersion = '^3.0.0';
|
19
19
|
exports.moduleFederationNodeVersion = '^2.6.26';
|
20
20
|
exports.moduleFederationEnhancedVersion = '^0.9.0';
|
21
|
+
exports.webpackMergeVersion = '^5.8.0';
|
21
22
|
exports.angularEslintVersion = '^19.2.0';
|
22
23
|
exports.typescriptEslintVersion = '^7.16.0';
|
23
24
|
exports.tailwindVersion = '^3.0.2';
|