@nx/react 0.0.0-pr-28808-f5b5ede → 0.0.0-pr-28808-41aa4e0

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.
Files changed (48) hide show
  1. package/migrations.json +6 -0
  2. package/package.json +6 -5
  3. package/src/executors/module-federation-dev-server/module-federation-dev-server.impl.js +5 -7
  4. package/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.js +5 -7
  5. package/src/executors/module-federation-static-server/module-federation-static-server.impl.d.ts +1 -1
  6. package/src/executors/module-federation-static-server/module-federation-static-server.impl.js +4 -5
  7. package/src/generators/application/files/base-rspack/tsconfig.app.json__tmpl__ +1 -1
  8. package/src/generators/application/files/base-vite/tsconfig.app.json__tmpl__ +1 -1
  9. package/src/generators/application/files/base-webpack/tsconfig.app.json__tmpl__ +1 -1
  10. package/src/generators/application/lib/add-e2e.js +41 -15
  11. package/src/generators/application/schema.json +9 -8
  12. package/src/generators/component/component.js +3 -1
  13. package/src/generators/component/lib/normalize-options.js +2 -1
  14. package/src/generators/component/schema.d.ts +1 -0
  15. package/src/generators/host/files/rspack-module-federation-ssr/module-federation.server.config.js__tmpl__ +1 -1
  16. package/src/generators/host/files/rspack-module-federation-ssr-ts/module-federation.server.config.ts__tmpl__ +1 -1
  17. package/src/generators/host/files/rspack-module-federation-ts/module-federation.config.ts__tmpl__ +1 -1
  18. package/src/generators/host/files/rspack-module-federation-ts/rspack.config.prod.ts__tmpl__ +2 -1
  19. package/src/generators/host/files/rspack-module-federation-ts/rspack.config.ts__tmpl__ +2 -1
  20. package/src/generators/host/files/webpack-module-federation-ssr/module-federation.server.config.js__tmpl__ +1 -1
  21. package/src/generators/host/files/webpack-module-federation-ssr-ts/module-federation.server.config.ts__tmpl__ +1 -1
  22. package/src/generators/host/files/webpack-module-federation-ts/module-federation.config.ts__tmpl__ +1 -1
  23. package/src/generators/host/files/webpack-module-federation-ts/webpack.config.prod.ts__tmpl__ +1 -1
  24. package/src/generators/host/files/webpack-module-federation-ts/webpack.config.ts__tmpl__ +2 -1
  25. package/src/generators/library/lib/create-files.js +27 -19
  26. package/src/generators/library/lib/normalize-options.js +21 -1
  27. package/src/generators/library/library.js +11 -1
  28. package/src/generators/library/schema.json +1 -4
  29. package/src/generators/remote/files/rspack-module-federation-ssr-ts/module-federation.server.config.ts__tmpl__ +1 -1
  30. package/src/generators/remote/files/rspack-module-federation-ts/module-federation.config.ts__tmpl__ +1 -1
  31. package/src/generators/remote/files/webpack-module-federation-ssr-ts/module-federation.server.config.ts__tmpl__ +1 -1
  32. package/src/generators/remote/files/webpack-module-federation-ts/module-federation.config.ts__tmpl__ +1 -1
  33. package/src/migrations/update-20-2-0/migrate-mf-imports-to-new-package.d.ts +2 -0
  34. package/src/migrations/update-20-2-0/migrate-mf-imports-to-new-package.js +63 -0
  35. package/src/module-federation/utils.d.ts +3 -3
  36. package/src/module-federation/utils.js +1 -1
  37. package/src/module-federation/with-module-federation-ssr.d.ts +1 -1
  38. package/src/module-federation/with-module-federation-ssr.js +1 -1
  39. package/src/module-federation/with-module-federation.d.ts +1 -1
  40. package/src/module-federation/with-module-federation.js +1 -1
  41. package/src/generators/library/files/common/package.json__tmpl__ +0 -4
  42. package/src/generators/library/files/vite/package.json__tmpl__ +0 -12
  43. package/src/module-federation/load-config.d.ts +0 -3
  44. package/src/module-federation/load-config.js +0 -15
  45. package/src/module-federation/models.d.ts +0 -24
  46. package/src/module-federation/models.js +0 -2
  47. package/src/module-federation/package-json.d.ts +0 -8
  48. package/src/module-federation/package-json.js +0 -12
package/migrations.json CHANGED
@@ -29,6 +29,12 @@
29
29
  "version": "19.6.1-beta.0",
30
30
  "description": "Ensure Target Defaults are set correctly for Module Federation.",
31
31
  "factory": "./src/migrations/update-19-6-1/ensure-depends-on-for-mf"
32
+ },
33
+ "update-20-2-0-update-module-federation-config-import": {
34
+ "cli": "nx",
35
+ "version": "20.2.0-beta.2",
36
+ "description": "Update the ModuleFederationConfig import use @nx/module-federation.",
37
+ "factory": "./src/migrations/update-20-2-0/migrate-mf-imports-to-new-package"
32
38
  }
33
39
  },
34
40
  "packageJsonUpdates": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/react",
3
- "version": "0.0.0-pr-28808-f5b5ede",
3
+ "version": "0.0.0-pr-28808-41aa4e0",
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,10 +39,11 @@
39
39
  "picocolors": "^1.1.0",
40
40
  "tslib": "^2.3.0",
41
41
  "@module-federation/enhanced": "0.6.9",
42
- "@nx/devkit": "0.0.0-pr-28808-f5b5ede",
43
- "@nx/js": "0.0.0-pr-28808-f5b5ede",
44
- "@nx/eslint": "0.0.0-pr-28808-f5b5ede",
45
- "@nx/web": "0.0.0-pr-28808-f5b5ede",
42
+ "@nx/devkit": "0.0.0-pr-28808-41aa4e0",
43
+ "@nx/js": "0.0.0-pr-28808-41aa4e0",
44
+ "@nx/eslint": "0.0.0-pr-28808-41aa4e0",
45
+ "@nx/web": "0.0.0-pr-28808-41aa4e0",
46
+ "@nx/module-federation": "0.0.0-pr-28808-41aa4e0",
46
47
  "express": "^4.19.2",
47
48
  "http-proxy-middleware": "^3.0.3"
48
49
  },
@@ -4,13 +4,11 @@ exports.default = moduleFederationDevServer;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const dev_server_impl_1 = require("@nx/webpack/src/executors/dev-server/dev-server.impl");
6
6
  const file_server_impl_1 = require("@nx/web/src/executors/file-server/file-server.impl");
7
- const module_federation_1 = require("@nx/webpack/src/utils/module-federation");
7
+ const utils_1 = require("@nx/module-federation/src/utils");
8
8
  const async_iterable_1 = require("@nx/devkit/src/utils/async-iterable");
9
9
  const wait_for_port_open_1 = require("@nx/web/src/utils/wait-for-port-open");
10
10
  const fs_1 = require("fs");
11
11
  const path_1 = require("path");
12
- const start_remote_proxies_1 = require("@nx/webpack/src/utils/module-federation/start-remote-proxies");
13
- const parse_static_remotes_config_1 = require("@nx/webpack/src/utils/module-federation/parse-static-remotes-config");
14
12
  const build_static_remotes_1 = require("../../utils/build-static.remotes");
15
13
  function getBuildOptions(buildTarget, context) {
16
14
  const target = (0, devkit_1.parseTargetString)(buildTarget, context);
@@ -120,9 +118,9 @@ async function* moduleFederationDevServer(options, context) {
120
118
  if (!options.isInitialHost) {
121
119
  return yield* currIter;
122
120
  }
123
- const moduleFederationConfig = (0, module_federation_1.getModuleFederationConfig)(buildOptions.tsConfig, context.root, p.root, 'react');
121
+ const moduleFederationConfig = (0, utils_1.getModuleFederationConfig)(buildOptions.tsConfig, context.root, p.root, 'react');
124
122
  const remoteNames = options.devRemotes?.map((r) => typeof r === 'string' ? r : r.remoteName);
125
- const remotes = (0, module_federation_1.getRemotes)(remoteNames, options.skipRemotes, moduleFederationConfig, {
123
+ const remotes = (0, utils_1.getRemotes)(remoteNames, options.skipRemotes, moduleFederationConfig, {
126
124
  projectName: context.projectName,
127
125
  projectGraph: context.projectGraph,
128
126
  root: context.root,
@@ -133,11 +131,11 @@ async function* moduleFederationDevServer(options, context) {
133
131
  ...(remotes.devRemotes.map((r) => typeof r === 'string' ? r : r.remoteName) ?? []).map((r) => r.replace(/-/g, '_')),
134
132
  p.name.replace(/-/g, '_'),
135
133
  ]);
136
- const staticRemotesConfig = (0, parse_static_remotes_config_1.parseStaticRemotesConfig)([...remotes.staticRemotes, ...remotes.dynamicRemotes], context);
134
+ const staticRemotesConfig = (0, utils_1.parseStaticRemotesConfig)([...remotes.staticRemotes, ...remotes.dynamicRemotes], context);
137
135
  const mappedLocationsOfStaticRemotes = await (0, build_static_remotes_1.buildStaticRemotes)(staticRemotesConfig, nxBin, context, options);
138
136
  const devRemoteIters = await startRemotes(remotes.devRemotes, context, options, 'serve');
139
137
  const staticRemotesIter = startStaticRemotesFileServer(staticRemotesConfig, context, options);
140
- (0, start_remote_proxies_1.startRemoteProxies)(staticRemotesConfig, mappedLocationsOfStaticRemotes, options.ssl
138
+ (0, utils_1.startRemoteProxies)(staticRemotesConfig, mappedLocationsOfStaticRemotes, options.ssl
141
139
  ? {
142
140
  pathToCert: (0, path_1.join)(devkit_1.workspaceRoot, options.sslCert),
143
141
  pathToKey: (0, path_1.join)(devkit_1.workspaceRoot, options.sslKey),
@@ -4,14 +4,12 @@ exports.default = moduleFederationSsrDevServer;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const ssr_dev_server_impl_1 = require("@nx/webpack/src/executors/ssr-dev-server/ssr-dev-server.impl");
6
6
  const path_1 = require("path");
7
- const module_federation_1 = require("@nx/webpack/src/utils/module-federation");
7
+ const utils_1 = require("@nx/module-federation/src/utils");
8
8
  const async_iterable_1 = require("@nx/devkit/src/utils/async-iterable");
9
9
  const child_process_1 = require("child_process");
10
10
  const fs_1 = require("fs");
11
- const parse_static_remotes_config_1 = require("@nx/webpack/src/utils/module-federation/parse-static-remotes-config");
12
11
  const file_server_impl_1 = require("@nx/web/src/executors/file-server/file-server.impl");
13
12
  const cache_directory_1 = require("nx/src/utils/cache-directory");
14
- const start_ssr_remote_proxies_1 = require("@nx/webpack/src/utils/module-federation/start-ssr-remote-proxies");
15
13
  const wait_for_port_open_1 = require("@nx/web/src/utils/wait-for-port-open");
16
14
  function normalizeOptions(options) {
17
15
  return {
@@ -155,9 +153,9 @@ async function* moduleFederationSsrDevServer(ssrDevServerOptions, context) {
155
153
  if (!options.isInitialHost) {
156
154
  return yield* iter;
157
155
  }
158
- const moduleFederationConfig = (0, module_federation_1.getModuleFederationConfig)(buildOptions.tsConfig, context.root, projectConfig.root, 'react');
156
+ const moduleFederationConfig = (0, utils_1.getModuleFederationConfig)(buildOptions.tsConfig, context.root, projectConfig.root, 'react');
159
157
  const remoteNames = options.devRemotes?.map((remote) => typeof remote === 'string' ? remote : remote.remoteName);
160
- const remotes = (0, module_federation_1.getRemotes)(remoteNames, options.skipRemotes, moduleFederationConfig, {
158
+ const remotes = (0, utils_1.getRemotes)(remoteNames, options.skipRemotes, moduleFederationConfig, {
161
159
  projectName: context.projectName,
162
160
  projectGraph: context.projectGraph,
163
161
  root: context.root,
@@ -167,11 +165,11 @@ async function* moduleFederationSsrDevServer(ssrDevServerOptions, context) {
167
165
  ...(remotes.devRemotes.map((r) => typeof r === 'string' ? r : r.remoteName) ?? []).map((r) => r.replace(/-/g, '_')),
168
166
  projectConfig.name.replace(/-/g, '_'),
169
167
  ]);
170
- const staticRemotesConfig = (0, parse_static_remotes_config_1.parseStaticSsrRemotesConfig)([...remotes.staticRemotes, ...remotes.dynamicRemotes], context);
168
+ const staticRemotesConfig = (0, utils_1.parseStaticSsrRemotesConfig)([...remotes.staticRemotes, ...remotes.dynamicRemotes], context);
171
169
  const mappedLocationsOfStaticRemotes = await buildSsrStaticRemotes(staticRemotesConfig, nxBin, context, options);
172
170
  const devRemoteIters = await startRemotes(remotes.devRemotes, context, options);
173
171
  const staticRemotesIter = startSsrStaticRemotesFileServer(staticRemotesConfig, context, options);
174
- (0, start_ssr_remote_proxies_1.startSsrRemoteProxies)(staticRemotesConfig, mappedLocationsOfStaticRemotes, options.ssl
172
+ (0, utils_1.startSsrRemoteProxies)(staticRemotesConfig, mappedLocationsOfStaticRemotes, options.ssl
175
173
  ? {
176
174
  pathToCert: options.sslCert,
177
175
  pathToKey: options.sslKey,
@@ -1,7 +1,7 @@
1
1
  import { ModuleFederationStaticServerSchema } from './schema';
2
2
  import { ModuleFederationDevServerOptions } from '../module-federation-dev-server/schema';
3
3
  import { ExecutorContext } from 'nx/src/config/misc-interfaces';
4
- import { StaticRemotesConfig } from '@nx/webpack/src/utils/module-federation/parse-static-remotes-config';
4
+ import { StaticRemotesConfig } from '@nx/module-federation/src/utils';
5
5
  export declare function startProxies(staticRemotesConfig: StaticRemotesConfig, hostServeOptions: ModuleFederationDevServerOptions, mappedLocationOfHost: string, mappedLocationsOfRemotes: Record<string, string>, sslOptions?: {
6
6
  pathToCert: string;
7
7
  pathToKey: string;
@@ -5,8 +5,7 @@ exports.default = moduleFederationStaticServer;
5
5
  const path_1 = require("path");
6
6
  const devkit_1 = require("@nx/devkit");
7
7
  const fs_1 = require("fs");
8
- const module_federation_1 = require("@nx/webpack/src/utils/module-federation");
9
- const parse_static_remotes_config_1 = require("@nx/webpack/src/utils/module-federation/parse-static-remotes-config");
8
+ const utils_1 = require("@nx/module-federation/src/utils");
10
9
  const build_static_remotes_1 = require("../../utils/build-static.remotes");
11
10
  const child_process_1 = require("child_process");
12
11
  const process = require("node:process");
@@ -164,13 +163,13 @@ async function* moduleFederationStaticServer(schema, context) {
164
163
  // Get the remotes from the module federation config
165
164
  const p = context.projectsConfigurations.projects[context.projectName];
166
165
  const options = getBuildAndServeOptionsFromServeTarget(schema.serveTarget, context);
167
- const moduleFederationConfig = (0, module_federation_1.getModuleFederationConfig)(options.buildOptions.tsConfig, context.root, p.root, 'react');
168
- const remotes = (0, module_federation_1.getRemotes)([], options.serveOptions.skipRemotes, moduleFederationConfig, {
166
+ const moduleFederationConfig = (0, utils_1.getModuleFederationConfig)(options.buildOptions.tsConfig, context.root, p.root, 'react');
167
+ const remotes = (0, utils_1.getRemotes)([], options.serveOptions.skipRemotes, moduleFederationConfig, {
169
168
  projectName: context.projectName,
170
169
  projectGraph: context.projectGraph,
171
170
  root: context.root,
172
171
  }, options.pathToManifestFile);
173
- const staticRemotesConfig = (0, parse_static_remotes_config_1.parseStaticRemotesConfig)([...remotes.staticRemotes, ...remotes.dynamicRemotes], context);
172
+ const staticRemotesConfig = (0, utils_1.parseStaticRemotesConfig)([...remotes.staticRemotes, ...remotes.dynamicRemotes], context);
174
173
  options.serveOptions.staticRemotesPort ??= remotes.staticRemotePort;
175
174
  const mappedLocationsOfStaticRemotes = await (0, build_static_remotes_1.buildStaticRemotes)(staticRemotesConfig, nxBin, context, options.serveOptions);
176
175
  // Build the host
@@ -1,4 +1,4 @@
1
- <% if (isUsingTsSolutionSetup) { %>{
1
+ <%_ if (isUsingTsSolutionSetup) { _%>{
2
2
  "extends": "<%= offsetFromRoot%>tsconfig.base.json",
3
3
  "compilerOptions": {
4
4
  "outDir": "dist",
@@ -1,4 +1,4 @@
1
- <% if (isUsingTsSolutionSetup) { %>{
1
+ <%_ if (isUsingTsSolutionSetup) { _%>{
2
2
  "extends": "<%= offsetFromRoot%>tsconfig.base.json",
3
3
  "compilerOptions": {
4
4
  "outDir": "dist",
@@ -1,4 +1,4 @@
1
- <% if (isUsingTsSolutionSetup) { %>{
1
+ <%_ if (isUsingTsSolutionSetup) { _%>{
2
2
  "extends": "<%= offsetFromRoot%>tsconfig.base.json",
3
3
  "compilerOptions": {
4
4
  "outDir": "dist",
@@ -36,14 +36,27 @@ async function addE2e(tree, options) {
36
36
  switch (options.e2eTestRunner) {
37
37
  case 'cypress': {
38
38
  const { configurationGenerator } = (0, devkit_1.ensurePackage)('@nx/cypress', versions_1.nxVersion);
39
- (0, devkit_1.addProjectConfiguration)(tree, options.e2eProjectName, {
40
- projectType: 'application',
41
- root: options.e2eProjectRoot,
42
- sourceRoot: (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'src'),
43
- targets: {},
44
- implicitDependencies: [options.projectName],
45
- tags: [],
46
- });
39
+ if (options.isUsingTsSolutionConfig) {
40
+ (0, devkit_1.writeJson)(tree, (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'package.json'), {
41
+ name: options.e2eProjectName,
42
+ version: '0.0.1',
43
+ private: true,
44
+ nx: {
45
+ projectType: 'application',
46
+ implicitDependencies: [options.projectName],
47
+ },
48
+ });
49
+ }
50
+ else {
51
+ (0, devkit_1.addProjectConfiguration)(tree, options.e2eProjectName, {
52
+ projectType: 'application',
53
+ root: options.e2eProjectRoot,
54
+ sourceRoot: (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'src'),
55
+ targets: {},
56
+ implicitDependencies: [options.projectName],
57
+ tags: [],
58
+ });
59
+ }
47
60
  const e2eTask = await configurationGenerator(tree, {
48
61
  ...options,
49
62
  project: options.e2eProjectName,
@@ -88,13 +101,26 @@ async function addE2e(tree, options) {
88
101
  }
89
102
  case 'playwright': {
90
103
  const { configurationGenerator } = (0, devkit_1.ensurePackage)('@nx/playwright', versions_1.nxVersion);
91
- (0, devkit_1.addProjectConfiguration)(tree, options.e2eProjectName, {
92
- projectType: 'application',
93
- root: options.e2eProjectRoot,
94
- sourceRoot: (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'src'),
95
- targets: {},
96
- implicitDependencies: [options.projectName],
97
- });
104
+ if (options.isUsingTsSolutionConfig) {
105
+ (0, devkit_1.writeJson)(tree, (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'package.json'), {
106
+ name: options.e2eProjectName,
107
+ version: '0.0.1',
108
+ private: true,
109
+ nx: {
110
+ name: options.e2eProjectName,
111
+ implicitDependencies: [options.projectName],
112
+ },
113
+ });
114
+ }
115
+ else {
116
+ (0, devkit_1.addProjectConfiguration)(tree, options.e2eProjectName, {
117
+ projectType: 'application',
118
+ root: options.e2eProjectRoot,
119
+ sourceRoot: (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'src'),
120
+ targets: {},
121
+ implicitDependencies: [options.projectName],
122
+ });
123
+ }
98
124
  const e2eTask = await configurationGenerator(tree, {
99
125
  project: options.e2eProjectName,
100
126
  skipFormat: true,
@@ -98,6 +98,14 @@
98
98
  "default": false,
99
99
  "x-priority": "internal"
100
100
  },
101
+ "bundler": {
102
+ "description": "The bundler to use.",
103
+ "type": "string",
104
+ "enum": ["vite", "webpack", "rspack"],
105
+ "x-prompt": "Which bundler do you want to use to build the application?",
106
+ "default": "vite",
107
+ "x-priority": "important"
108
+ },
101
109
  "linter": {
102
110
  "description": "The tool to use for running lint checks.",
103
111
  "type": "string",
@@ -111,6 +119,7 @@
111
119
  "enum": ["vitest", "jest", "none"],
112
120
  "description": "Test runner to use for unit tests.",
113
121
  "default": "vitest",
122
+ "x-prompt": "What unit test runner should be used?",
114
123
  "x-priority": "important"
115
124
  },
116
125
  "inSourceTests": {
@@ -174,14 +183,6 @@
174
183
  "default": false,
175
184
  "hidden": true
176
185
  },
177
- "bundler": {
178
- "description": "The bundler to use.",
179
- "type": "string",
180
- "enum": ["vite", "webpack", "rspack"],
181
- "x-prompt": "Which bundler do you want to use to build the application?",
182
- "default": "vite",
183
- "x-priority": "important"
184
- },
185
186
  "minimal": {
186
187
  "description": "Generate a React app with a minimal setup, no separate test files.",
187
188
  "type": "boolean",
@@ -67,7 +67,9 @@ function addExportsToBarrel(host, options) {
67
67
  const workspace = (0, devkit_1.getProjects)(host);
68
68
  const isApp = workspace.get(options.projectName).projectType === 'application';
69
69
  if (options.export && !isApp) {
70
- const indexFilePath = (0, devkit_1.joinPathFragments)(options.projectSourceRoot, options.js ? 'index.js' : 'index.ts');
70
+ const indexFilePath = options.projectSourceRoot
71
+ ? (0, devkit_1.joinPathFragments)(options.projectSourceRoot, options.js ? 'index.js' : 'index.ts')
72
+ : (0, devkit_1.joinPathFragments)(options.projectRoot, 'src', options.js ? 'index.js' : 'index.ts');
71
73
  const indexSource = host.read(indexFilePath, 'utf-8');
72
74
  if (indexSource !== null) {
73
75
  const indexSourceFile = tsModule.createSourceFile(indexFilePath, indexSource, tsModule.ScriptTarget.Latest, true);
@@ -36,6 +36,7 @@ async function normalizeOptions(tree, options) {
36
36
  className,
37
37
  fileName,
38
38
  filePath,
39
- projectSourceRoot: projectSourceRoot ?? projectRoot,
39
+ projectRoot,
40
+ projectSourceRoot: projectSourceRoot,
40
41
  };
41
42
  }
@@ -20,6 +20,7 @@ export interface Schema {
20
20
 
21
21
  export interface NormalizedSchema extends Schema {
22
22
  directory: string;
23
+ projectRoot: string;
23
24
  projectSourceRoot: string;
24
25
  projectName: string;
25
26
  fileName: string;
@@ -1,7 +1,7 @@
1
1
  // @ts-check
2
2
 
3
3
  /**
4
- * @type {import('@nx/rspack/module-federation').ModuleFederationConfig}
4
+ * @type {import('@nx/module-federation').ModuleFederationConfig}
5
5
  **/
6
6
  const moduleFederationConfig = {
7
7
  name: '<%= projectName %>',
@@ -1,4 +1,4 @@
1
- import { ModuleFederationConfig } from '@nx/rspack/module-federation';
1
+ import { ModuleFederationConfig } from '@nx/module-federation';
2
2
 
3
3
  const config: ModuleFederationConfig = {
4
4
  name: '<%= projectName %>',
@@ -1,4 +1,4 @@
1
- import { ModuleFederationConfig } from '@nx/rspack/module-federation';
1
+ import { ModuleFederationConfig } from '@nx/module-federation';
2
2
 
3
3
  const config: ModuleFederationConfig = {
4
4
  name: '<%= projectName %>',
@@ -1,5 +1,6 @@
1
1
  import { composePlugins, withNx, withReact } from '@nx/rspack';
2
- import { withModuleFederation, ModuleFederationConfig } from '@nx/rspack/module-federation';
2
+ import { withModuleFederation } from '@nx/rspack/module-federation';
3
+ import { ModuleFederationConfig } from '@nx/module-federation';
3
4
 
4
5
  import baseConfig from './module-federation.config';
5
6
 
@@ -1,5 +1,6 @@
1
1
  import {composePlugins, withNx, withReact} from '@nx/rspack';
2
- import {withModuleFederation, ModuleFederationConfig} from '@nx/rspack/module-federation';
2
+ import { withModuleFederation } from '@nx/rspack/module-federation';
3
+ import { ModuleFederationConfig } from '@nx/module-federation';
3
4
 
4
5
  import baseConfig from './module-federation.config';
5
6
 
@@ -1,7 +1,7 @@
1
1
  // @ts-check
2
2
 
3
3
  /**
4
- * @type {import('@nx/webpack').ModuleFederationConfig}
4
+ * @type {import('@nx/module-federation').ModuleFederationConfig}
5
5
  **/
6
6
  const moduleFederationConfig = {
7
7
  name: '<%= projectName %>',
@@ -1,4 +1,4 @@
1
- import { ModuleFederationConfig } from '@nx/webpack';
1
+ import { ModuleFederationConfig } from '@nx/module-federation';
2
2
 
3
3
  const config: ModuleFederationConfig = {
4
4
  name: '<%= projectName %>',
@@ -1,4 +1,4 @@
1
- import { ModuleFederationConfig } from '@nx/webpack';
1
+ import { ModuleFederationConfig } from '@nx/module-federation';
2
2
 
3
3
  const config: ModuleFederationConfig = {
4
4
  name: '<%= projectName %>',
@@ -1,7 +1,7 @@
1
1
  import { composePlugins, withNx } from '@nx/webpack';
2
2
  import { withReact } from '@nx/react';
3
3
  import { withModuleFederation } from '@nx/react/module-federation';
4
- import { ModuleFederationConfig } from '@nx/webpack';
4
+ import { ModuleFederationConfig } from '@nx/module-federation';
5
5
 
6
6
  import baseConfig from './module-federation.config';
7
7
 
@@ -1,6 +1,7 @@
1
- import {composePlugins, withNx, ModuleFederationConfig} from '@nx/webpack';
1
+ import {composePlugins, withNx} from '@nx/webpack';
2
2
  import {withReact} from '@nx/react';
3
3
  import {withModuleFederation} from '@nx/react/module-federation';
4
+ import { ModuleFederationConfig } from '@nx/module-federation';
4
5
 
5
6
  import baseConfig from './module-federation.config';
6
7
 
@@ -2,24 +2,23 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createFiles = createFiles;
4
4
  const devkit_1 = require("@nx/devkit");
5
- const devkit_2 = require("@nx/devkit");
6
5
  const js_1 = require("@nx/js");
7
6
  const create_ts_config_1 = require("../../../utils/create-ts-config");
8
7
  function createFiles(host, options) {
9
8
  const relativePathToRootTsConfig = (0, js_1.getRelativePathToRootTsConfig)(host, options.projectRoot);
10
9
  const substitutions = {
11
10
  ...options,
12
- ...(0, devkit_2.names)(options.name),
11
+ ...(0, devkit_1.names)(options.name),
13
12
  tmpl: '',
14
- offsetFromRoot: (0, devkit_2.offsetFromRoot)(options.projectRoot),
13
+ offsetFromRoot: (0, devkit_1.offsetFromRoot)(options.projectRoot),
15
14
  fileName: options.fileName,
16
15
  };
17
- (0, devkit_2.generateFiles)(host, (0, devkit_2.joinPathFragments)(__dirname, '../files/common'), options.projectRoot, substitutions);
16
+ (0, devkit_1.generateFiles)(host, (0, devkit_1.joinPathFragments)(__dirname, '../files/common'), options.projectRoot, substitutions);
18
17
  if (options.bundler === 'vite' || options.unitTestRunner === 'vitest') {
19
- (0, devkit_2.generateFiles)(host, (0, devkit_2.joinPathFragments)(__dirname, '../files/vite'), options.projectRoot, substitutions);
18
+ (0, devkit_1.generateFiles)(host, (0, devkit_1.joinPathFragments)(__dirname, '../files/vite'), options.projectRoot, substitutions);
20
19
  }
21
20
  if (options.compiler === 'babel') {
22
- (0, devkit_2.writeJson)(host, (0, devkit_2.joinPathFragments)(options.projectRoot, '.babelrc'), {
21
+ (0, devkit_1.writeJson)(host, (0, devkit_1.joinPathFragments)(options.projectRoot, '.babelrc'), {
23
22
  presets: [
24
23
  [
25
24
  '@nx/react/babel',
@@ -43,22 +42,31 @@ function createFiles(host, options) {
43
42
  ].filter(Boolean),
44
43
  });
45
44
  }
46
- if (!options.publishable &&
47
- !options.buildable &&
45
+ if ((options.publishable || options.buildable) &&
48
46
  !options.isUsingTsSolutionConfig) {
49
- host.delete(`${options.projectRoot}/package.json`);
50
- }
51
- if (options.isUsingTsSolutionConfig) {
52
- (0, devkit_1.updateJson)(host, `${options.projectRoot}/package.json`, (json) => {
53
- json.name = options.importPath;
54
- json.nx = {
55
- name: options.name,
56
- };
57
- return json;
58
- });
47
+ if (options.bundler === 'vite') {
48
+ (0, devkit_1.writeJson)(host, `${options.projectRoot}/package.json`, {
49
+ name: options.importPath,
50
+ version: '0.0.1',
51
+ main: './index.js',
52
+ types: './index.d.ts',
53
+ exports: {
54
+ '.': {
55
+ import: './index.mjs',
56
+ require: './index.js',
57
+ },
58
+ },
59
+ });
60
+ }
61
+ else {
62
+ (0, devkit_1.writeJson)(host, `${options.projectRoot}/package.json`, {
63
+ name: options.importPath,
64
+ version: '0.0.1',
65
+ });
66
+ }
59
67
  }
60
68
  if (options.js) {
61
- (0, devkit_2.toJS)(host);
69
+ (0, devkit_1.toJS)(host);
62
70
  }
63
71
  (0, create_ts_config_1.createTsConfig)(host, options.projectRoot, 'lib', options, relativePathToRootTsConfig);
64
72
  }
@@ -5,7 +5,27 @@ const devkit_1 = require("@nx/devkit");
5
5
  const project_name_and_root_utils_1 = require("@nx/devkit/src/generators/project-name-and-root-utils");
6
6
  const assertion_1 = require("../../../utils/assertion");
7
7
  const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
8
+ const prompt_1 = require("@nx/devkit/src/generators/prompt");
8
9
  async function normalizeOptions(host, options) {
10
+ const isUsingTsSolutionConfig = (0, ts_solution_setup_1.isUsingTsSolutionSetup)(host);
11
+ if (isUsingTsSolutionConfig) {
12
+ options.bundler ??= await (0, prompt_1.promptWhenInteractive)({
13
+ type: 'autocomplete',
14
+ name: 'bundler',
15
+ message: `Which bundler would you like to use to build the library? Choose 'none' to skip build setup.`,
16
+ choices: [{ name: 'vite' }, { name: 'rollup' }, { name: 'none' }],
17
+ initial: 0,
18
+ }, { bundler: 'none' }).then(({ bundler }) => bundler);
19
+ }
20
+ else {
21
+ options.bundler ??= await (0, prompt_1.promptWhenInteractive)({
22
+ type: 'autocomplete',
23
+ name: 'bundler',
24
+ message: `Which bundler would you like to use to build the library? Choose 'none' to skip build setup.`,
25
+ choices: [{ name: 'none' }, { name: 'vite' }, { name: 'rollup' }],
26
+ initial: 0,
27
+ }, { bundler: undefined }).then(({ bundler }) => bundler);
28
+ }
9
29
  await (0, project_name_and_root_utils_1.ensureProjectName)(host, options, 'library');
10
30
  const { projectName, names: projectNames, projectRoot, importPath, } = await (0, project_name_and_root_utils_1.determineProjectNameAndRootOptions)(host, {
11
31
  name: options.name,
@@ -63,7 +83,7 @@ async function normalizeOptions(host, options) {
63
83
  }
64
84
  }
65
85
  (0, assertion_1.assertValidStyle)(normalized.style);
66
- normalized.isUsingTsSolutionConfig = (0, ts_solution_setup_1.isUsingTsSolutionSetup)(host);
86
+ normalized.isUsingTsSolutionConfig = isUsingTsSolutionConfig;
67
87
  return normalized;
68
88
  }
69
89
  function findMainEntry(tree, projectRoot) {
@@ -46,7 +46,17 @@ async function libraryGeneratorInternal(host, schema) {
46
46
  skipFormat: true,
47
47
  });
48
48
  tasks.push(initTask);
49
- if (!options.isUsingTsSolutionConfig) {
49
+ if (options.isUsingTsSolutionConfig) {
50
+ (0, devkit_1.writeJson)(host, `${options.projectRoot}/package.json`, {
51
+ name: options.importPath,
52
+ nx: {
53
+ name: options.importPath === options.name ? undefined : options.name,
54
+ projectType: 'library',
55
+ tags: options.parsedTags?.length ? options.parsedTags : undefined,
56
+ },
57
+ });
58
+ }
59
+ else {
50
60
  (0, devkit_1.addProjectConfiguration)(host, options.name, {
51
61
  root: options.projectRoot,
52
62
  sourceRoot: (0, devkit_1.joinPathFragments)(options.projectRoot, 'src'),
@@ -160,10 +160,7 @@
160
160
  "bundler": {
161
161
  "type": "string",
162
162
  "description": "The bundler to use. Choosing 'none' means this library is not buildable.",
163
- "enum": ["none", "vite", "rollup"],
164
- "default": "none",
165
- "x-prompt": "Which bundler would you like to use to build the library? Choose 'none' to skip build setup.",
166
- "x-priority": "important"
163
+ "enum": ["none", "vite", "rollup"]
167
164
  },
168
165
  "compiler": {
169
166
  "type": "string",
@@ -1,4 +1,4 @@
1
- import {ModuleFederationConfig} from '@nx/rspack/module-federation';
1
+ import {ModuleFederationConfig} from '@nx/module-federation';
2
2
 
3
3
  const config: ModuleFederationConfig = {
4
4
  name: '<%= projectName %>',
@@ -1,4 +1,4 @@
1
- import {ModuleFederationConfig} from '@nx/rspack/module-federation';
1
+ import {ModuleFederationConfig} from '@nx/module-federation';
2
2
 
3
3
  const config: ModuleFederationConfig = {
4
4
  name: '<%= projectName %>',
@@ -1,4 +1,4 @@
1
- import {ModuleFederationConfig} from '@nx/webpack';
1
+ import {ModuleFederationConfig} from '@nx/module-federation';
2
2
 
3
3
  const config: ModuleFederationConfig = {
4
4
  name: '<%= projectName %>',
@@ -1,4 +1,4 @@
1
- import {ModuleFederationConfig} from '@nx/webpack';
1
+ import {ModuleFederationConfig} from '@nx/module-federation';
2
2
 
3
3
  const config: ModuleFederationConfig = {
4
4
  name: '<%= projectName %>',
@@ -0,0 +1,2 @@
1
+ import { Tree } from '@nx/devkit';
2
+ export default function migrateMfImportsToNewPackage(tree: Tree): Promise<void>;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = migrateMfImportsToNewPackage;
4
+ const devkit_1 = require("@nx/devkit");
5
+ const devkit_2 = require("@nx/devkit");
6
+ const tsquery_1 = require("@phenomnomnominal/tsquery");
7
+ const MF_IMPORT_TO_UPDATE = 'ModuleFederationConfig';
8
+ const MF_CONFIG_IMPORT_SELECTOR = `ImportDeclaration:has(StringLiteral[value=@nx/webpack]):has(Identifier[name=ModuleFederationConfig]),ImportDeclaration:has(StringLiteral[value=@nx/rspack/module-federation]):has(Identifier[name=ModuleFederationConfig])`;
9
+ const IMPORT_TOKENS_SELECTOR = `ImportClause ImportSpecifier`;
10
+ const MF_CONFIG_IMPORT_SPECIFIER_SELECTOR = `ImportClause ImportSpecifier > Identifier[name=ModuleFederationConfig]`;
11
+ const WEBPACK_IMPORT_SELECTOR = `ImportDeclaration > StringLiteral[value=@nx/webpack]`;
12
+ const RSPACK_IMPORT_SELECTOR = `ImportDeclaration > StringLiteral[value=@nx/rspack/module-federation]`;
13
+ async function migrateMfImportsToNewPackage(tree) {
14
+ const rootsToCheck = new Set();
15
+ const graph = await (0, devkit_1.createProjectGraphAsync)();
16
+ for (const [project, dependencies] of Object.entries(graph.dependencies)) {
17
+ const usesNxWebpackOrRspack = dependencies.some((dep) => dep.target === 'npm:@nx/webpack' || dep.target === 'npm:@nx/rspack');
18
+ if (usesNxWebpackOrRspack) {
19
+ const root = graph.nodes[project].data.root;
20
+ rootsToCheck.add(root);
21
+ }
22
+ }
23
+ for (const root of rootsToCheck) {
24
+ (0, devkit_2.visitNotIgnoredFiles)(tree, root, (filePath) => {
25
+ if (!filePath.endsWith('.ts') && !filePath.endsWith('.js')) {
26
+ return;
27
+ }
28
+ let contents = tree.read(filePath, 'utf-8');
29
+ if (!contents.includes(MF_IMPORT_TO_UPDATE)) {
30
+ return;
31
+ }
32
+ const ast = tsquery_1.tsquery.ast(contents);
33
+ const importNodes = (0, tsquery_1.tsquery)(ast, MF_CONFIG_IMPORT_SELECTOR);
34
+ if (importNodes.length === 0) {
35
+ return;
36
+ }
37
+ const importNode = importNodes[0];
38
+ const importSpecifiers = (0, tsquery_1.tsquery)(importNode, IMPORT_TOKENS_SELECTOR);
39
+ if (importSpecifiers.length > 1) {
40
+ const mfConfigImportSpecifierNode = (0, tsquery_1.tsquery)(importNode, MF_CONFIG_IMPORT_SPECIFIER_SELECTOR)[0];
41
+ const end = contents.charAt(mfConfigImportSpecifierNode.getEnd()) === ','
42
+ ? mfConfigImportSpecifierNode.getEnd() + 1
43
+ : mfConfigImportSpecifierNode.getEnd();
44
+ contents = `import { ${MF_IMPORT_TO_UPDATE} } from '@nx/module-federation';
45
+ ${contents.slice(0, mfConfigImportSpecifierNode.getStart())}${contents.slice(end)}`;
46
+ }
47
+ else {
48
+ const nxWebpackImportStringNodes = (0, tsquery_1.tsquery)(importNode, WEBPACK_IMPORT_SELECTOR);
49
+ const nxRspackImportStringNodes = (0, tsquery_1.tsquery)(importNode, RSPACK_IMPORT_SELECTOR);
50
+ if (nxWebpackImportStringNodes.length === 0 &&
51
+ nxRspackImportStringNodes.length === 0) {
52
+ return;
53
+ }
54
+ const bundlerImportStringNode = nxWebpackImportStringNodes.length
55
+ ? nxWebpackImportStringNodes[0]
56
+ : nxRspackImportStringNodes[0];
57
+ contents = `${contents.slice(0, bundlerImportStringNode.getStart())}'@nx/module-federation'${contents.slice(bundlerImportStringNode.getEnd())}`;
58
+ }
59
+ tree.write(filePath, contents);
60
+ });
61
+ }
62
+ await (0, devkit_2.formatFiles)(tree);
63
+ }
@@ -1,12 +1,12 @@
1
- import { ModuleFederationConfig } from '@nx/webpack/src/utils/module-federation';
1
+ import { ModuleFederationConfig } from '@nx/module-federation';
2
2
  export declare function getFunctionDeterminateRemoteUrl(isServer?: boolean): (remote: string) => string;
3
3
  export declare function getModuleFederationConfig(mfConfig: ModuleFederationConfig, options?: {
4
4
  isServer: boolean;
5
5
  determineRemoteUrl?: (remote: string) => string;
6
6
  }): Promise<{
7
- sharedLibraries: import("@nx/webpack/src/utils/module-federation").SharedWorkspaceLibraryConfig;
7
+ sharedLibraries: import("@nx/module-federation").SharedWorkspaceLibraryConfig;
8
8
  sharedDependencies: {
9
- [x: string]: import("@nx/webpack/src/utils/module-federation").SharedLibraryConfig;
9
+ [x: string]: import("@nx/module-federation").SharedLibraryConfig;
10
10
  };
11
11
  mappedRemotes: {};
12
12
  }>;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getFunctionDeterminateRemoteUrl = getFunctionDeterminateRemoteUrl;
4
4
  exports.getModuleFederationConfig = getModuleFederationConfig;
5
- const module_federation_1 = require("@nx/webpack/src/utils/module-federation");
5
+ const module_federation_1 = require("@nx/module-federation");
6
6
  const devkit_1 = require("@nx/devkit");
7
7
  const project_graph_1 = require("nx/src/project-graph/project-graph");
8
8
  function getFunctionDeterminateRemoteUrl(isServer = false) {
@@ -1,2 +1,2 @@
1
- import { ModuleFederationConfig, NxModuleFederationConfigOverride } from '@nx/webpack/src/utils/module-federation';
1
+ import { ModuleFederationConfig, NxModuleFederationConfigOverride } from '@nx/module-federation';
2
2
  export declare function withModuleFederationForSSR(options: ModuleFederationConfig, configOverride?: NxModuleFederationConfigOverride): Promise<(config: any) => any>;
@@ -32,7 +32,7 @@ async function withModuleFederationForSSR(options, configOverride) {
32
32
  !options.disableNxRuntimeLibraryControlPlugin
33
33
  ? [
34
34
  ...(configOverride?.runtimePlugins ?? []),
35
- require.resolve('@nx/webpack/src/utils/module-federation/plugins/runtime-library-control.plugin.js'),
35
+ require.resolve('@nx/module-federation/src/utils/plugins/runtime-library-control.plugin.js'),
36
36
  ]
37
37
  : [
38
38
  ...(configOverride?.runtimePlugins ?? []),
@@ -1,4 +1,4 @@
1
- import { ModuleFederationConfig, NxModuleFederationConfigOverride } from '@nx/webpack/src/utils/module-federation';
1
+ import { ModuleFederationConfig, NxModuleFederationConfigOverride } from '@nx/module-federation';
2
2
  import type { AsyncNxComposableWebpackPlugin } from '@nx/webpack';
3
3
  /**
4
4
  * @param {ModuleFederationConfig} options
@@ -48,7 +48,7 @@ async function withModuleFederation(options, configOverride) {
48
48
  !options.disableNxRuntimeLibraryControlPlugin
49
49
  ? [
50
50
  ...(configOverride?.runtimePlugins ?? []),
51
- require.resolve('@nx/webpack/src/utils/module-federation/plugins/runtime-library-control.plugin.js'),
51
+ require.resolve('@nx/module-federation/src/utils/plugins/runtime-library-control.plugin.js'),
52
52
  ]
53
53
  : configOverride?.runtimePlugins,
54
54
  virtualRuntimeEntry: true,
@@ -1,4 +0,0 @@
1
- {
2
- "name": "<%= name %>",
3
- "version": "0.0.1"
4
- }
@@ -1,12 +0,0 @@
1
- {
2
- "name": "<%= name %>",
3
- "version": "0.0.1",
4
- "main": "./index.js",
5
- "types": "./index.d.ts",
6
- "exports": {
7
- ".": {
8
- "import": "./index.mjs",
9
- "require": "./index.js"
10
- }
11
- }
12
- }
@@ -1,3 +0,0 @@
1
- import { ExecutorContext } from '@nx/devkit';
2
- import { ModuleFederationConfig } from './models';
3
- export declare function loadModuleFederationConfigFromContext(context: ExecutorContext): ModuleFederationConfig;
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.loadModuleFederationConfigFromContext = loadModuleFederationConfigFromContext;
4
- const path_1 = require("path");
5
- function loadModuleFederationConfigFromContext(context) {
6
- const p = context.projectsConfigurations.projects[context.projectName];
7
- const moduleFederationConfigPath = (0, path_1.join)(context.root, p.root, 'module-federation.config.js');
8
- try {
9
- return require(moduleFederationConfigPath);
10
- }
11
- catch {
12
- // TODO(jack): Add a link to guide
13
- throw new Error(`Could not load ${moduleFederationConfigPath}. Was this project generated with "@nx/react:host"?`);
14
- }
15
- }
@@ -1,24 +0,0 @@
1
- export type ModuleFederationLibrary = {
2
- type: string;
3
- name: string;
4
- };
5
- export type Remotes = string[] | [remoteName: string, remoteUrl: string][];
6
- export interface SharedLibraryConfig {
7
- singleton?: boolean;
8
- strictVersion?: boolean;
9
- requiredVersion?: false | string;
10
- eager?: boolean;
11
- }
12
- export type SharedFunction = (libraryName: string, sharedConfig: SharedLibraryConfig) => undefined | false | SharedLibraryConfig;
13
- export type AdditionalSharedConfig = Array<string | [libraryName: string, sharedConfig: SharedLibraryConfig] | {
14
- libraryName: string;
15
- sharedConfig: SharedLibraryConfig;
16
- }>;
17
- export interface ModuleFederationConfig {
18
- name: string;
19
- remotes?: Remotes;
20
- library?: ModuleFederationLibrary;
21
- exposes?: Record<string, string>;
22
- shared?: SharedFunction;
23
- additionalShared?: AdditionalSharedConfig;
24
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,8 +0,0 @@
1
- export declare function readRootPackageJson(): {
2
- dependencies?: {
3
- [key: string]: string;
4
- };
5
- devDependencies?: {
6
- [key: string]: string;
7
- };
8
- };
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.readRootPackageJson = readRootPackageJson;
4
- const devkit_1 = require("@nx/devkit");
5
- const fs_1 = require("fs");
6
- function readRootPackageJson() {
7
- const pkgJsonPath = (0, devkit_1.joinPathFragments)(devkit_1.workspaceRoot, 'package.json');
8
- if (!(0, fs_1.existsSync)(pkgJsonPath)) {
9
- throw new Error('NX MFE: Could not find root package.json to determine dependency versions.');
10
- }
11
- return (0, devkit_1.readJsonFile)(pkgJsonPath);
12
- }