@nx/angular 19.5.1 → 19.5.2
Sign up to get free protection for your applications and to get access to all the features.
- package/ng-package.json +3 -0
- package/package.json +8 -8
- package/src/executors/module-federation-dev-server/lib/build-static-remotes.d.ts +2 -2
- package/src/executors/module-federation-dev-server/lib/build-static-remotes.js +1 -1
- package/src/executors/module-federation-dev-server/lib/index.d.ts +0 -1
- package/src/executors/module-federation-dev-server/lib/index.js +0 -1
- package/src/executors/module-federation-dev-server/lib/start-static-remotes-file-server.d.ts +1 -1
- package/src/executors/module-federation-dev-server/lib/start-static-remotes-file-server.js +5 -0
- package/src/executors/module-federation-dev-server/module-federation-dev-server.impl.js +9 -21
- package/src/generators/setup-ssr/files/server/server-builder/v17+/__serverFileName__ +7 -5
- package/src/executors/module-federation-dev-server/lib/parse-static-remotes-config.d.ts +0 -11
- package/src/executors/module-federation-dev-server/lib/parse-static-remotes-config.js +0 -17
package/ng-package.json
CHANGED
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@nx/angular",
|
3
|
-
"version": "19.5.
|
3
|
+
"version": "19.5.2",
|
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,14 +80,14 @@
|
|
80
80
|
"webpack-merge": "^5.8.0",
|
81
81
|
"webpack": "^5.88.0",
|
82
82
|
"@module-federation/enhanced": "~0.2.3",
|
83
|
-
"@nx/devkit": "19.5.
|
84
|
-
"@nx/js": "19.5.
|
85
|
-
"@nx/eslint": "19.5.
|
86
|
-
"@nx/webpack": "19.5.
|
87
|
-
"@nx/web": "19.5.
|
88
|
-
"@nx/workspace": "19.5.
|
83
|
+
"@nx/devkit": "19.5.2",
|
84
|
+
"@nx/js": "19.5.2",
|
85
|
+
"@nx/eslint": "19.5.2",
|
86
|
+
"@nx/webpack": "19.5.2",
|
87
|
+
"@nx/web": "19.5.2",
|
88
|
+
"@nx/workspace": "19.5.2",
|
89
89
|
"piscina": "^4.4.0",
|
90
|
-
"@nrwl/angular": "19.5.
|
90
|
+
"@nrwl/angular": "19.5.2"
|
91
91
|
},
|
92
92
|
"peerDependencies": {
|
93
93
|
"@angular-devkit/build-angular": ">= 16.0.0 < 19.0.0",
|
@@ -1,4 +1,4 @@
|
|
1
1
|
import { type Schema } from '../schema';
|
2
2
|
import { type ExecutorContext } from '@nx/devkit';
|
3
|
-
import type { StaticRemotesConfig } from '
|
4
|
-
export declare function buildStaticRemotes(staticRemotesConfig: StaticRemotesConfig, nxBin: any, context: ExecutorContext, options: Schema): Promise<
|
3
|
+
import type { StaticRemotesConfig } from '@nx/webpack/src/utils/module-federation/parse-static-remotes-config';
|
4
|
+
export declare function buildStaticRemotes(staticRemotesConfig: StaticRemotesConfig, nxBin: any, context: ExecutorContext, options: Schema): Promise<Record<string, string>>;
|
@@ -14,7 +14,6 @@ async function buildStaticRemotes(staticRemotesConfig, nxBin, context, options)
|
|
14
14
|
for (const app of staticRemotesConfig.remotes) {
|
15
15
|
mappedLocationOfRemotes[app] = `http${options.ssl ? 's' : ''}://${options.host}:${options.staticRemotesPort}/${staticRemotesConfig.config[app].urlSegment}`;
|
16
16
|
}
|
17
|
-
process.env.NX_MF_DEV_SERVER_STATIC_REMOTES = JSON.stringify(mappedLocationOfRemotes);
|
18
17
|
await new Promise((res) => {
|
19
18
|
devkit_1.logger.info(`NX Building ${staticRemotesConfig.remotes.length} static remotes...`);
|
20
19
|
const staticProcess = (0, node_child_process_1.fork)(nxBin, [
|
@@ -55,4 +54,5 @@ async function buildStaticRemotes(staticRemotesConfig, nxBin, context, options)
|
|
55
54
|
process.on('SIGTERM', () => staticProcess.kill('SIGTERM'));
|
56
55
|
process.on('exit', () => staticProcess.kill('SIGTERM'));
|
57
56
|
});
|
57
|
+
return mappedLocationOfRemotes;
|
58
58
|
}
|
@@ -3,6 +3,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
4
4
|
tslib_1.__exportStar(require("./build-static-remotes"), exports);
|
5
5
|
tslib_1.__exportStar(require("./normalize-options"), exports);
|
6
|
-
tslib_1.__exportStar(require("./parse-static-remotes-config"), exports);
|
7
6
|
tslib_1.__exportStar(require("./start-dev-remotes"), exports);
|
8
7
|
tslib_1.__exportStar(require("./start-static-remotes-file-server"), exports);
|
package/src/executors/module-federation-dev-server/lib/start-static-remotes-file-server.d.ts
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
import { type ExecutorContext } from '@nx/devkit';
|
2
2
|
import { type Schema } from '../schema';
|
3
|
-
import type { StaticRemotesConfig } from '
|
3
|
+
import type { StaticRemotesConfig } from '@nx/webpack/src/utils/module-federation/parse-static-remotes-config';
|
4
4
|
export declare function startStaticRemotesFileServer(staticRemotesConfig: StaticRemotesConfig, context: ExecutorContext, options: Schema): AsyncGenerator<{
|
5
5
|
success: boolean;
|
6
6
|
baseUrl: string;
|
@@ -7,6 +7,10 @@ const file_server_impl_1 = tslib_1.__importDefault(require("@nx/web/src/executor
|
|
7
7
|
const path_1 = require("path");
|
8
8
|
const fs_1 = require("fs");
|
9
9
|
function startStaticRemotesFileServer(staticRemotesConfig, context, options) {
|
10
|
+
if (!staticRemotesConfig.remotes ||
|
11
|
+
staticRemotesConfig.remotes.length === 0) {
|
12
|
+
return;
|
13
|
+
}
|
10
14
|
let shouldMoveToCommonLocation = false;
|
11
15
|
let commonOutputDirectory;
|
12
16
|
for (const app of staticRemotesConfig.remotes) {
|
@@ -41,6 +45,7 @@ function startStaticRemotesFileServer(staticRemotesConfig, context, options) {
|
|
41
45
|
ssl: options.ssl,
|
42
46
|
sslCert: options.sslCert,
|
43
47
|
sslKey: options.sslKey,
|
48
|
+
cacheSeconds: -1,
|
44
49
|
}, context);
|
45
50
|
return staticRemotesIter;
|
46
51
|
}
|
@@ -14,11 +14,12 @@ const dev_server_impl_1 = require("../../builders/dev-server/dev-server.impl");
|
|
14
14
|
const module_federation_2 = require("../../builders/utilities/module-federation");
|
15
15
|
const path_1 = require("path");
|
16
16
|
const fs_1 = require("fs");
|
17
|
+
const start_remote_proxies_1 = require("@nx/webpack/src/utils/module-federation/start-remote-proxies");
|
18
|
+
const parse_static_remotes_config_1 = require("@nx/webpack/src/utils/module-federation/parse-static-remotes-config");
|
17
19
|
async function* moduleFederationDevServerExecutor(schema, context) {
|
18
20
|
// Force Node to resolve to look for the nx binary that is inside node_modules
|
19
21
|
const nxBin = require.resolve('nx/bin/nx');
|
20
22
|
const options = (0, lib_1.normalizeOptions)(schema);
|
21
|
-
options.staticRemotesPort ??= options.port + 1;
|
22
23
|
const { projects: workspaceProjects } = (0, devkit_1.readProjectsConfigurationFromProjectGraph)(context.projectGraph);
|
23
24
|
const project = workspaceProjects[context.projectName];
|
24
25
|
const currIter = options.static
|
@@ -31,6 +32,7 @@ async function* moduleFederationDevServerExecutor(schema, context) {
|
|
31
32
|
spa: false,
|
32
33
|
withDeps: false,
|
33
34
|
cors: true,
|
35
|
+
cacheSeconds: -1,
|
34
36
|
}, context)
|
35
37
|
: (0, rxjs_for_await_1.eachValueFrom)((0, dev_server_impl_1.executeDevServerBuilder)(options, await (0, ngcli_adapter_1.createBuilderContext)({
|
36
38
|
builderName: '@nx/angular:webpack-browser',
|
@@ -62,33 +64,19 @@ async function* moduleFederationDevServerExecutor(schema, context) {
|
|
62
64
|
projectGraph: context.projectGraph,
|
63
65
|
root: context.root,
|
64
66
|
}, pathToManifestFile);
|
67
|
+
options.staticRemotesPort ??= remotes.staticRemotePort;
|
65
68
|
// Set NX_MF_DEV_REMOTES for the Nx Runtime Library Control Plugin
|
66
69
|
process.env.NX_MF_DEV_REMOTES = JSON.stringify(remotes.devRemotes.map((r) => (typeof r === 'string' ? r : r.remoteName)));
|
67
|
-
|
68
|
-
|
69
|
-
const remoteName = typeof r === 'string' ? r : r.remoteName;
|
70
|
-
const remotePort = context.projectGraph.nodes[remoteName].data.targets['serve'].options
|
71
|
-
.port;
|
72
|
-
if (remotePort >= portToUse) {
|
73
|
-
return remotePort + 1;
|
74
|
-
}
|
75
|
-
else {
|
76
|
-
return portToUse;
|
77
|
-
}
|
78
|
-
}, options.staticRemotesPort);
|
79
|
-
}
|
80
|
-
const staticRemotesConfig = (0, lib_1.parseStaticRemotesConfig)(remotes.staticRemotes, context);
|
81
|
-
await (0, lib_1.buildStaticRemotes)(staticRemotesConfig, nxBin, context, options);
|
70
|
+
const staticRemotesConfig = (0, parse_static_remotes_config_1.parseStaticRemotesConfig)([...remotes.staticRemotes, ...remotes.dynamicRemotes], context);
|
71
|
+
const mappedLocationsOfStaticRemotes = await (0, lib_1.buildStaticRemotes)(staticRemotesConfig, nxBin, context, options);
|
82
72
|
const devRemoteIters = await (0, lib_1.startRemotes)(remotes.devRemotes, workspaceProjects, options, context, 'serve');
|
83
|
-
const
|
84
|
-
|
85
|
-
? (0, lib_1.startStaticRemotesFileServer)(staticRemotesConfig, context, options)
|
86
|
-
: undefined;
|
73
|
+
const staticRemotesIter = (0, lib_1.startStaticRemotesFileServer)(staticRemotesConfig, context, options);
|
74
|
+
(0, start_remote_proxies_1.startRemoteProxies)(staticRemotesConfig, mappedLocationsOfStaticRemotes);
|
87
75
|
const removeBaseUrlEmission = (iter) => (0, async_iterable_1.mapAsyncIterable)(iter, (v) => ({
|
88
76
|
...v,
|
89
77
|
baseUrl: undefined,
|
90
78
|
}));
|
91
|
-
return yield* (0, async_iterable_1.combineAsyncIterables)(removeBaseUrlEmission(currIter), ...devRemoteIters.map(removeBaseUrlEmission), ...
|
79
|
+
return yield* (0, async_iterable_1.combineAsyncIterables)(removeBaseUrlEmission(currIter), ...devRemoteIters.map(removeBaseUrlEmission), ...(staticRemotesIter ? [removeBaseUrlEmission(staticRemotesIter)] : []), (0, async_iterable_1.createAsyncIterable)(async ({ next, done }) => {
|
92
80
|
if (!options.isInitialHost) {
|
93
81
|
done();
|
94
82
|
return;
|
@@ -23,13 +23,15 @@ export function app(): express.Express {
|
|
23
23
|
// Example Express Rest API endpoints
|
24
24
|
// server.get('/api/**', (req, res) => { });
|
25
25
|
// Serve static files from /browser
|
26
|
-
server.get(
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
server.get(
|
27
|
+
'*.*',
|
28
|
+
express.static(distFolder, {
|
29
|
+
maxAge: '1y',
|
30
|
+
})
|
31
|
+
);
|
30
32
|
|
31
33
|
// All regular routes use the Angular engine
|
32
|
-
server.get('
|
34
|
+
server.get('*', (req, res, next) => {
|
33
35
|
const { protocol, originalUrl, baseUrl, headers } = req;
|
34
36
|
|
35
37
|
commonEngine
|
@@ -1,11 +0,0 @@
|
|
1
|
-
import type { ExecutorContext } from '@nx/devkit';
|
2
|
-
export type StaticRemoteConfig = {
|
3
|
-
basePath: string;
|
4
|
-
outputPath: string;
|
5
|
-
urlSegment: string;
|
6
|
-
};
|
7
|
-
export type StaticRemotesConfig = {
|
8
|
-
remotes: string[];
|
9
|
-
config: Record<string, StaticRemoteConfig> | undefined;
|
10
|
-
};
|
11
|
-
export declare function parseStaticRemotesConfig(staticRemotes: string[] | undefined, context: ExecutorContext): StaticRemotesConfig;
|
@@ -1,17 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.parseStaticRemotesConfig = parseStaticRemotesConfig;
|
4
|
-
const path_1 = require("path");
|
5
|
-
function parseStaticRemotesConfig(staticRemotes, context) {
|
6
|
-
if (!staticRemotes?.length) {
|
7
|
-
return { remotes: [], config: undefined };
|
8
|
-
}
|
9
|
-
const config = {};
|
10
|
-
for (const app of staticRemotes) {
|
11
|
-
const outputPath = context.projectGraph.nodes[app].data.targets['build'].options.outputPath;
|
12
|
-
const basePath = (0, path_1.dirname)(outputPath);
|
13
|
-
const urlSegment = (0, path_1.basename)(outputPath);
|
14
|
-
config[app] = { basePath, outputPath, urlSegment };
|
15
|
-
}
|
16
|
-
return { remotes: staticRemotes, config };
|
17
|
-
}
|