@nx/react 19.5.1 → 19.5.3
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/mf/dynamic-federation.d.ts +1 -0
- package/mf/dynamic-federation.js +5 -1
- package/package.json +6 -6
- package/src/executors/module-federation-dev-server/module-federation-dev-server.impl.d.ts +0 -10
- package/src/executors/module-federation-dev-server/module-federation-dev-server.impl.js +25 -39
- package/src/generators/host/lib/add-module-federation-files.js +5 -1
- package/src/generators/remote/lib/add-remote-to-dynamic-host.js +7 -5
- package/src/utils/versions.d.ts +1 -1
- package/src/utils/versions.js +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export type ResolveRemoteUrlFunction = (remoteName: string) => string | Promise<string>;
|
|
2
2
|
export declare function setRemoteUrlResolver(_resolveRemoteUrl: ResolveRemoteUrlFunction): void;
|
|
3
3
|
export declare function setRemoteDefinitions(definitions: Record<string, string>): void;
|
|
4
|
+
export declare function setRemoteDefinition(remoteName: string, remoteUrl: string): void;
|
|
4
5
|
export declare function loadRemoteModule(remoteName: string, moduleName: string): Promise<any>;
|
package/mf/dynamic-federation.js
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.setRemoteUrlResolver = setRemoteUrlResolver;
|
|
4
4
|
exports.setRemoteDefinitions = setRemoteDefinitions;
|
|
5
|
+
exports.setRemoteDefinition = setRemoteDefinition;
|
|
5
6
|
exports.loadRemoteModule = loadRemoteModule;
|
|
6
|
-
let remoteUrlDefinitions;
|
|
7
|
+
let remoteUrlDefinitions = {};
|
|
7
8
|
let resolveRemoteUrl;
|
|
8
9
|
const remoteModuleMap = new Map();
|
|
9
10
|
const remoteContainerMap = new Map();
|
|
@@ -14,6 +15,9 @@ function setRemoteUrlResolver(_resolveRemoteUrl) {
|
|
|
14
15
|
function setRemoteDefinitions(definitions) {
|
|
15
16
|
remoteUrlDefinitions = definitions;
|
|
16
17
|
}
|
|
18
|
+
function setRemoteDefinition(remoteName, remoteUrl) {
|
|
19
|
+
remoteUrlDefinitions[remoteName] = remoteUrl;
|
|
20
|
+
}
|
|
17
21
|
async function loadRemoteModule(remoteName, moduleName) {
|
|
18
22
|
const remoteModuleKey = `${remoteName}:${moduleName}`;
|
|
19
23
|
if (remoteModuleMap.has(remoteModuleKey)) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nx/react",
|
|
3
|
-
"version": "19.5.
|
|
3
|
+
"version": "19.5.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "The React plugin for Nx contains executors and generators for managing React applications and libraries within an Nx workspace. It provides:\n\n\n- Integration with libraries such as Jest, Vitest, Playwright, Cypress, and Storybook.\n\n- Generators for applications, libraries, components, hooks, and more.\n\n- Library build support for publishing packages to npm or other registries.\n\n- Utilities for automatic workspace refactoring.",
|
|
6
6
|
"repository": {
|
|
@@ -39,11 +39,11 @@
|
|
|
39
39
|
"minimatch": "9.0.3",
|
|
40
40
|
"tslib": "^2.3.0",
|
|
41
41
|
"@module-federation/enhanced": "~0.2.3",
|
|
42
|
-
"@nx/devkit": "19.5.
|
|
43
|
-
"@nx/js": "19.5.
|
|
44
|
-
"@nx/eslint": "19.5.
|
|
45
|
-
"@nx/web": "19.5.
|
|
46
|
-
"@nrwl/react": "19.5.
|
|
42
|
+
"@nx/devkit": "19.5.3",
|
|
43
|
+
"@nx/js": "19.5.3",
|
|
44
|
+
"@nx/eslint": "19.5.3",
|
|
45
|
+
"@nx/web": "19.5.3",
|
|
46
|
+
"@nrwl/react": "19.5.3"
|
|
47
47
|
},
|
|
48
48
|
"publishConfig": {
|
|
49
49
|
"access": "public"
|
|
@@ -12,16 +12,6 @@ type ModuleFederationDevServerOptions = WebDevServerOptions & {
|
|
|
12
12
|
staticRemotesPort?: number;
|
|
13
13
|
pathToManifestFile?: string;
|
|
14
14
|
};
|
|
15
|
-
type StaticRemoteConfig = {
|
|
16
|
-
basePath: string;
|
|
17
|
-
outputPath: string;
|
|
18
|
-
urlSegment: string;
|
|
19
|
-
};
|
|
20
|
-
type StaticRemotesConfig = {
|
|
21
|
-
remotes: string[];
|
|
22
|
-
config: Record<string, StaticRemoteConfig> | undefined;
|
|
23
|
-
};
|
|
24
|
-
export declare function parseStaticRemotesConfig(staticRemotes: string[] | undefined, context: ExecutorContext): StaticRemotesConfig;
|
|
25
15
|
export default function moduleFederationDevServer(options: ModuleFederationDevServerOptions, context: ExecutorContext): AsyncIterableIterator<{
|
|
26
16
|
success: boolean;
|
|
27
17
|
baseUrl?: string;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseStaticRemotesConfig = parseStaticRemotesConfig;
|
|
4
3
|
exports.default = moduleFederationDevServer;
|
|
5
4
|
const devkit_1 = require("@nx/devkit");
|
|
6
5
|
const dev_server_impl_1 = require("@nx/webpack/src/executors/dev-server/dev-server.impl");
|
|
@@ -14,6 +13,8 @@ const node_path_1 = require("node:path");
|
|
|
14
13
|
const node_fs_1 = require("node:fs");
|
|
15
14
|
const fs_1 = require("fs");
|
|
16
15
|
const path_1 = require("path");
|
|
16
|
+
const start_remote_proxies_1 = require("@nx/webpack/src/utils/module-federation/start-remote-proxies");
|
|
17
|
+
const parse_static_remotes_config_1 = require("@nx/webpack/src/utils/module-federation/parse-static-remotes-config");
|
|
17
18
|
function getBuildOptions(buildTarget, context) {
|
|
18
19
|
const target = (0, devkit_1.parseTargetString)(buildTarget, context);
|
|
19
20
|
const buildOptions = (0, devkit_1.readTargetOptions)(target, context);
|
|
@@ -22,6 +23,10 @@ function getBuildOptions(buildTarget, context) {
|
|
|
22
23
|
};
|
|
23
24
|
}
|
|
24
25
|
function startStaticRemotesFileServer(staticRemotesConfig, context, options) {
|
|
26
|
+
if (!staticRemotesConfig.remotes ||
|
|
27
|
+
staticRemotesConfig.remotes.length === 0) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
25
30
|
let shouldMoveToCommonLocation = false;
|
|
26
31
|
let commonOutputDirectory;
|
|
27
32
|
for (const app of staticRemotesConfig.remotes) {
|
|
@@ -56,6 +61,7 @@ function startStaticRemotesFileServer(staticRemotesConfig, context, options) {
|
|
|
56
61
|
ssl: options.ssl,
|
|
57
62
|
sslCert: options.sslCert,
|
|
58
63
|
sslKey: options.sslKey,
|
|
64
|
+
cacheSeconds: -1,
|
|
59
65
|
}, context);
|
|
60
66
|
return staticRemotesIter;
|
|
61
67
|
}
|
|
@@ -98,7 +104,7 @@ async function buildStaticRemotes(staticRemotesConfig, nxBin, context, options)
|
|
|
98
104
|
mappedLocationOfRemotes[app] = `http${options.ssl ? 's' : ''}://${options.host}:${options.staticRemotesPort}/${staticRemotesConfig.config[app].urlSegment}`;
|
|
99
105
|
}
|
|
100
106
|
process.env.NX_MF_DEV_SERVER_STATIC_REMOTES = JSON.stringify(mappedLocationOfRemotes);
|
|
101
|
-
await new Promise((res) => {
|
|
107
|
+
await new Promise((res, rej) => {
|
|
102
108
|
const staticProcess = (0, node_child_process_1.fork)(nxBin, [
|
|
103
109
|
'run-many',
|
|
104
110
|
`--target=build`,
|
|
@@ -118,6 +124,11 @@ async function buildStaticRemotes(staticRemotesConfig, nxBin, context, options)
|
|
|
118
124
|
const ANSII_CODE_REGEX = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
|
|
119
125
|
const stdoutString = data.toString().replace(ANSII_CODE_REGEX, '');
|
|
120
126
|
stdoutStream.write(stdoutString);
|
|
127
|
+
// in addition to writing into the stdout stream, also show error directly in console
|
|
128
|
+
// so the error is easily discoverable. 'ERROR in' is the key word to search in webpack output.
|
|
129
|
+
if (stdoutString.includes('ERROR in')) {
|
|
130
|
+
devkit_1.logger.log(stdoutString);
|
|
131
|
+
}
|
|
121
132
|
if (stdoutString.includes('Successfully ran target build')) {
|
|
122
133
|
staticProcess.stdout.removeAllListeners('data');
|
|
123
134
|
devkit_1.logger.info(`NX Built ${staticRemotesConfig.remotes.length} static remotes`);
|
|
@@ -130,30 +141,18 @@ async function buildStaticRemotes(staticRemotesConfig, nxBin, context, options)
|
|
|
130
141
|
staticProcess.stdout.removeAllListeners('data');
|
|
131
142
|
staticProcess.stderr.removeAllListeners('data');
|
|
132
143
|
if (code !== 0) {
|
|
133
|
-
|
|
144
|
+
rej(`Remote failed to start. A complete log can be found in: ${remoteBuildLogFile}`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
res();
|
|
134
148
|
}
|
|
135
|
-
res();
|
|
136
149
|
});
|
|
137
150
|
process.on('SIGTERM', () => staticProcess.kill('SIGTERM'));
|
|
138
151
|
process.on('exit', () => staticProcess.kill('SIGTERM'));
|
|
139
152
|
});
|
|
140
|
-
|
|
141
|
-
function parseStaticRemotesConfig(staticRemotes, context) {
|
|
142
|
-
if (!staticRemotes?.length) {
|
|
143
|
-
return { remotes: [], config: undefined };
|
|
144
|
-
}
|
|
145
|
-
const config = {};
|
|
146
|
-
for (const app of staticRemotes) {
|
|
147
|
-
const outputPath = context.projectGraph.nodes[app].data.targets['build'].options.outputPath;
|
|
148
|
-
const basePath = (0, node_path_1.dirname)(outputPath);
|
|
149
|
-
const urlSegment = (0, node_path_1.basename)(outputPath);
|
|
150
|
-
config[app] = { basePath, outputPath, urlSegment };
|
|
151
|
-
}
|
|
152
|
-
return { remotes: staticRemotes, config };
|
|
153
|
+
return mappedLocationOfRemotes;
|
|
153
154
|
}
|
|
154
155
|
async function* moduleFederationDevServer(options, context) {
|
|
155
|
-
const initialStaticRemotesPorts = options.staticRemotesPort;
|
|
156
|
-
options.staticRemotesPort ??= options.port + 1;
|
|
157
156
|
// Force Node to resolve to look for the nx binary that is inside node_modules
|
|
158
157
|
const nxBin = require.resolve('nx/bin/nx');
|
|
159
158
|
const currIter = options.static
|
|
@@ -163,6 +162,7 @@ async function* moduleFederationDevServer(options, context) {
|
|
|
163
162
|
withDeps: false,
|
|
164
163
|
spa: false,
|
|
165
164
|
cors: true,
|
|
165
|
+
cacheSeconds: -1,
|
|
166
166
|
}, context)
|
|
167
167
|
: (0, dev_server_impl_1.default)(options, context);
|
|
168
168
|
const p = context.projectsConfigurations.projects[context.projectName];
|
|
@@ -188,29 +188,15 @@ async function* moduleFederationDevServer(options, context) {
|
|
|
188
188
|
projectGraph: context.projectGraph,
|
|
189
189
|
root: context.root,
|
|
190
190
|
}, pathToManifestFile);
|
|
191
|
+
options.staticRemotesPort ??= remotes.staticRemotePort;
|
|
191
192
|
// Set NX_MF_DEV_REMOTES for the Nx Runtime Library Control Plugin
|
|
192
193
|
process.env.NX_MF_DEV_REMOTES = JSON.stringify(remotes.devRemotes.map((r) => (typeof r === 'string' ? r : r.remoteName)));
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
const remoteName = typeof r === 'string' ? r : r.remoteName;
|
|
196
|
-
const remotePort = context.projectGraph.nodes[remoteName].data.targets['serve'].options
|
|
197
|
-
.port;
|
|
198
|
-
if (remotePort >= portToUse) {
|
|
199
|
-
return remotePort + 1;
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
return portToUse;
|
|
203
|
-
}
|
|
204
|
-
}, options.staticRemotesPort);
|
|
205
|
-
}
|
|
206
|
-
const staticRemotesConfig = parseStaticRemotesConfig(remotes.staticRemotes, context);
|
|
207
|
-
await buildStaticRemotes(staticRemotesConfig, nxBin, context, options);
|
|
194
|
+
const staticRemotesConfig = (0, parse_static_remotes_config_1.parseStaticRemotesConfig)([...remotes.staticRemotes, ...remotes.dynamicRemotes], context);
|
|
195
|
+
const mappedLocationsOfStaticRemotes = await buildStaticRemotes(staticRemotesConfig, nxBin, context, options);
|
|
208
196
|
const devRemoteIters = await startRemotes(remotes.devRemotes, context, options, 'serve');
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
: undefined;
|
|
213
|
-
return yield* (0, async_iterable_1.combineAsyncIterables)(currIter, ...devRemoteIters, ...dynamicRemotesIters, ...(staticRemotesIter ? [staticRemotesIter] : []), (0, async_iterable_1.createAsyncIterable)(async ({ next, done }) => {
|
|
197
|
+
const staticRemotesIter = startStaticRemotesFileServer(staticRemotesConfig, context, options);
|
|
198
|
+
(0, start_remote_proxies_1.startRemoteProxies)(staticRemotesConfig, mappedLocationsOfStaticRemotes);
|
|
199
|
+
return yield* (0, async_iterable_1.combineAsyncIterables)(currIter, ...devRemoteIters, ...(staticRemotesIter ? [staticRemotesIter] : []), (0, async_iterable_1.createAsyncIterable)(async ({ next, done }) => {
|
|
214
200
|
if (!options.isInitialHost) {
|
|
215
201
|
done();
|
|
216
202
|
return;
|
|
@@ -45,7 +45,11 @@ function addModuleFederationFiles(host, options, defaultRemoteManifest) {
|
|
|
45
45
|
processWebpackConfig(options, host, 'webpack.config.prod.js');
|
|
46
46
|
processWebpackConfig(options, host, 'webpack.config.prod.ts');
|
|
47
47
|
if (!host.exists(pathToMFManifest)) {
|
|
48
|
-
host.write(pathToMFManifest,
|
|
48
|
+
host.write(pathToMFManifest, `{
|
|
49
|
+
${defaultRemoteManifest
|
|
50
|
+
.map(({ name, port }) => `"${name}": "http://localhost:${port}"`)
|
|
51
|
+
.join(',\n')}
|
|
52
|
+
}`);
|
|
49
53
|
}
|
|
50
54
|
}
|
|
51
55
|
}
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.addRemoteToDynamicHost = addRemoteToDynamicHost;
|
|
4
4
|
function addRemoteToDynamicHost(tree, remoteName, remotePort, pathToMfManifest) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
if (tree.exists(pathToMfManifest)) {
|
|
6
|
+
const current = tree.read(pathToMfManifest, 'utf8');
|
|
7
|
+
tree.write(pathToMfManifest, JSON.stringify({
|
|
8
|
+
...JSON.parse(current),
|
|
9
|
+
[remoteName]: `http://localhost:${remotePort}`,
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
10
12
|
}
|
package/src/utils/versions.d.ts
CHANGED
|
@@ -36,7 +36,7 @@ export declare const typesExpressVersion = "4.17.17";
|
|
|
36
36
|
export declare const isbotVersion = "^3.6.5";
|
|
37
37
|
export declare const corsVersion = "~2.8.5";
|
|
38
38
|
export declare const typesCorsVersion = "~2.8.12";
|
|
39
|
-
export declare const moduleFederationNodeVersion = "
|
|
39
|
+
export declare const moduleFederationNodeVersion = "~2.4.0";
|
|
40
40
|
export declare const moduleFederationEnhancedVersion = "~0.2.3";
|
|
41
41
|
export declare const lessVersion = "3.12.2";
|
|
42
42
|
export declare const sassVersion = "^1.55.0";
|
package/src/utils/versions.js
CHANGED
|
@@ -42,7 +42,7 @@ exports.typesExpressVersion = '4.17.17';
|
|
|
42
42
|
exports.isbotVersion = '^3.6.5';
|
|
43
43
|
exports.corsVersion = '~2.8.5';
|
|
44
44
|
exports.typesCorsVersion = '~2.8.12';
|
|
45
|
-
exports.moduleFederationNodeVersion = '
|
|
45
|
+
exports.moduleFederationNodeVersion = '~2.4.0';
|
|
46
46
|
exports.moduleFederationEnhancedVersion = '~0.2.3';
|
|
47
47
|
// style preprocessors
|
|
48
48
|
exports.lessVersion = '3.12.2';
|