@nx/angular 19.6.0-canary.20240813-c72ba9b → 19.6.0-rc.0
Sign up to get free protection for your applications and to get access to all the features.
- package/esm2022/src/runtime/nx/data-persistence.mjs +9 -4
- package/esm2022/testing/src/testing-utils.mjs +5 -3
- package/executors.d.ts +1 -1
- package/executors.js +1 -1
- package/executors.json +5 -5
- package/fesm2022/nx-angular-testing.mjs +4 -2
- package/fesm2022/nx-angular-testing.mjs.map +1 -1
- package/fesm2022/nx-angular.mjs +8 -3
- package/fesm2022/nx-angular.mjs.map +1 -1
- package/migrations.json +76 -0
- package/package.json +8 -8
- package/src/executors/module-federation-ssr-dev-server/lib/build-static-remotes.d.ts +4 -0
- package/src/executors/module-federation-ssr-dev-server/lib/build-static-remotes.js +65 -0
- package/src/executors/module-federation-ssr-dev-server/lib/normalize-options.d.ts +2 -0
- package/src/executors/module-federation-ssr-dev-server/lib/normalize-options.js +19 -0
- package/src/executors/module-federation-ssr-dev-server/lib/start-dev-remotes.d.ts +5 -0
- package/src/executors/module-federation-ssr-dev-server/lib/start-dev-remotes.js +30 -0
- package/src/executors/module-federation-ssr-dev-server/lib/start-static-remotes.d.ts +9 -0
- package/src/executors/module-federation-ssr-dev-server/lib/start-static-remotes.js +37 -0
- package/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.d.ts +4 -0
- package/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.js +101 -0
- package/src/{builders/module-federation-dev-ssr → executors/module-federation-ssr-dev-server}/schema.d.ts +7 -1
- package/src/{builders/module-federation-dev-ssr → executors/module-federation-ssr-dev-server}/schema.json +34 -2
- package/src/executors/utilities/esbuild-extensions.d.ts +2 -1
- package/src/generators/component-cypress-spec/schema.json +2 -1
- package/src/generators/host/files/js/webpack.server.config.js__tmpl__ +6 -1
- package/src/generators/host/files/ts/webpack.server.config.ts__tmpl__ +6 -1
- package/src/generators/ng-add/migrators/projects/e2e.migrator.js +1 -1
- package/src/generators/ng-add/migrators/projects/project.migrator.d.ts +2 -0
- package/src/generators/ng-add/migrators/projects/project.migrator.js +38 -1
- package/src/generators/remote/files/base/webpack.server.config.js__tmpl__ +7 -1
- package/src/generators/remote/files/base-ts/webpack.server.config.ts__tmpl__ +6 -1
- package/src/generators/setup-mf/files/ts-webpack/webpack.config.ts__tmpl__ +6 -1
- package/src/generators/setup-mf/files/ts-webpack/webpack.prod.config.ts__tmpl__ +6 -1
- package/src/generators/setup-mf/files/webpack/webpack.config.js__tmpl__ +7 -1
- package/src/generators/setup-mf/files/webpack/webpack.prod.config.js__tmpl__ +7 -1
- package/src/generators/stories/schema.json +4 -2
- package/src/migrations/update-19-6-0/turn-off-dts-by-default.d.ts +2 -0
- package/src/migrations/update-19-6-0/turn-off-dts-by-default.js +56 -0
- package/src/migrations/update-19-6-0/update-angular-cli.d.ts +3 -0
- package/src/migrations/update-19-6-0/update-angular-cli.js +23 -0
- package/src/runtime/nx/data-persistence.d.ts +8 -3
- package/src/utils/versions.d.ts +3 -3
- package/src/utils/versions.js +3 -3
- package/testing/src/testing-utils.d.ts +4 -2
- package/src/builders/module-federation-dev-ssr/module-federation-dev-ssr.impl.d.ts +0 -4
- package/src/builders/module-federation-dev-ssr/module-federation-dev-ssr.impl.js +0 -103
@@ -0,0 +1,65 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.buildStaticRemotes = buildStaticRemotes;
|
4
|
+
const devkit_1 = require("@nx/devkit");
|
5
|
+
const cache_directory_1 = require("nx/src/utils/cache-directory");
|
6
|
+
const node_child_process_1 = require("node:child_process");
|
7
|
+
const node_path_1 = require("node:path");
|
8
|
+
const node_fs_1 = require("node:fs");
|
9
|
+
async function buildStaticRemotes(staticRemotesConfig, nxBin, context, options) {
|
10
|
+
if (!staticRemotesConfig.remotes.length) {
|
11
|
+
return;
|
12
|
+
}
|
13
|
+
const mappedLocationOfRemotes = {};
|
14
|
+
for (const app of staticRemotesConfig.remotes) {
|
15
|
+
mappedLocationOfRemotes[app] = `http${options.ssl ? 's' : ''}://${options.host}:${options.staticRemotesPort}/${staticRemotesConfig.config[app].urlSegment}`;
|
16
|
+
}
|
17
|
+
await new Promise((resolve, reject) => {
|
18
|
+
devkit_1.logger.info(`NX Building ${staticRemotesConfig.remotes.length} static remotes...`);
|
19
|
+
const staticProcess = (0, node_child_process_1.fork)(nxBin, [
|
20
|
+
'run-many',
|
21
|
+
`--target=server`,
|
22
|
+
`--projects=${staticRemotesConfig.remotes.join(',')}`,
|
23
|
+
...(context.configurationName
|
24
|
+
? [`--configuration=${context.configurationName}`]
|
25
|
+
: []),
|
26
|
+
...(options.parallel ? [`--parallel=${options.parallel}`] : []),
|
27
|
+
], {
|
28
|
+
cwd: context.root,
|
29
|
+
stdio: ['ignore', 'pipe', 'pipe', 'ipc'],
|
30
|
+
});
|
31
|
+
// File to debug build failures e.g. 2024-01-01T00_00_0_0Z-build.log'
|
32
|
+
const remoteBuildLogFile = (0, node_path_1.join)(cache_directory_1.workspaceDataDirectory, `${new Date().toISOString().replace(/[:\.]/g, '_')}-build.log`);
|
33
|
+
const stdoutStream = (0, node_fs_1.createWriteStream)(remoteBuildLogFile);
|
34
|
+
staticProcess.stdout.on('data', (data) => {
|
35
|
+
const ANSII_CODE_REGEX = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
|
36
|
+
const stdoutString = data.toString().replace(ANSII_CODE_REGEX, '');
|
37
|
+
stdoutStream.write(stdoutString);
|
38
|
+
// in addition to writing into the stdout stream, also show error directly in console
|
39
|
+
// so the error is easily discoverable. 'ERROR in' is the key word to search in webpack output.
|
40
|
+
if (stdoutString.includes('ERROR in')) {
|
41
|
+
devkit_1.logger.log(stdoutString);
|
42
|
+
}
|
43
|
+
if (stdoutString.includes('Successfully ran target server')) {
|
44
|
+
staticProcess.stdout.removeAllListeners('data');
|
45
|
+
devkit_1.logger.info(`NX Built ${staticRemotesConfig.remotes.length} static remotes`);
|
46
|
+
resolve();
|
47
|
+
}
|
48
|
+
});
|
49
|
+
staticProcess.stderr.on('data', (data) => devkit_1.logger.info(data.toString()));
|
50
|
+
staticProcess.once('exit', (code) => {
|
51
|
+
stdoutStream.end();
|
52
|
+
staticProcess.stdout.removeAllListeners('data');
|
53
|
+
staticProcess.stderr.removeAllListeners('data');
|
54
|
+
if (code !== 0) {
|
55
|
+
reject(`Remote failed to start. A complete log can be found in: ${remoteBuildLogFile}`);
|
56
|
+
}
|
57
|
+
else {
|
58
|
+
resolve();
|
59
|
+
}
|
60
|
+
});
|
61
|
+
process.on('SIGTERM', () => staticProcess.kill('SIGTERM'));
|
62
|
+
process.on('exit', () => staticProcess.kill('SIGTERM'));
|
63
|
+
});
|
64
|
+
return mappedLocationOfRemotes;
|
65
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.normalizeOptions = normalizeOptions;
|
4
|
+
const devkit_1 = require("@nx/devkit");
|
5
|
+
const path_1 = require("path");
|
6
|
+
function normalizeOptions(options) {
|
7
|
+
const devServeRemotes = !options.devRemotes
|
8
|
+
? []
|
9
|
+
: Array.isArray(options.devRemotes)
|
10
|
+
? options.devRemotes
|
11
|
+
: [options.devRemotes];
|
12
|
+
return {
|
13
|
+
...options,
|
14
|
+
devRemotes: devServeRemotes,
|
15
|
+
ssl: options.ssl ?? false,
|
16
|
+
sslCert: options.sslCert ? (0, path_1.join)(devkit_1.workspaceRoot, options.sslCert) : undefined,
|
17
|
+
sslKey: options.sslKey ? (0, path_1.join)(devkit_1.workspaceRoot, options.sslKey) : undefined,
|
18
|
+
};
|
19
|
+
}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
import { type Schema } from '../schema';
|
2
|
+
import { type ExecutorContext, type ProjectConfiguration } from '@nx/devkit';
|
3
|
+
export declare function startRemotes(remotes: string[], workspaceProjects: Record<string, ProjectConfiguration>, options: Schema, context: ExecutorContext): Promise<AsyncIterable<{
|
4
|
+
success: boolean;
|
5
|
+
}>[]>;
|
@@ -0,0 +1,30 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.startRemotes = startRemotes;
|
4
|
+
const devkit_1 = require("@nx/devkit");
|
5
|
+
async function startRemotes(remotes, workspaceProjects, options, context) {
|
6
|
+
const target = 'serve-ssr';
|
7
|
+
const remoteIters = [];
|
8
|
+
for (const app of remotes) {
|
9
|
+
if (!workspaceProjects[app].targets?.[target]) {
|
10
|
+
throw new Error(`Could not find "${target}" target in "${app}" project.`);
|
11
|
+
}
|
12
|
+
else if (!workspaceProjects[app].targets?.[target].executor) {
|
13
|
+
throw new Error(`Could not find executor for "${target}" target in "${app}" project.`);
|
14
|
+
}
|
15
|
+
const [_, executor] = workspaceProjects[app].targets[target].executor.split(':');
|
16
|
+
const isUsingModuleFederationSsrDevServerExecutor = executor.includes('module-federation-dev-ssr');
|
17
|
+
const configurationOverride = options.devRemotes.find((r) => typeof r !== 'string' && r.remoteName === app)?.configuration;
|
18
|
+
remoteIters.push(await (0, devkit_1.runExecutor)({
|
19
|
+
project: app,
|
20
|
+
target,
|
21
|
+
configuration: configurationOverride ?? context.configurationName,
|
22
|
+
}, {
|
23
|
+
...{ verbose: options.verbose ?? false },
|
24
|
+
...(isUsingModuleFederationSsrDevServerExecutor
|
25
|
+
? { isInitialHost: false }
|
26
|
+
: {}),
|
27
|
+
}, context));
|
28
|
+
}
|
29
|
+
return remoteIters;
|
30
|
+
}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import { type ExecutorContext } from '@nx/devkit';
|
2
|
+
import { type Schema } from '../schema';
|
3
|
+
import type { StaticRemotesConfig } from '@nx/webpack/src/utils/module-federation/parse-static-remotes-config';
|
4
|
+
export declare function startStaticRemotes(ssrStaticRemotesConfig: StaticRemotesConfig, context: ExecutorContext, options: Schema): AsyncGenerator<{
|
5
|
+
success: boolean;
|
6
|
+
baseUrl: string;
|
7
|
+
}, {
|
8
|
+
success: boolean;
|
9
|
+
}, unknown>;
|
@@ -0,0 +1,37 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.startStaticRemotes = startStaticRemotes;
|
4
|
+
const tslib_1 = require("tslib");
|
5
|
+
const devkit_1 = require("@nx/devkit");
|
6
|
+
const file_server_impl_1 = tslib_1.__importDefault(require("@nx/web/src/executors/file-server/file-server.impl"));
|
7
|
+
const path_1 = require("path");
|
8
|
+
const fs_1 = require("fs");
|
9
|
+
function startStaticRemotes(ssrStaticRemotesConfig, context, options) {
|
10
|
+
if (ssrStaticRemotesConfig.remotes.length === 0) {
|
11
|
+
return;
|
12
|
+
}
|
13
|
+
// The directories are usually generated with /browser and /server suffixes so we need to copy them to a common directory
|
14
|
+
const commonOutputDirectory = (0, path_1.join)(devkit_1.workspaceRoot, 'tmp/static-remotes');
|
15
|
+
for (const app of ssrStaticRemotesConfig.remotes) {
|
16
|
+
const remoteConfig = ssrStaticRemotesConfig.config[app];
|
17
|
+
(0, fs_1.cpSync)(remoteConfig.outputPath, (0, path_1.join)(commonOutputDirectory, remoteConfig.urlSegment), {
|
18
|
+
force: true,
|
19
|
+
recursive: true,
|
20
|
+
});
|
21
|
+
}
|
22
|
+
const staticRemotesIter = (0, file_server_impl_1.default)({
|
23
|
+
cors: true,
|
24
|
+
watch: false,
|
25
|
+
staticFilePath: commonOutputDirectory,
|
26
|
+
parallel: false,
|
27
|
+
spa: false,
|
28
|
+
withDeps: false,
|
29
|
+
host: options.host,
|
30
|
+
port: options.staticRemotesPort,
|
31
|
+
ssl: options.ssl,
|
32
|
+
sslCert: options.sslCert,
|
33
|
+
sslKey: options.sslKey,
|
34
|
+
cacheSeconds: -1,
|
35
|
+
}, context);
|
36
|
+
return staticRemotesIter;
|
37
|
+
}
|
package/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.d.ts
ADDED
@@ -0,0 +1,4 @@
|
|
1
|
+
import { type ExecutorContext } from '@nx/devkit';
|
2
|
+
import type { Schema } from './schema';
|
3
|
+
export declare function moduleFederationSsrDevServerExecutor(schema: Schema, context: ExecutorContext): AsyncGenerator<any, any, undefined>;
|
4
|
+
export default moduleFederationSsrDevServerExecutor;
|
package/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.js
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.moduleFederationSsrDevServerExecutor = moduleFederationSsrDevServerExecutor;
|
4
|
+
const devkit_1 = require("@nx/devkit");
|
5
|
+
const fs_1 = require("fs");
|
6
|
+
const project_graph_1 = require("nx/src/project-graph/project-graph");
|
7
|
+
const path_1 = require("path");
|
8
|
+
const module_federation_1 = require("../../builders/utilities/module-federation");
|
9
|
+
const module_federation_2 = require("@nx/webpack/src/utils/module-federation");
|
10
|
+
const parse_static_remotes_config_1 = require("@nx/webpack/src/utils/module-federation/parse-static-remotes-config");
|
11
|
+
const build_static_remotes_1 = require("./lib/build-static-remotes");
|
12
|
+
const start_dev_remotes_1 = require("./lib/start-dev-remotes");
|
13
|
+
const start_static_remotes_1 = require("./lib/start-static-remotes");
|
14
|
+
const async_iterable_1 = require("@nx/devkit/src/utils/async-iterable");
|
15
|
+
const rxjs_for_await_1 = require("@nx/devkit/src/utils/rxjs-for-await");
|
16
|
+
const ngcli_adapter_1 = require("nx/src/adapter/ngcli-adapter");
|
17
|
+
const normalize_options_1 = require("./lib/normalize-options");
|
18
|
+
const wait_for_port_open_1 = require("@nx/web/src/utils/wait-for-port-open");
|
19
|
+
const start_ssr_remote_proxies_1 = require("@nx/webpack/src/utils/module-federation/start-ssr-remote-proxies");
|
20
|
+
const dev_server_impl_1 = require("../../builders/dev-server/dev-server.impl");
|
21
|
+
async function* moduleFederationSsrDevServerExecutor(schema, context) {
|
22
|
+
const nxBin = require.resolve('nx/bin/nx');
|
23
|
+
const options = (0, normalize_options_1.normalizeOptions)(schema);
|
24
|
+
const currIter = (0, rxjs_for_await_1.eachValueFrom)((0, dev_server_impl_1.executeDevServerBuilder)(options, await (0, ngcli_adapter_1.createBuilderContext)({
|
25
|
+
builderName: '@nx/angular:webpack-server',
|
26
|
+
description: 'Build a ssr application',
|
27
|
+
optionSchema: require('../../builders/webpack-server/schema.json'),
|
28
|
+
}, context)));
|
29
|
+
if (options.isInitialHost === false) {
|
30
|
+
return yield* currIter;
|
31
|
+
}
|
32
|
+
const { projects: workspaceProjects } = (0, project_graph_1.readProjectsConfigurationFromProjectGraph)(context.projectGraph);
|
33
|
+
const project = workspaceProjects[context.projectName];
|
34
|
+
let pathToManifestFile;
|
35
|
+
if (options.pathToManifestFile) {
|
36
|
+
const userPathToManifestFile = (0, path_1.join)(context.root, options.pathToManifestFile);
|
37
|
+
if (!(0, fs_1.existsSync)(userPathToManifestFile)) {
|
38
|
+
throw new Error(`The provided Module Federation manifest file path does not exist. Please check the file exists at "${userPathToManifestFile}".`);
|
39
|
+
}
|
40
|
+
else if ((0, path_1.extname)(options.pathToManifestFile) !== '.json') {
|
41
|
+
throw new Error(`The Module Federation manifest file must be a JSON. Please ensure the file at ${userPathToManifestFile} is a JSON.`);
|
42
|
+
}
|
43
|
+
pathToManifestFile = userPathToManifestFile;
|
44
|
+
}
|
45
|
+
else {
|
46
|
+
pathToManifestFile = (0, module_federation_1.getDynamicMfManifestFile)(project, context.root);
|
47
|
+
}
|
48
|
+
(0, module_federation_1.validateDevRemotes)({ devRemotes: options.devRemotes }, workspaceProjects);
|
49
|
+
const moduleFederationConfig = (0, module_federation_2.getModuleFederationConfig)(project.targets.build.options.tsConfig, context.root, project.root, 'angular');
|
50
|
+
const remoteNames = options.devRemotes.map((r) => typeof r === 'string' ? r : r.remoteName);
|
51
|
+
const remotes = (0, module_federation_2.getRemotes)(remoteNames, options.skipRemotes, moduleFederationConfig, {
|
52
|
+
projectName: project.name,
|
53
|
+
projectGraph: context.projectGraph,
|
54
|
+
root: context.root,
|
55
|
+
}, pathToManifestFile);
|
56
|
+
options.staticRemotesPort ??= remotes.staticRemotePort;
|
57
|
+
const staticRemotesConfig = (0, parse_static_remotes_config_1.parseStaticSsrRemotesConfig)([...remotes.staticRemotes, ...remotes.dynamicRemotes], context);
|
58
|
+
const mappedLocationsOfStaticRemotes = await (0, build_static_remotes_1.buildStaticRemotes)(staticRemotesConfig, nxBin, context, options);
|
59
|
+
// Set NX_MF_DEV_REMOTES for the Nx Runtime Library Control Plugin
|
60
|
+
process.env.NX_MF_DEV_REMOTES = JSON.stringify(options.devRemotes);
|
61
|
+
const devRemotes = await (0, start_dev_remotes_1.startRemotes)(remotes.devRemotes, workspaceProjects, options, context);
|
62
|
+
const staticRemotes = (0, start_static_remotes_1.startStaticRemotes)(staticRemotesConfig, context, options);
|
63
|
+
(0, start_ssr_remote_proxies_1.startSsrRemoteProxies)(staticRemotesConfig, mappedLocationsOfStaticRemotes, options.ssl
|
64
|
+
? { pathToCert: options.sslCert, pathToKey: options.sslKey }
|
65
|
+
: undefined);
|
66
|
+
const removeBaseUrlEmission = (iter) => (0, async_iterable_1.mapAsyncIterable)(iter, (v) => ({
|
67
|
+
...v,
|
68
|
+
baseUrl: undefined,
|
69
|
+
}));
|
70
|
+
return yield* (0, async_iterable_1.combineAsyncIterables)(removeBaseUrlEmission(currIter), ...devRemotes.map(removeBaseUrlEmission), ...(staticRemotes ? [removeBaseUrlEmission(staticRemotes)] : []), (0, async_iterable_1.createAsyncIterable)(async ({ next, done }) => {
|
71
|
+
if (!options.isInitialHost) {
|
72
|
+
done();
|
73
|
+
return;
|
74
|
+
}
|
75
|
+
if (remotes.remotePorts.length) {
|
76
|
+
devkit_1.logger.info(`Nx All remotes started, server ready at http://localhost:${options.port}`);
|
77
|
+
next({ success: true, baseUrl: `http://localhost:${options.port}` });
|
78
|
+
done();
|
79
|
+
return;
|
80
|
+
}
|
81
|
+
try {
|
82
|
+
const portsToWaitFor = staticRemotes
|
83
|
+
? [options.staticRemotesPort, ...remotes.remotePorts]
|
84
|
+
: [...remotes.remotePorts];
|
85
|
+
await Promise.all(portsToWaitFor.map((port) => (0, wait_for_port_open_1.waitForPortOpen)(port, {
|
86
|
+
retries: 480,
|
87
|
+
retryDelay: 2500,
|
88
|
+
host: 'localhost',
|
89
|
+
})));
|
90
|
+
}
|
91
|
+
catch (error) {
|
92
|
+
throw new Error(`Failed to start remotes. Check above for any errors.`, {
|
93
|
+
cause: error,
|
94
|
+
});
|
95
|
+
}
|
96
|
+
finally {
|
97
|
+
done();
|
98
|
+
}
|
99
|
+
}));
|
100
|
+
}
|
101
|
+
exports.default = moduleFederationSsrDevServerExecutor;
|
@@ -1,3 +1,5 @@
|
|
1
|
+
import { type DevRemoteDefinition } from '../../builders/utilities/module-federation';
|
2
|
+
|
1
3
|
export interface Schema {
|
2
4
|
browserTarget: string;
|
3
5
|
serverTarget: string;
|
@@ -10,8 +12,12 @@ export interface Schema {
|
|
10
12
|
sslKey?: string;
|
11
13
|
sslCert?: string;
|
12
14
|
proxyConfig?: string;
|
13
|
-
devRemotes?:
|
15
|
+
devRemotes?: DevRemoteDefinition[];
|
14
16
|
skipRemotes?: string[];
|
15
17
|
verbose: boolean;
|
16
18
|
pathToManifestFile?: string;
|
19
|
+
parallel?: number;
|
20
|
+
staticRemotesPort?: number;
|
21
|
+
parallel?: number;
|
22
|
+
isInitialHost?: boolean;
|
17
23
|
}
|
@@ -1,7 +1,8 @@
|
|
1
1
|
{
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema",
|
3
3
|
"title": "Module Federation SSR Dev Server Target",
|
4
|
-
"
|
4
|
+
"outputCapture": "direct-nodejs",
|
5
|
+
"description": "The module-federation-ssr-dev-server executor is reserved exclusively for use with host SSR Module Federation applications. It allows the user to specify which remote applications should be served with the host.",
|
5
6
|
"type": "object",
|
6
7
|
"properties": {
|
7
8
|
"browserTarget": {
|
@@ -63,7 +64,24 @@
|
|
63
64
|
"devRemotes": {
|
64
65
|
"type": "array",
|
65
66
|
"items": {
|
66
|
-
"
|
67
|
+
"oneOf": [
|
68
|
+
{
|
69
|
+
"type": "string"
|
70
|
+
},
|
71
|
+
{
|
72
|
+
"type": "object",
|
73
|
+
"properties": {
|
74
|
+
"remoteName": {
|
75
|
+
"type": "string"
|
76
|
+
},
|
77
|
+
"configuration": {
|
78
|
+
"type": "string"
|
79
|
+
}
|
80
|
+
},
|
81
|
+
"required": ["remoteName"],
|
82
|
+
"additionalProperties": false
|
83
|
+
}
|
84
|
+
]
|
67
85
|
},
|
68
86
|
"description": "List of remote applications to run in development mode (i.e. using serve target).",
|
69
87
|
"x-priority": "important"
|
@@ -83,6 +101,20 @@
|
|
83
101
|
"pathToManifestFile": {
|
84
102
|
"type": "string",
|
85
103
|
"description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic remote applications relative to the workspace root."
|
104
|
+
},
|
105
|
+
"isInitialHost": {
|
106
|
+
"type": "boolean",
|
107
|
+
"description": "Whether the host that is running this executor is the first in the project tree to do so.",
|
108
|
+
"default": true,
|
109
|
+
"x-priority": "internal"
|
110
|
+
},
|
111
|
+
"parallel": {
|
112
|
+
"type": "number",
|
113
|
+
"description": "Max number of parallel processes for building static remotes"
|
114
|
+
},
|
115
|
+
"staticRemotesPort": {
|
116
|
+
"type": "number",
|
117
|
+
"description": "The port at which to serve the file-server for the static remotes."
|
86
118
|
}
|
87
119
|
},
|
88
120
|
"additionalProperties": false,
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
type Plugin = Parameters<typeof import('@angular-devkit/build-angular').buildApplication>[2]['codePlugins'][number];
|
2
2
|
export type PluginSpec = {
|
3
3
|
path: string;
|
4
4
|
options: any;
|
@@ -6,3 +6,4 @@ export type PluginSpec = {
|
|
6
6
|
export declare function loadPlugins(plugins: string[] | PluginSpec[] | undefined, tsConfig: string): Promise<Plugin[]>;
|
7
7
|
export declare function loadMiddleware(middlewareFns: string[] | undefined, tsConfig: string): Promise<any[]>;
|
8
8
|
export declare function loadIndexHtmlTransformer(indexHtmlTransformerPath: string, tsConfig: string): Promise<any>;
|
9
|
+
export {};
|
@@ -3,7 +3,8 @@
|
|
3
3
|
"$id": "NxAngularComponentCypressSpecGenerator",
|
4
4
|
"type": "object",
|
5
5
|
"cli": "nx",
|
6
|
-
"description": "Creates a Cypress spec for a UI component that has a story.",
|
6
|
+
"description": "Creates a Storybook Cypress spec for a UI component that has a story.",
|
7
|
+
"x-deprecated": "Use interactionTests instead. This option will be removed in v20.",
|
7
8
|
"properties": {
|
8
9
|
"projectName": {
|
9
10
|
"type": "string",
|
@@ -1,3 +1,8 @@
|
|
1
1
|
const { withModuleFederationForSSR } = require('@nx/angular/module-federation');
|
2
2
|
const config = require('./module-federation.config');
|
3
|
-
|
3
|
+
/**
|
4
|
+
* DTS Plugin is disabled in Nx Workspaces as Nx already provides Typing support for Module Federation
|
5
|
+
* The DTS Plugin can be enabled by setting dts: true
|
6
|
+
* Learn more about the DTS Plugin here: https://module-federation.io/configure/dts.html
|
7
|
+
*/
|
8
|
+
module.exports = withModuleFederationForSSR(config, { dts: false });
|
@@ -1,4 +1,9 @@
|
|
1
1
|
import { withModuleFederationForSSR } from '@nx/angular/module-federation';
|
2
2
|
import config from './module-federation.config';
|
3
3
|
|
4
|
-
|
4
|
+
/**
|
5
|
+
* DTS Plugin is disabled in Nx Workspaces as Nx already provides Typing support for Module Federation
|
6
|
+
* The DTS Plugin can be enabled by setting dts: true
|
7
|
+
* Learn more about the DTS Plugin here: https://module-federation.io/configure/dts.html
|
8
|
+
*/
|
9
|
+
export default withModuleFederationForSSR(config, { dts: false });
|
@@ -254,7 +254,7 @@ class E2eMigrator extends project_migrator_1.ProjectMigrator {
|
|
254
254
|
this.tree.delete(newTsConfigPath);
|
255
255
|
this.moveFile((0, devkit_1.joinPathFragments)(this.project.oldSourceRoot, 'tsconfig.json'), newTsConfigPath);
|
256
256
|
// replace the generated source with the project source
|
257
|
-
|
257
|
+
this.visitFiles(this.project.newSourceRoot, (filePath) => {
|
258
258
|
this.tree.delete(filePath);
|
259
259
|
});
|
260
260
|
this.moveDir(this.project.oldSourceRoot, (0, devkit_1.joinPathFragments)(this.project.newSourceRoot));
|
@@ -18,6 +18,8 @@ export declare class ProjectMigrator<TargetType extends string = string> extends
|
|
18
18
|
protected convertPath(originalPath: string): string;
|
19
19
|
protected moveDir(from: string, to: string): void;
|
20
20
|
protected shouldSkipTargetTypeMigration(targetType: TargetType): boolean;
|
21
|
+
protected visitFiles(dirPath: string, visitor: (path: string) => void): void;
|
22
|
+
private updateGitAndPrettierIgnore;
|
21
23
|
private collectTargetNames;
|
22
24
|
private createBuilderMigrators;
|
23
25
|
private skipProjectMigration;
|
@@ -2,6 +2,7 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.ProjectMigrator = void 0;
|
4
4
|
const devkit_1 = require("@nx/devkit");
|
5
|
+
const node_path_1 = require("node:path");
|
5
6
|
const utilities_1 = require("../../utilities");
|
6
7
|
const migrator_1 = require("../migrator");
|
7
8
|
class ProjectMigrator extends migrator_1.Migrator {
|
@@ -42,6 +43,7 @@ class ProjectMigrator extends migrator_1.Migrator {
|
|
42
43
|
migrate() {
|
43
44
|
const validationResult = this.validate();
|
44
45
|
if (!validationResult) {
|
46
|
+
this.updateGitAndPrettierIgnore();
|
45
47
|
return;
|
46
48
|
}
|
47
49
|
this.logger.warn((0, utilities_1.getProjectValidationResultMessage)(validationResult));
|
@@ -138,7 +140,7 @@ class ProjectMigrator extends migrator_1.Migrator {
|
|
138
140
|
return originalPath;
|
139
141
|
}
|
140
142
|
moveDir(from, to) {
|
141
|
-
|
143
|
+
this.visitFiles(from, (file) => {
|
142
144
|
this.moveFile(file, (0, devkit_1.normalizePath)(file).replace(from, to), true);
|
143
145
|
});
|
144
146
|
}
|
@@ -146,6 +148,41 @@ class ProjectMigrator extends migrator_1.Migrator {
|
|
146
148
|
return (Array.isArray(this.skipMigration) &&
|
147
149
|
this.skipMigration.includes(targetType));
|
148
150
|
}
|
151
|
+
visitFiles(dirPath, visitor) {
|
152
|
+
dirPath = (0, devkit_1.normalizePath)((0, node_path_1.relative)(this.tree.root, (0, devkit_1.joinPathFragments)(this.tree.root, dirPath)));
|
153
|
+
for (const child of this.tree.children(dirPath)) {
|
154
|
+
const fullPath = (0, devkit_1.joinPathFragments)(dirPath, child);
|
155
|
+
if (this.tree.isFile(fullPath)) {
|
156
|
+
visitor(fullPath);
|
157
|
+
}
|
158
|
+
else {
|
159
|
+
this.visitFiles(fullPath, visitor);
|
160
|
+
}
|
161
|
+
}
|
162
|
+
}
|
163
|
+
updateGitAndPrettierIgnore() {
|
164
|
+
if (!this.tree.exists('.prettierignore') &&
|
165
|
+
!this.tree.exists('.gitignore')) {
|
166
|
+
return;
|
167
|
+
}
|
168
|
+
let from = this.project.oldRoot;
|
169
|
+
let to = this.project.newRoot;
|
170
|
+
if (this.project.oldRoot === '') {
|
171
|
+
from = this.project.oldSourceRoot;
|
172
|
+
to = this.project.newSourceRoot;
|
173
|
+
}
|
174
|
+
const regex = new RegExp(`(^!?\\/?)(${from})(\\/|$)`, 'gm');
|
175
|
+
if (this.tree.exists('.gitignore')) {
|
176
|
+
const gitignore = this.tree.read('.gitignore', 'utf-8');
|
177
|
+
const content = gitignore.replace(regex, `$1${to}$3`);
|
178
|
+
this.tree.write('.gitignore', content);
|
179
|
+
}
|
180
|
+
if (this.tree.exists('.prettierignore')) {
|
181
|
+
const prettierIgnore = this.tree.read('.prettierignore', 'utf-8');
|
182
|
+
const content = prettierIgnore.replace(regex, `$1${to}$3`);
|
183
|
+
this.tree.write('.prettierignore', content);
|
184
|
+
}
|
185
|
+
}
|
149
186
|
collectTargetNames() {
|
150
187
|
const targetTypes = Object.keys(this.targets);
|
151
188
|
Object.entries(this.projectConfig.targets ?? {}).forEach(([targetName, target]) => {
|
@@ -1,3 +1,9 @@
|
|
1
1
|
const { withModuleFederationForSSR } = require('@nx/angular/module-federation');
|
2
2
|
const config = require('./module-federation.config');
|
3
|
-
|
3
|
+
|
4
|
+
/**
|
5
|
+
* DTS Plugin is disabled in Nx Workspaces as Nx already provides Typing support for Module Federation
|
6
|
+
* The DTS Plugin can be enabled by setting dts: true
|
7
|
+
* Learn more about the DTS Plugin here: https://module-federation.io/configure/dts.html
|
8
|
+
*/
|
9
|
+
module.exports = withModuleFederationForSSR(config, { dts: false })
|
@@ -1,4 +1,9 @@
|
|
1
1
|
import { withModuleFederationForSSR } from '@nx/angular/module-federation';
|
2
2
|
import config from './module-federation.config';
|
3
3
|
|
4
|
-
|
4
|
+
/**
|
5
|
+
* DTS Plugin is disabled in Nx Workspaces as Nx already provides Typing support for Module Federation
|
6
|
+
* The DTS Plugin can be enabled by setting dts: true
|
7
|
+
* Learn more about the DTS Plugin here: https://module-federation.io/configure/dts.html
|
8
|
+
*/
|
9
|
+
export default withModuleFederationForSSR(config, { dts: false });
|
@@ -1,4 +1,9 @@
|
|
1
1
|
import { withModuleFederation } from '@nx/angular/module-federation';
|
2
2
|
import config from './module-federation.config';
|
3
3
|
|
4
|
-
|
4
|
+
/**
|
5
|
+
* DTS Plugin is disabled in Nx Workspaces as Nx already provides Typing support for Module Federation
|
6
|
+
* The DTS Plugin can be enabled by setting dts: true
|
7
|
+
* Learn more about the DTS Plugin here: https://module-federation.io/configure/dts.html
|
8
|
+
*/
|
9
|
+
export default withModuleFederation(config, { dts: false });
|
@@ -1,6 +1,11 @@
|
|
1
1
|
import { withModuleFederation } from '@nx/angular/module-federation';
|
2
2
|
import config from './module-federation.config';
|
3
3
|
|
4
|
+
/**
|
5
|
+
* DTS Plugin is disabled in Nx Workspaces as Nx already provides Typing support for Module Federation
|
6
|
+
* The DTS Plugin can be enabled by setting dts: true
|
7
|
+
* Learn more about the DTS Plugin here: https://module-federation.io/configure/dts.html
|
8
|
+
*/
|
4
9
|
export default withModuleFederation({
|
5
10
|
...config,
|
6
11
|
/*
|
@@ -13,4 +18,4 @@ export default withModuleFederation({
|
|
13
18
|
* ['app2', 'https://app2.example.com'],
|
14
19
|
* ]
|
15
20
|
*/
|
16
|
-
});
|
21
|
+
}, { dts: false });
|
@@ -1,3 +1,9 @@
|
|
1
1
|
const { withModuleFederation } = require('@nx/angular/module-federation');
|
2
2
|
const config = require('./module-federation.config');
|
3
|
-
|
3
|
+
|
4
|
+
/**
|
5
|
+
* DTS Plugin is disabled in Nx Workspaces as Nx already provides Typing support for Module Federation
|
6
|
+
* The DTS Plugin can be enabled by setting dts: true
|
7
|
+
* Learn more about the DTS Plugin here: https://module-federation.io/configure/dts.html
|
8
|
+
*/
|
9
|
+
module.exports = withModuleFederation(config, { dts: false });
|
@@ -1,5 +1,11 @@
|
|
1
1
|
const { withModuleFederation } = require('@nx/angular/module-federation');
|
2
2
|
const config = require('./module-federation.config');
|
3
|
+
|
4
|
+
/**
|
5
|
+
* DTS Plugin is disabled in Nx Workspaces as Nx already provides Typing support for Module Federation
|
6
|
+
* The DTS Plugin can be enabled by setting dts: true
|
7
|
+
* Learn more about the DTS Plugin here: https://module-federation.io/configure/dts.html
|
8
|
+
*/
|
3
9
|
module.exports = withModuleFederation({
|
4
10
|
...config,
|
5
11
|
/*
|
@@ -12,4 +18,4 @@ module.exports = withModuleFederation({
|
|
12
18
|
* ['app2', 'https://app2.example.com'],
|
13
19
|
* ]
|
14
20
|
*/
|
15
|
-
});
|
21
|
+
}, { dts: false });
|
@@ -27,11 +27,13 @@
|
|
27
27
|
},
|
28
28
|
"generateCypressSpecs": {
|
29
29
|
"type": "boolean",
|
30
|
-
"description": "Specifies whether to automatically generate `*.spec.ts` files in the Cypress e2e app generated by the `cypress-configure` generator."
|
30
|
+
"description": "Specifies whether to automatically generate `*.spec.ts` files in the Cypress e2e app generated by the `cypress-configure` generator.",
|
31
|
+
"x-deprecated": "Use interactionTests instead. This option will be removed in v20."
|
31
32
|
},
|
32
33
|
"cypressProject": {
|
33
34
|
"type": "string",
|
34
|
-
"description": "The Cypress project to generate the stories under. This is inferred from `name` by default."
|
35
|
+
"description": "The Cypress project to generate the stories under. This is inferred from `name` by default.",
|
36
|
+
"x-deprecated": "Use interactionTests instead. This option will be removed in v20."
|
35
37
|
},
|
36
38
|
"skipFormat": {
|
37
39
|
"description": "Skip formatting files.",
|