@nx/react 0.0.0-pr-29047-57d3073 → 0.0.0-pr-28808-eac89e6

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 (49) hide show
  1. package/package.json +6 -6
  2. package/src/generators/application/application.js +25 -6
  3. package/src/generators/application/files/base-rspack/tsconfig.app.json__tmpl__ +21 -4
  4. package/src/generators/application/files/base-vite/tsconfig.app.json__tmpl__ +19 -2
  5. package/src/generators/application/files/base-webpack/tsconfig.app.json__tmpl__ +20 -3
  6. package/src/generators/application/files/style-css-module/src/app/__fileName__.tsx__tmpl__ +2 -2
  7. package/src/generators/application/lib/add-e2e.d.ts +1 -1
  8. package/src/generators/application/lib/add-e2e.js +45 -15
  9. package/src/generators/application/lib/add-jest.js +1 -0
  10. package/src/generators/application/lib/add-project.js +19 -3
  11. package/src/generators/application/lib/create-application-files.js +2 -0
  12. package/src/generators/application/lib/normalize-options.js +2 -0
  13. package/src/generators/application/lib/update-jest-config.js +5 -0
  14. package/src/generators/application/schema.d.ts +5 -0
  15. package/src/generators/application/schema.json +19 -15
  16. package/src/generators/component/component.js +3 -1
  17. package/src/generators/component/lib/normalize-options.js +2 -1
  18. package/src/generators/component/schema.d.ts +1 -0
  19. package/src/generators/host/files/rspack-module-federation/rspack.config.js__tmpl__ +1 -1
  20. package/src/generators/host/files/rspack-module-federation/rspack.config.prod.js__tmpl__ +1 -1
  21. package/src/generators/host/files/rspack-module-federation-ssr/rspack.server.config.js__tmpl__ +1 -1
  22. package/src/generators/host/files/rspack-module-federation-ssr-ts/rspack.server.config.ts__tmpl__ +1 -1
  23. package/src/generators/host/files/rspack-module-federation-ts/rspack.config.prod.ts__tmpl__ +1 -1
  24. package/src/generators/host/files/rspack-module-federation-ts/rspack.config.ts__tmpl__ +1 -1
  25. package/src/generators/host/host.js +3 -2
  26. package/src/generators/host/lib/update-module-federation-tsconfig.d.ts +3 -0
  27. package/src/generators/host/lib/update-module-federation-tsconfig.js +39 -0
  28. package/src/generators/init/init.js +0 -2
  29. package/src/generators/library/lib/create-files.d.ts +1 -1
  30. package/src/generators/library/lib/create-files.js +22 -2
  31. package/src/generators/library/lib/normalize-options.js +22 -0
  32. package/src/generators/library/library.js +35 -16
  33. package/src/generators/library/schema.d.ts +1 -0
  34. package/src/generators/library/schema.json +6 -6
  35. package/src/generators/remote/files/rspack-module-federation/rspack.config.js__tmpl__ +1 -1
  36. package/src/generators/remote/files/rspack-module-federation-ssr/rspack.server.config.js__tmpl__ +1 -1
  37. package/src/generators/remote/files/rspack-module-federation-ssr-ts/rspack.server.config.ts__tmpl__ +1 -1
  38. package/src/generators/remote/files/rspack-module-federation-ts/rspack.config.ts__tmpl__ +1 -1
  39. package/src/generators/remote/remote.js +1 -2
  40. package/src/migrations/update-20-2-0/migrate-with-mf-import-to-new-package.js +2 -2
  41. package/src/rules/update-module-federation-project.js +6 -0
  42. package/src/utils/build-static.remotes.d.ts +1 -1
  43. package/src/utils/create-ts-config.js +57 -7
  44. package/src/utils/versions.d.ts +0 -1
  45. package/src/utils/versions.js +1 -3
  46. package/src/generators/application/lib/add-project-root-to-rspack-plugin-excludes.d.ts +0 -2
  47. package/src/generators/application/lib/add-project-root-to-rspack-plugin-excludes.js +0 -31
  48. package/src/generators/library/files/common/package.json__tmpl__ +0 -4
  49. package/src/generators/library/files/vite/package.json__tmpl__ +0 -12
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/react",
3
- "version": "0.0.0-pr-29047-57d3073",
3
+ "version": "0.0.0-pr-28808-eac89e6",
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": {
@@ -38,11 +38,11 @@
38
38
  "minimatch": "9.0.3",
39
39
  "picocolors": "^1.1.0",
40
40
  "tslib": "^2.3.0",
41
- "@nx/devkit": "0.0.0-pr-29047-57d3073",
42
- "@nx/js": "0.0.0-pr-29047-57d3073",
43
- "@nx/eslint": "0.0.0-pr-29047-57d3073",
44
- "@nx/web": "0.0.0-pr-29047-57d3073",
45
- "@nx/module-federation": "0.0.0-pr-29047-57d3073",
41
+ "@nx/devkit": "0.0.0-pr-28808-eac89e6",
42
+ "@nx/js": "0.0.0-pr-28808-eac89e6",
43
+ "@nx/eslint": "0.0.0-pr-28808-eac89e6",
44
+ "@nx/web": "0.0.0-pr-28808-eac89e6",
45
+ "@nx/module-federation": "0.0.0-pr-28808-eac89e6",
46
46
  "express": "^4.19.2",
47
47
  "http-proxy-middleware": "^3.0.3"
48
48
  },
@@ -15,6 +15,7 @@ const devkit_1 = require("@nx/devkit");
15
15
  const init_1 = require("../init/init");
16
16
  const eslint_1 = require("@nx/eslint");
17
17
  const versions_1 = require("../../utils/versions");
18
+ const maybe_js_1 = require("../../utils/maybe-js");
18
19
  const install_common_dependencies_1 = require("./lib/install-common-dependencies");
19
20
  const create_ts_config_1 = require("../../utils/create-ts-config");
20
21
  const add_swc_dependencies_1 = require("@nx/js/src/utils/swc/add-swc-dependencies");
@@ -27,7 +28,6 @@ const log_show_project_command_1 = require("@nx/devkit/src/utils/log-show-projec
27
28
  const setup_tailwind_1 = require("../setup-tailwind/setup-tailwind");
28
29
  const flat_config_1 = require("@nx/eslint/src/utils/flat-config");
29
30
  const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
30
- const add_project_root_to_rspack_plugin_excludes_1 = require("./lib/add-project-root-to-rspack-plugin-excludes");
31
31
  async function addLinting(host, options) {
32
32
  const tasks = [];
33
33
  if (options.linter === eslint_1.Linter.EsLint) {
@@ -73,16 +73,17 @@ async function applicationGenerator(host, schema) {
73
73
  });
74
74
  }
75
75
  async function applicationGeneratorInternal(host, schema) {
76
- (0, ts_solution_setup_1.assertNotUsingTsSolutionSetup)(host, 'react', 'application');
77
76
  const tasks = [];
78
- const options = await (0, normalize_options_1.normalizeOptions)(host, schema);
79
- (0, show_possible_warnings_1.showPossibleWarnings)(host, options);
80
77
  const jsInitTask = await (0, js_1.initGenerator)(host, {
81
78
  ...schema,
82
79
  tsConfigName: schema.rootProject ? 'tsconfig.json' : 'tsconfig.base.json',
83
80
  skipFormat: true,
81
+ addTsPlugin: schema.useTsSolution,
82
+ formatter: schema.formatter,
84
83
  });
85
84
  tasks.push(jsInitTask);
85
+ const options = await (0, normalize_options_1.normalizeOptions)(host, schema);
86
+ (0, show_possible_warnings_1.showPossibleWarnings)(host, options);
86
87
  const initTask = await (0, init_1.default)(host, {
87
88
  ...options,
88
89
  skipFormat: true,
@@ -116,7 +117,7 @@ async function applicationGeneratorInternal(host, schema) {
116
117
  }
117
118
  }
118
119
  else if (options.bundler === 'rspack') {
119
- const { rspackInitGenerator } = (0, devkit_1.ensurePackage)('@nx/rspack', versions_1.nxRspackVersion);
120
+ const { rspackInitGenerator } = (0, devkit_1.ensurePackage)('@nx/rspack', versions_1.nxVersion);
120
121
  const rspackInitTask = await rspackInitGenerator(host, {
121
122
  ...options,
122
123
  addPlugin: false,
@@ -151,6 +152,7 @@ async function applicationGeneratorInternal(host, schema) {
151
152
  compiler: options.compiler,
152
153
  skipFormat: true,
153
154
  addPlugin: options.addPlugin,
155
+ projectType: 'application',
154
156
  });
155
157
  tasks.push(viteTask);
156
158
  createOrEditViteConfig(host, {
@@ -172,7 +174,19 @@ async function applicationGeneratorInternal(host, schema) {
172
174
  }, false);
173
175
  }
174
176
  else if (options.bundler === 'rspack') {
175
- (0, add_project_root_to_rspack_plugin_excludes_1.addProjectRootToRspackPluginExcludesIfExists)(host, options.appProjectRoot);
177
+ const { configurationGenerator } = (0, devkit_1.ensurePackage)('@nx/rspack', versions_1.nxVersion);
178
+ const rspackTask = await configurationGenerator(host, {
179
+ project: options.projectName,
180
+ main: (0, devkit_1.joinPathFragments)(options.appProjectRoot, (0, maybe_js_1.maybeJs)({
181
+ js: options.js,
182
+ useJsx: true,
183
+ }, `src/main.tsx`)),
184
+ tsConfig: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.app.json'),
185
+ target: 'web',
186
+ newProject: true,
187
+ framework: 'react',
188
+ });
189
+ tasks.push(rspackTask);
176
190
  }
177
191
  if (options.bundler !== 'vite' && options.unitTestRunner === 'vitest') {
178
192
  const { createOrEditViteConfig, vitestGenerator } = (0, devkit_1.ensurePackage)('@nx/vite', versions_1.nxVersion);
@@ -246,6 +260,11 @@ async function applicationGeneratorInternal(host, schema) {
246
260
  });
247
261
  `);
248
262
  }
263
+ (0, ts_solution_setup_1.updateTsconfigFiles)(host, options.appProjectRoot, 'tsconfig.app.json', {
264
+ jsx: 'react-jsx',
265
+ module: 'esnext',
266
+ moduleResolution: 'bundler',
267
+ });
249
268
  if (!options.skipFormat) {
250
269
  await (0, devkit_1.formatFiles)(host);
251
270
  }
@@ -1,14 +1,31 @@
1
- {
1
+ <%_ if (isUsingTsSolutionSetup) { _%>{
2
+ "extends": "<%= offsetFromRoot%>tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
6
+ "jsx": "react-jsx",
7
+ "lib": ["dom"],
8
+ "types": [
9
+ "node",
10
+ <%_ if (style === 'styled-jsx') { _%>"@nx/react/typings/styled-jsx.d.ts",<%_ } _%>
11
+ "@nx/react/typings/cssmodule.d.ts",
12
+ "@nx/react/typings/image.d.ts"
13
+ ]
14
+ },
15
+ "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts", "src/**/*.spec.tsx", "src/**/*.test.tsx", "src/**/*.spec.js", "src/**/*.test.js", "src/**/*.spec.jsx", "src/**/*.test.jsx"],
16
+ "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"]
17
+ }<% } else { %>{
2
18
  "extends": "./tsconfig.json",
3
19
  "compilerOptions": {
4
20
  "outDir": "<%= offsetFromRoot %>dist/out-tsc",
5
21
  "types": [
6
22
  "node",
7
- <%_ if (style === 'styled-jsx') { %>"@nx/react/typings/styled-jsx.d.ts",<% } _%>
23
+ <%_ if (style === 'styled-jsx') { _%>"@nx/react/typings/styled-jsx.d.ts",<%_ } _%>
8
24
  "@nx/react/typings/cssmodule.d.ts",
9
25
  "@nx/react/typings/image.d.ts"
10
- ]
26
+ ]
11
27
  },
12
- "exclude": ["jest.config.ts","src/**/*.spec.ts", "src/**/*.test.ts", "src/**/*.spec.tsx", "src/**/*.test.tsx", "src/**/*.spec.js", "src/**/*.test.js", "src/**/*.spec.jsx", "src/**/*.test.jsx"],
28
+ "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts", "src/**/*.spec.tsx", "src/**/*.test.tsx", "src/**/*.spec.js", "src/**/*.test.js", "src/**/*.spec.jsx", "src/**/*.test.jsx"],
13
29
  "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"]
14
30
  }
31
+ <% } %>
@@ -1,4 +1,20 @@
1
- {
1
+ <%_ if (isUsingTsSolutionSetup) { _%>{
2
+ "extends": "<%= offsetFromRoot%>tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
6
+ "jsx": "react-jsx",
7
+ "lib": ["dom"],
8
+ "types": [
9
+ "node",
10
+ <%_ if (style === 'styled-jsx') { _%>"@nx/react/typings/styled-jsx.d.ts",<%_ } _%>
11
+ "@nx/react/typings/cssmodule.d.ts",
12
+ "@nx/react/typings/image.d.ts"
13
+ ]
14
+ },
15
+ "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts", "src/**/*.spec.tsx", "src/**/*.test.tsx", "src/**/*.spec.js", "src/**/*.test.js", "src/**/*.spec.jsx", "src/**/*.test.jsx"],
16
+ "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"]
17
+ }<% } else { %>{
2
18
  "extends": "./tsconfig.json",
3
19
  "compilerOptions": {
4
20
  "outDir": "<%= offsetFromRoot %>dist/out-tsc",
@@ -7,8 +23,9 @@
7
23
  <%_ if (style === 'styled-jsx') { _%>"@nx/react/typings/styled-jsx.d.ts",<%_ } _%>
8
24
  "@nx/react/typings/cssmodule.d.ts",
9
25
  "@nx/react/typings/image.d.ts"
10
- ]
26
+ ]
11
27
  },
12
28
  "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts", "src/**/*.spec.tsx", "src/**/*.test.tsx", "src/**/*.spec.js", "src/**/*.test.js", "src/**/*.spec.jsx", "src/**/*.test.jsx"],
13
29
  "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"]
14
30
  }
31
+ <% } %>
@@ -1,4 +1,20 @@
1
- {
1
+ <%_ if (isUsingTsSolutionSetup) { _%>{
2
+ "extends": "<%= offsetFromRoot%>tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
6
+ "jsx": "react-jsx",
7
+ "lib": ["dom"],
8
+ "types": [
9
+ "node",
10
+ <%_ if (style === 'styled-jsx') { _%>"@nx/react/typings/styled-jsx.d.ts",<%_ } _%>
11
+ "@nx/react/typings/cssmodule.d.ts",
12
+ "@nx/react/typings/image.d.ts"
13
+ ]
14
+ },
15
+ "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts", "src/**/*.spec.tsx", "src/**/*.test.tsx", "src/**/*.spec.js", "src/**/*.test.js", "src/**/*.spec.jsx", "src/**/*.test.jsx"],
16
+ "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"]
17
+ }<% } else { %>{
2
18
  "extends": "./tsconfig.json",
3
19
  "compilerOptions": {
4
20
  "outDir": "<%= offsetFromRoot %>dist/out-tsc",
@@ -7,8 +23,9 @@
7
23
  <%_ if (style === 'styled-jsx') { _%>"@nx/react/typings/styled-jsx.d.ts",<%_ } _%>
8
24
  "@nx/react/typings/cssmodule.d.ts",
9
25
  "@nx/react/typings/image.d.ts"
10
- ]
26
+ ]
11
27
  },
12
- "exclude": ["jest.config.ts","src/**/*.spec.ts", "src/**/*.test.ts", "src/**/*.spec.tsx", "src/**/*.test.tsx", "src/**/*.spec.js", "src/**/*.test.js", "src/**/*.spec.jsx", "src/**/*.test.jsx"],
28
+ "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts", "src/**/*.spec.tsx", "src/**/*.test.tsx", "src/**/*.spec.js", "src/**/*.test.js", "src/**/*.spec.jsx", "src/**/*.test.jsx"],
13
29
  "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"]
14
30
  }
31
+ <% } %>
@@ -1,8 +1,8 @@
1
1
  <% if (classComponent) { %>
2
2
  import { Component } from 'react';
3
3
  <%_ } _%>
4
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
5
- import styles from './<%= fileName %>.module.<%= style %>';
4
+ // Uncomment this line to use CSS modules
5
+ // import styles from './<%= fileName %>.module.<%= style %>';
6
6
  <%_ if (!minimal) { _%>
7
7
  import NxWelcome from "./nx-welcome";
8
8
  <%_ } _%>
@@ -1,3 +1,3 @@
1
- import type { GeneratorCallback, Tree } from '@nx/devkit';
1
+ import { GeneratorCallback, Tree } from '@nx/devkit';
2
2
  import { NormalizedSchema } from '../schema';
3
3
  export declare function addE2e(tree: Tree, options: NormalizedSchema): Promise<GeneratorCallback>;
@@ -6,10 +6,12 @@ const web_1 = require("@nx/web");
6
6
  const versions_1 = require("../../../utils/versions");
7
7
  const has_webpack_plugin_1 = require("../../../utils/has-webpack-plugin");
8
8
  const has_vite_plugin_1 = require("../../../utils/has-vite-plugin");
9
+ const has_rspack_plugin_1 = require("../../../utils/has-rspack-plugin");
9
10
  const find_plugin_for_config_file_1 = require("@nx/devkit/src/utils/find-plugin-for-config-file");
10
11
  const target_defaults_utils_1 = require("@nx/devkit/src/generators/target-defaults-utils");
11
12
  async function addE2e(tree, options) {
12
13
  const hasNxBuildPlugin = (options.bundler === 'webpack' && (0, has_webpack_plugin_1.hasWebpackPlugin)(tree)) ||
14
+ (options.bundler === 'rspack' && (0, has_rspack_plugin_1.hasRspackPlugin)(tree)) ||
13
15
  (options.bundler === 'vite' && (0, has_vite_plugin_1.hasVitePlugin)(tree));
14
16
  let e2eWebServerInfo = {
15
17
  e2eWebServerAddress: `http://localhost:${options.devServerPort ?? 4200}`,
@@ -36,14 +38,28 @@ async function addE2e(tree, options) {
36
38
  switch (options.e2eTestRunner) {
37
39
  case 'cypress': {
38
40
  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
- });
41
+ if (options.isUsingTsSolutionConfig) {
42
+ (0, devkit_1.writeJson)(tree, (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'package.json'), {
43
+ name: options.e2eProjectName,
44
+ version: '0.0.1',
45
+ private: true,
46
+ nx: {
47
+ projectType: 'application',
48
+ sourceRoot: (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'src'),
49
+ implicitDependencies: [options.projectName],
50
+ },
51
+ });
52
+ }
53
+ else {
54
+ (0, devkit_1.addProjectConfiguration)(tree, options.e2eProjectName, {
55
+ projectType: 'application',
56
+ root: options.e2eProjectRoot,
57
+ sourceRoot: (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'src'),
58
+ targets: {},
59
+ implicitDependencies: [options.projectName],
60
+ tags: [],
61
+ });
62
+ }
47
63
  const e2eTask = await configurationGenerator(tree, {
48
64
  ...options,
49
65
  project: options.e2eProjectName,
@@ -88,13 +104,27 @@ async function addE2e(tree, options) {
88
104
  }
89
105
  case 'playwright': {
90
106
  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
- });
107
+ if (options.isUsingTsSolutionConfig) {
108
+ (0, devkit_1.writeJson)(tree, (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'package.json'), {
109
+ name: options.e2eProjectName,
110
+ version: '0.0.1',
111
+ private: true,
112
+ nx: {
113
+ projectType: 'application',
114
+ sourceRoot: (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'src'),
115
+ implicitDependencies: [options.projectName],
116
+ },
117
+ });
118
+ }
119
+ else {
120
+ (0, devkit_1.addProjectConfiguration)(tree, options.e2eProjectName, {
121
+ projectType: 'application',
122
+ root: options.e2eProjectRoot,
123
+ sourceRoot: (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'src'),
124
+ targets: {},
125
+ implicitDependencies: [options.projectName],
126
+ });
127
+ }
98
128
  const e2eTask = await configurationGenerator(tree, {
99
129
  project: options.e2eProjectName,
100
130
  skipFormat: true,
@@ -16,5 +16,6 @@ async function addJest(host, options) {
16
16
  setupFile: 'none',
17
17
  compiler: options.compiler,
18
18
  skipFormat: true,
19
+ runtimeTsconfigFileName: 'tsconfig.app.json',
19
20
  });
20
21
  }
@@ -5,6 +5,7 @@ const devkit_1 = require("@nx/devkit");
5
5
  const has_webpack_plugin_1 = require("../../../utils/has-webpack-plugin");
6
6
  const maybe_js_1 = require("../../../utils/maybe-js");
7
7
  const has_rspack_plugin_1 = require("../../../utils/has-rspack-plugin");
8
+ const get_import_path_1 = require("@nx/js/src/utils/get-import-path");
8
9
  function addProject(host, options) {
9
10
  const project = {
10
11
  root: options.appProjectRoot,
@@ -28,9 +29,24 @@ function addProject(host, options) {
28
29
  serve: createRspackServeTarget(options),
29
30
  };
30
31
  }
31
- (0, devkit_1.addProjectConfiguration)(host, options.projectName, {
32
- ...project,
33
- });
32
+ if (options.isUsingTsSolutionConfig) {
33
+ (0, devkit_1.writeJson)(host, (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'package.json'), {
34
+ name: (0, get_import_path_1.getImportPath)(host, options.name),
35
+ version: '0.0.1',
36
+ private: true,
37
+ nx: {
38
+ name: options.name,
39
+ projectType: 'application',
40
+ sourceRoot: `${options.appProjectRoot}/src`,
41
+ tags: options.parsedTags?.length ? options.parsedTags : undefined,
42
+ },
43
+ });
44
+ }
45
+ if (!options.isUsingTsSolutionConfig || options.alwaysGenerateProjectJson) {
46
+ (0, devkit_1.addProjectConfiguration)(host, options.projectName, {
47
+ ...project,
48
+ });
49
+ }
34
50
  }
35
51
  function createRspackBuildTarget(options) {
36
52
  return {
@@ -11,6 +11,7 @@ const has_webpack_plugin_1 = require("../../../utils/has-webpack-plugin");
11
11
  const get_app_tests_1 = require("./get-app-tests");
12
12
  const onboarding_1 = require("nx/src/nx-cloud/utilities/onboarding");
13
13
  const has_rspack_plugin_1 = require("../../../utils/has-rspack-plugin");
14
+ const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
14
15
  async function createApplicationFiles(host, options) {
15
16
  let styleSolutionSpecificAppFiles;
16
17
  if (options.styledModule && options.style !== 'styled-jsx') {
@@ -47,6 +48,7 @@ async function createApplicationFiles(host, options) {
47
48
  inSourceVitestTests: (0, get_in_source_vitest_tests_template_1.getInSourceVitestTestsTemplate)(appTests),
48
49
  style: options.style === 'tailwind' ? 'css' : options.style,
49
50
  hasStyleFile,
51
+ isUsingTsSolutionSetup: (0, ts_solution_setup_1.isUsingTsSolutionSetup)(host),
50
52
  };
51
53
  if (options.bundler === 'vite') {
52
54
  (0, devkit_1.generateFiles)(host, (0, path_1.join)(__dirname, '../files/base-vite'), options.appProjectRoot, templateVariables);
@@ -7,6 +7,7 @@ const devkit_1 = require("@nx/devkit");
7
7
  const project_name_and_root_utils_1 = require("@nx/devkit/src/generators/project-name-and-root-utils");
8
8
  const assertion_1 = require("../../../utils/assertion");
9
9
  const find_free_port_1 = require("./find-free-port");
10
+ const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
10
11
  function normalizeDirectory(options) {
11
12
  options.directory = options.directory?.replace(/\\{1,2}/g, '/');
12
13
  const { projectDirectory } = (0, devkit_1.extractLayoutDirectory)(options.directory);
@@ -51,6 +52,7 @@ async function normalizeOptions(host, options) {
51
52
  fileName,
52
53
  styledModule,
53
54
  hasStyles: options.style !== 'none',
55
+ isUsingTsSolutionConfig: (0, ts_solution_setup_1.isUsingTsSolutionSetup)(host),
54
56
  };
55
57
  normalized.routing = normalized.routing ?? false;
56
58
  normalized.strict = normalized.strict ?? true;
@@ -17,6 +17,11 @@ function updateSpecConfig(host, options) {
17
17
  types.push('@nx/react/typings/cssmodule.d.ts', '@nx/react/typings/image.d.ts');
18
18
  compilerOptions.types = types;
19
19
  json.compilerOptions = compilerOptions;
20
+ if (options.isUsingTsSolutionConfig) {
21
+ // add project reference to the runtime tsconfig.app.json file
22
+ json.references ??= [];
23
+ json.references.push({ path: './tsconfig.app.json' });
24
+ }
20
25
  return json;
21
26
  });
22
27
  if (options.unitTestRunner !== 'jest') {
@@ -25,8 +25,12 @@ export interface Schema {
25
25
  rootProject?: boolean;
26
26
  bundler?: 'webpack' | 'vite' | 'rspack';
27
27
  minimal?: boolean;
28
+ // Internal options
28
29
  addPlugin?: boolean;
29
30
  nxCloudToken?: string;
31
+ useTsSolution?: boolean;
32
+ formatter?: 'prettier' | 'none';
33
+ alwaysGenerateProjectJson?: boolean; // this is needed for MF currently
30
34
  }
31
35
 
32
36
  export interface NormalizedSchema<T extends Schema = Schema> extends T {
@@ -40,4 +44,5 @@ export interface NormalizedSchema<T extends Schema = Schema> extends T {
40
44
  hasStyles: boolean;
41
45
  unitTestRunner: 'jest' | 'vitest' | 'none';
42
46
  addPlugin?: boolean;
47
+ isUsingTsSolutionConfig?: boolean;
43
48
  }
@@ -80,12 +80,6 @@
80
80
  ]
81
81
  }
82
82
  },
83
- "linter": {
84
- "description": "The tool to use for running lint checks.",
85
- "type": "string",
86
- "enum": ["eslint", "none"],
87
- "default": "eslint"
88
- },
89
83
  "routing": {
90
84
  "type": "boolean",
91
85
  "description": "Generate application with routes.",
@@ -104,11 +98,29 @@
104
98
  "default": false,
105
99
  "x-priority": "internal"
106
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
+ },
109
+ "linter": {
110
+ "description": "The tool to use for running lint checks.",
111
+ "type": "string",
112
+ "enum": ["eslint", "none"],
113
+ "default": "eslint",
114
+ "x-prompt": "Which linter would you like to use?",
115
+ "x-priority": "important"
116
+ },
107
117
  "unitTestRunner": {
108
118
  "type": "string",
109
119
  "enum": ["vitest", "jest", "none"],
110
120
  "description": "Test runner to use for unit tests.",
111
- "default": "vitest"
121
+ "default": "vitest",
122
+ "x-prompt": "What unit test runner should be used?",
123
+ "x-priority": "important"
112
124
  },
113
125
  "inSourceTests": {
114
126
  "type": "boolean",
@@ -171,14 +183,6 @@
171
183
  "default": false,
172
184
  "hidden": true
173
185
  },
174
- "bundler": {
175
- "description": "The bundler to use.",
176
- "type": "string",
177
- "enum": ["vite", "webpack", "rspack"],
178
- "x-prompt": "Which bundler do you want to use to build the application?",
179
- "default": "vite",
180
- "x-priority": "important"
181
- },
182
186
  "minimal": {
183
187
  "description": "Generate a React app with a minimal setup, no separate test files.",
184
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,5 +1,5 @@
1
1
  const { composePlugins, withNx, withReact } = require('@nx/rspack');
2
- const { withModuleFederation } = require('@nx/rspack/module-federation');
2
+ const { withModuleFederation } = require('@nx/module-federation/rspack');
3
3
 
4
4
  const baseConfig = require('./module-federation.config');
5
5
 
@@ -1,5 +1,5 @@
1
1
  const { composePlugins, withNx, withReact } = require('@nx/rspack');
2
- const { withModuleFederation } = require('@nx/rspack/module-federation');
2
+ const { withModuleFederation } = require('@nx/module-federation/rspack');
3
3
 
4
4
  const baseConfig = require('./module-federation.config');
5
5
 
@@ -1,5 +1,5 @@
1
1
  const {composePlugins, withNx, withReact} = require('@nx/rspack');
2
- const {withModuleFederationForSSR} = require('@nx/rspack/module-federation');
2
+ const {withModuleFederationForSSR} = require('@nx/module-federation/rspack');
3
3
 
4
4
  const baseConfig = require('./module-federation.config');
5
5
 
@@ -1,5 +1,5 @@
1
1
  import {composePlugins, withNx, withReact} from '@nx/rspack';
2
- import {withModuleFederationForSSR} from '@nx/rspack/module-federation';
2
+ import {withModuleFederationForSSR} from '@nx/module-federation/rspack';
3
3
 
4
4
  import baseConfig from './module-federation.config';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { composePlugins, withNx, withReact } from '@nx/rspack';
2
- import { withModuleFederation } from '@nx/rspack/module-federation';
2
+ import { withModuleFederation } from '@nx/module-federation/rspack';
3
3
  import { ModuleFederationConfig } from '@nx/module-federation';
4
4
 
5
5
  import baseConfig from './module-federation.config';
@@ -1,5 +1,5 @@
1
1
  import {composePlugins, withNx, withReact} from '@nx/rspack';
2
- import { withModuleFederation } from '@nx/rspack/module-federation';
2
+ import { withModuleFederation } from '@nx/module-federation/rspack';
3
3
  import { ModuleFederationConfig } from '@nx/module-federation';
4
4
 
5
5
  import baseConfig from './module-federation.config';
@@ -15,9 +15,8 @@ const add_mf_env_to_inputs_1 = require("../../utils/add-mf-env-to-inputs");
15
15
  const js_1 = require("@nx/js");
16
16
  const versions_1 = require("../../utils/versions");
17
17
  const project_name_and_root_utils_1 = require("@nx/devkit/src/generators/project-name-and-root-utils");
18
- const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
18
+ const update_module_federation_tsconfig_1 = require("./lib/update-module-federation-tsconfig");
19
19
  async function hostGenerator(host, schema) {
20
- (0, ts_solution_setup_1.assertNotUsingTsSolutionSetup)(host, 'react', 'host');
21
20
  const tasks = [];
22
21
  const options = {
23
22
  ...(await (0, normalize_options_1.normalizeOptions)(host, schema)),
@@ -48,6 +47,7 @@ async function hostGenerator(host, schema) {
48
47
  // The target use-case is loading remotes as child routes, thus always enable routing.
49
48
  routing: true,
50
49
  skipFormat: true,
50
+ alwaysGenerateProjectJson: true,
51
51
  });
52
52
  tasks.push(initTask);
53
53
  const remotesWithPorts = [];
@@ -80,6 +80,7 @@ async function hostGenerator(host, schema) {
80
80
  (0, add_module_federation_files_1.addModuleFederationFiles)(host, options, remotesWithPorts);
81
81
  (0, update_module_federation_project_1.updateModuleFederationProject)(host, options);
82
82
  (0, update_module_federation_e2e_project_1.updateModuleFederationE2eProject)(host, options);
83
+ (0, update_module_federation_tsconfig_1.updateModuleFederationTsconfig)(host, options);
83
84
  if (options.ssr) {
84
85
  const setupSsrTask = await (0, setup_ssr_1.default)(host, {
85
86
  project: options.projectName,
@@ -0,0 +1,3 @@
1
+ import { type Tree } from '@nx/devkit';
2
+ import { NormalizedSchema } from '../schema';
3
+ export declare function updateModuleFederationTsconfig(host: Tree, options: NormalizedSchema): void;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateModuleFederationTsconfig = updateModuleFederationTsconfig;
4
+ const devkit_1 = require("@nx/devkit");
5
+ const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
6
+ function updateModuleFederationTsconfig(host, options) {
7
+ const tsconfigPath = (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.json');
8
+ const tsconfigRuntimePath = (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.app.json');
9
+ if (!host.exists(tsconfigPath) || !host.exists(tsconfigRuntimePath))
10
+ return;
11
+ // Not setting `baseUrl` does not work with MF.
12
+ if ((0, ts_solution_setup_1.isUsingTsSolutionSetup)(host)) {
13
+ (0, devkit_1.updateJson)(host, 'tsconfig.base.json', (json) => {
14
+ json.compilerOptions.baseUrl = '.';
15
+ return json;
16
+ });
17
+ // Update references to match what `nx sync` does.
18
+ if (options.remotes?.length) {
19
+ (0, devkit_1.updateJson)(host, tsconfigPath, (json) => {
20
+ json.references ??= [];
21
+ for (const remote of options.remotes) {
22
+ const remotePath = `../${remote}`;
23
+ if (!json.references.some((ref) => ref.path === remotePath))
24
+ json.references.push({ path: remotePath });
25
+ }
26
+ return json;
27
+ });
28
+ (0, devkit_1.updateJson)(host, tsconfigRuntimePath, (json) => {
29
+ json.references ??= [];
30
+ for (const remote of options.remotes) {
31
+ const remotePath = `../${remote}/tsconfig.app.json`;
32
+ if (!json.references.some((ref) => ref.path === remotePath))
33
+ json.references.push({ path: remotePath });
34
+ }
35
+ return json;
36
+ });
37
+ }
38
+ }
39
+ }
@@ -2,10 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.reactInitGenerator = reactInitGenerator;
4
4
  const devkit_1 = require("@nx/devkit");
5
- const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
6
5
  const versions_1 = require("../../utils/versions");
7
6
  async function reactInitGenerator(host, schema) {
8
- (0, ts_solution_setup_1.assertNotUsingTsSolutionSetup)(host, 'react', 'init');
9
7
  const tasks = [];
10
8
  if (!schema.skipPackageJson) {
11
9
  tasks.push((0, devkit_1.removeDependenciesFromPackageJson)(host, ['@nx/react'], []));
@@ -1,3 +1,3 @@
1
- import type { Tree } from '@nx/devkit';
1
+ import { Tree } from '@nx/devkit';
2
2
  import { NormalizedSchema } from '../schema';
3
3
  export declare function createFiles(host: Tree, options: NormalizedSchema): void;
@@ -42,8 +42,28 @@ function createFiles(host, options) {
42
42
  ].filter(Boolean),
43
43
  });
44
44
  }
45
- if (!options.publishable && !options.buildable) {
46
- host.delete(`${options.projectRoot}/package.json`);
45
+ if ((options.publishable || options.buildable) &&
46
+ !options.isUsingTsSolutionConfig) {
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
+ }
47
67
  }
48
68
  if (options.js) {
49
69
  (0, devkit_1.toJS)(host);
@@ -4,7 +4,28 @@ exports.normalizeOptions = normalizeOptions;
4
4
  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
+ const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
8
+ const prompt_1 = require("@nx/devkit/src/generators/prompt");
7
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
+ }
8
29
  await (0, project_name_and_root_utils_1.ensureProjectName)(host, options, 'library');
9
30
  const { projectName, names: projectNames, projectRoot, importPath, } = await (0, project_name_and_root_utils_1.determineProjectNameAndRootOptions)(host, {
10
31
  name: options.name,
@@ -62,6 +83,7 @@ async function normalizeOptions(host, options) {
62
83
  }
63
84
  }
64
85
  (0, assertion_1.assertValidStyle)(normalized.style);
86
+ normalized.isUsingTsSolutionConfig = isUsingTsSolutionConfig;
65
87
  return normalized;
66
88
  }
67
89
  function findMainEntry(tree, projectRoot) {
@@ -7,7 +7,6 @@ const devkit_1 = require("@nx/devkit");
7
7
  const artifact_name_and_directory_utils_1 = require("@nx/devkit/src/generators/artifact-name-and-directory-utils");
8
8
  const log_show_project_command_1 = require("@nx/devkit/src/utils/log-show-project-command");
9
9
  const js_1 = require("@nx/js");
10
- const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
11
10
  const versions_1 = require("../../utils/versions");
12
11
  const maybe_js_1 = require("../../utils/maybe-js");
13
12
  const component_1 = require("../component/component");
@@ -21,6 +20,7 @@ const create_files_1 = require("./lib/create-files");
21
20
  const create_ts_config_1 = require("../../utils/create-ts-config");
22
21
  const install_common_dependencies_1 = require("./lib/install-common-dependencies");
23
22
  const set_defaults_1 = require("./lib/set-defaults");
23
+ const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
24
24
  async function libraryGenerator(host, schema) {
25
25
  return await libraryGeneratorInternal(host, {
26
26
  addPlugin: false,
@@ -28,8 +28,12 @@ async function libraryGenerator(host, schema) {
28
28
  });
29
29
  }
30
30
  async function libraryGeneratorInternal(host, schema) {
31
- (0, ts_solution_setup_1.assertNotUsingTsSolutionSetup)(host, 'react', 'library');
32
31
  const tasks = [];
32
+ const jsInitTask = await (0, js_1.initGenerator)(host, {
33
+ ...schema,
34
+ skipFormat: true,
35
+ });
36
+ tasks.push(jsInitTask);
33
37
  const options = await (0, normalize_options_1.normalizeOptions)(host, schema);
34
38
  if (options.publishable === true && !schema.importPath) {
35
39
  throw new Error(`For publishable libs you have to provide a proper "--importPath" which needs to be a valid npm package name (e.g. my-awesome-lib or @myorg/my-lib)`);
@@ -37,26 +41,34 @@ async function libraryGeneratorInternal(host, schema) {
37
41
  if (!options.component) {
38
42
  options.style = 'none';
39
43
  }
40
- const jsInitTask = await (0, js_1.initGenerator)(host, {
41
- ...schema,
42
- skipFormat: true,
43
- });
44
- tasks.push(jsInitTask);
45
44
  const initTask = await (0, init_1.default)(host, {
46
45
  ...options,
47
46
  skipFormat: true,
48
47
  });
49
48
  tasks.push(initTask);
50
- (0, devkit_1.addProjectConfiguration)(host, options.name, {
51
- root: options.projectRoot,
52
- sourceRoot: (0, devkit_1.joinPathFragments)(options.projectRoot, 'src'),
53
- projectType: 'library',
54
- tags: options.parsedTags,
55
- targets: {},
56
- });
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
+ sourceRoot: `${options.projectRoot}/src`,
56
+ tags: options.parsedTags?.length ? options.parsedTags : undefined,
57
+ },
58
+ });
59
+ }
60
+ else {
61
+ (0, devkit_1.addProjectConfiguration)(host, options.name, {
62
+ root: options.projectRoot,
63
+ sourceRoot: (0, devkit_1.joinPathFragments)(options.projectRoot, 'src'),
64
+ projectType: 'library',
65
+ tags: options.parsedTags,
66
+ targets: {},
67
+ });
68
+ }
69
+ (0, create_files_1.createFiles)(host, options);
57
70
  const lintTask = await (0, add_linting_1.addLinting)(host, options);
58
71
  tasks.push(lintTask);
59
- (0, create_files_1.createFiles)(host, options);
60
72
  // Set up build target
61
73
  if (options.buildable && options.bundler === 'vite') {
62
74
  const { viteConfigurationGenerator, createOrEditViteConfig } = (0, devkit_1.ensurePackage)('@nx/vite', versions_1.nxVersion);
@@ -178,11 +190,18 @@ async function libraryGeneratorInternal(host, schema) {
178
190
  tasks.push(routeTask);
179
191
  (0, set_defaults_1.setDefaults)(host, options);
180
192
  (0, create_ts_config_1.extractTsConfigBase)(host);
181
- if (!options.skipTsConfig) {
193
+ if (!options.skipTsConfig && !options.isUsingTsSolutionConfig) {
182
194
  (0, js_1.addTsConfigPath)(host, options.importPath, [
183
195
  (0, maybe_js_1.maybeJs)(options, (0, devkit_1.joinPathFragments)(options.projectRoot, './src/index.ts')),
184
196
  ]);
185
197
  }
198
+ (0, ts_solution_setup_1.updateTsconfigFiles)(host, options.projectRoot, 'tsconfig.lib.json', {
199
+ jsx: 'react-jsx',
200
+ module: 'esnext',
201
+ moduleResolution: 'bundler',
202
+ }, options.linter === 'eslint'
203
+ ? ['eslint.config.js', 'eslint.config.cjs', 'eslint.config.mjs']
204
+ : undefined);
186
205
  if (!options.skipFormat) {
187
206
  await (0, devkit_1.formatFiles)(host);
188
207
  }
@@ -39,4 +39,5 @@ export interface NormalizedSchema extends Schema {
39
39
  appMain?: string;
40
40
  appSourceRoot?: string;
41
41
  unitTestRunner: 'jest' | 'vitest' | 'none';
42
+ isUsingTsSolutionConfig?: boolean;
42
43
  }
@@ -75,14 +75,17 @@
75
75
  "description": "The tool to use for running lint checks.",
76
76
  "type": "string",
77
77
  "enum": ["eslint", "none"],
78
- "default": "eslint"
78
+ "default": "eslint",
79
+ "x-prompt": "Which linter would you like to use?",
80
+ "x-priority": "important"
79
81
  },
80
82
  "unitTestRunner": {
81
83
  "type": "string",
82
84
  "enum": ["vitest", "jest", "none"],
83
85
  "default": "vitest",
84
86
  "description": "Test runner to use for unit tests.",
85
- "x-prompt": "What unit test runner should be used?"
87
+ "x-prompt": "What unit test runner should be used?",
88
+ "x-priority": "important"
86
89
  },
87
90
  "inSourceTests": {
88
91
  "type": "boolean",
@@ -157,10 +160,7 @@
157
160
  "bundler": {
158
161
  "type": "string",
159
162
  "description": "The bundler to use. Choosing 'none' means this library is not buildable.",
160
- "enum": ["none", "vite", "rollup"],
161
- "default": "none",
162
- "x-prompt": "Which bundler would you like to use to build the library? Choose 'none' to skip build setup.",
163
- "x-priority": "important"
163
+ "enum": ["none", "vite", "rollup"]
164
164
  },
165
165
  "compiler": {
166
166
  "type": "string",
@@ -1,5 +1,5 @@
1
1
  const { composePlugins, withNx, withReact } = require('@nx/rspack');
2
- const { withModuleFederation } = require('@nx/rspack/module-federation');
2
+ const { withModuleFederation } = require('@nx/module-federation/rspack');
3
3
 
4
4
  const baseConfig = require('./module-federation.config');
5
5
 
@@ -1,5 +1,5 @@
1
1
  const {composePlugins, withNx, withReact} = require('@nx/rspack');
2
- const {withModuleFederationForSSR} = require('@nx/rspack/module-federation');
2
+ const {withModuleFederationForSSR} = require('@nx/module-federation/rspack');
3
3
 
4
4
  const baseConfig = require("./module-federation.server.config");
5
5
 
@@ -1,5 +1,5 @@
1
1
  import {composePlugins, withNx, withReact} from '@nx/rspack';
2
- import {withModuleFederationForSSR} from '@nx/rspack/module-federation';
2
+ import {withModuleFederationForSSR} from '@nx/module-federation/rspack';
3
3
 
4
4
  import baseConfig from "./module-federation.server.config";
5
5
 
@@ -1,5 +1,5 @@
1
1
  import {composePlugins, withNx, withReact} from '@nx/rspack';
2
- import {withModuleFederation} from '@nx/rspack/module-federation';
2
+ import {withModuleFederation} from '@nx/module-federation/rspack';
3
3
 
4
4
  import baseConfig from './module-federation.config';
5
5
 
@@ -17,7 +17,6 @@ const maybe_js_1 = require("../../utils/maybe-js");
17
17
  const js_1 = require("@nx/js");
18
18
  const versions_1 = require("../../utils/versions");
19
19
  const project_name_and_root_utils_1 = require("@nx/devkit/src/generators/project-name-and-root-utils");
20
- const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
21
20
  function addModuleFederationFiles(host, options) {
22
21
  const templateVariables = {
23
22
  ...(0, devkit_1.names)(options.projectName),
@@ -47,7 +46,6 @@ function addModuleFederationFiles(host, options) {
47
46
  }
48
47
  }
49
48
  async function remoteGenerator(host, schema) {
50
- (0, ts_solution_setup_1.assertNotUsingTsSolutionSetup)(host, 'react', 'remote');
51
49
  const tasks = [];
52
50
  const options = {
53
51
  ...(await (0, normalize_options_1.normalizeOptions)(host, schema)),
@@ -82,6 +80,7 @@ async function remoteGenerator(host, schema) {
82
80
  ...options,
83
81
  name: options.projectName,
84
82
  skipFormat: true,
83
+ alwaysGenerateProjectJson: true,
85
84
  });
86
85
  tasks.push(initAppTask);
87
86
  if (schema.host) {
@@ -4,7 +4,7 @@ exports.default = migrateWithMfImport;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const executor_options_utils_1 = require("@nx/devkit/src/generators/executor-options-utils");
6
6
  const tsquery_1 = require("@phenomnomnominal/tsquery");
7
- const NX_ANGULAR_MODULE_FEDERATION_IMPORT_SELECTOR = 'ImportDeclaration > StringLiteral[value=@nx/react/module-federation], VariableStatement CallExpression:has(Identifier[name=require]) > StringLiteral[value=@nx/react/module-federation]';
7
+ const NX_RSPACK_MODULE_FEDERATION_IMPORT_SELECTOR = 'ImportDeclaration > StringLiteral[value=@nx/react/module-federation], VariableStatement CallExpression:has(Identifier[name=require]) > StringLiteral[value=@nx/react/module-federation]';
8
8
  const NEW_IMPORT_PATH = `'@nx/module-federation/webpack'`;
9
9
  async function migrateWithMfImport(tree) {
10
10
  const projects = new Set();
@@ -22,7 +22,7 @@ async function migrateWithMfImport(tree) {
22
22
  return;
23
23
  }
24
24
  const ast = tsquery_1.tsquery.ast(contents);
25
- const importNodes = (0, tsquery_1.tsquery)(ast, NX_ANGULAR_MODULE_FEDERATION_IMPORT_SELECTOR);
25
+ const importNodes = (0, tsquery_1.tsquery)(ast, NX_RSPACK_MODULE_FEDERATION_IMPORT_SELECTOR);
26
26
  if (importNodes.length === 0) {
27
27
  return;
28
28
  }
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.updateModuleFederationProject = updateModuleFederationProject;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const maybe_js_1 = require("../utils/maybe-js");
6
+ const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
6
7
  function updateModuleFederationProject(host, options) {
7
8
  const projectConfig = (0, devkit_1.readProjectConfiguration)(host, options.projectName);
8
9
  if (options.bundler === 'rspack') {
@@ -78,5 +79,10 @@ function updateModuleFederationProject(host, options) {
78
79
  },
79
80
  },
80
81
  };
82
+ // Typechecks must be performed first before build and serve to generate remote d.ts files.
83
+ if ((0, ts_solution_setup_1.isUsingTsSolutionSetup)(host)) {
84
+ projectConfig.targets.build.dependsOn = ['^build', 'typecheck'];
85
+ projectConfig.targets.serve.dependsOn = ['typecheck'];
86
+ }
81
87
  (0, devkit_1.updateProjectConfiguration)(host, options.projectName, projectConfig);
82
88
  }
@@ -1,4 +1,4 @@
1
- import type { StaticRemotesConfig } from '@nx/webpack/src/utils/module-federation/parse-static-remotes-config';
1
+ import { StaticRemotesConfig } from '@nx/module-federation/src/utils';
2
2
  import { ExecutorContext } from '@nx/devkit';
3
3
  import { ModuleFederationDevServerOptions } from '../executors/module-federation-dev-server/schema';
4
4
  export declare function buildStaticRemotes(staticRemotesConfig: StaticRemotesConfig, nxBin: any, context: ExecutorContext, options: ModuleFederationDevServerOptions): Promise<Record<string, string>>;
@@ -4,7 +4,64 @@ exports.createTsConfig = createTsConfig;
4
4
  exports.extractTsConfigBase = extractTsConfigBase;
5
5
  const shared = require("@nx/js/src/utils/typescript/create-ts-config");
6
6
  const json_1 = require("nx/src/generators/utils/json");
7
+ const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
7
8
  function createTsConfig(host, projectRoot, type, options, relativePathToRootTsConfig) {
9
+ if ((0, ts_solution_setup_1.isUsingTsSolutionSetup)(host)) {
10
+ createTsConfigForTsSolution(host, projectRoot, type, options, relativePathToRootTsConfig);
11
+ }
12
+ else {
13
+ createTsConfigForNonTsSolution(host, projectRoot, type, options, relativePathToRootTsConfig);
14
+ }
15
+ }
16
+ function extractTsConfigBase(host) {
17
+ shared.extractTsConfigBase(host);
18
+ if (host.exists('vite.config.ts')) {
19
+ const vite = host.read('vite.config.ts').toString();
20
+ host.write('vite.config.ts', vite.replace(`projects: []`, `projects: ['tsconfig.base.json']`));
21
+ }
22
+ }
23
+ function createTsConfigForTsSolution(host, projectRoot, type, options, relativePathToRootTsConfig) {
24
+ const json = {
25
+ files: [],
26
+ include: [],
27
+ references: [
28
+ {
29
+ path: type === 'app' ? './tsconfig.app.json' : './tsconfig.lib.json',
30
+ },
31
+ ],
32
+ };
33
+ // inline tsconfig.base.json into the project
34
+ if (options.rootProject) {
35
+ json.compileOnSave = false;
36
+ json.compilerOptions = {
37
+ ...shared.tsConfigBaseOptions,
38
+ ...json.compilerOptions,
39
+ };
40
+ json.exclude = ['node_modules', 'tmp'];
41
+ }
42
+ else {
43
+ json.extends = relativePathToRootTsConfig;
44
+ }
45
+ (0, json_1.writeJson)(host, `${projectRoot}/tsconfig.json`, json);
46
+ const tsconfigProjectPath = `${projectRoot}/tsconfig.${type}.json`;
47
+ if (host.exists(tsconfigProjectPath)) {
48
+ (0, json_1.updateJson)(host, tsconfigProjectPath, (json) => {
49
+ if (options.bundler === 'vite') {
50
+ json.compilerOptions ??= {};
51
+ const types = new Set(json.compilerOptions.types ?? []);
52
+ types.add('node');
53
+ types.add('vite/client');
54
+ json.compilerOptions.types = Array.from(types);
55
+ }
56
+ if (options.style === '@emotion/styled') {
57
+ json.compilerOptions ??= {};
58
+ json.compilerOptions.jsxImportSource = '@emotion/react';
59
+ }
60
+ return json;
61
+ });
62
+ }
63
+ }
64
+ function createTsConfigForNonTsSolution(host, projectRoot, type, options, relativePathToRootTsConfig) {
8
65
  const json = {
9
66
  compilerOptions: {
10
67
  jsx: 'react-jsx',
@@ -55,10 +112,3 @@ function createTsConfig(host, projectRoot, type, options, relativePathToRootTsCo
55
112
  });
56
113
  }
57
114
  }
58
- function extractTsConfigBase(host) {
59
- shared.extractTsConfigBase(host);
60
- if (host.exists('vite.config.ts')) {
61
- const vite = host.read('vite.config.ts').toString();
62
- host.write('vite.config.ts', vite.replace(`projects: []`, `projects: ['tsconfig.base.json']`));
63
- }
64
- }
@@ -1,5 +1,4 @@
1
1
  export declare const nxVersion: any;
2
- export declare const nxRspackVersion = "*";
3
2
  export declare const reactVersion = "18.3.1";
4
3
  export declare const reactDomVersion = "18.3.1";
5
4
  export declare const reactIsVersion = "18.3.1";
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.swcPluginStyledComponentsVersion = exports.swcPluginEmotionVersion = exports.swcPluginStyledJsxVersion = exports.svgrRollupVersion = exports.rollupPluginUrlVersion = exports.sassVersion = exports.lessVersion = exports.moduleFederationEnhancedVersion = exports.moduleFederationNodeVersion = exports.typesCorsVersion = exports.corsVersion = exports.isbotVersion = exports.typesExpressVersion = exports.expressVersion = exports.autoprefixerVersion = exports.tailwindcssVersion = exports.postcssVersion = exports.tsLibVersion = exports.babelPluginStyledComponentsVersion = exports.eslintPluginReactHooksVersion = exports.eslintPluginReactVersion = exports.eslintPluginJsxA11yVersion = exports.eslintPluginImportVersion = exports.reactReduxVersion = exports.reduxjsToolkitVersion = exports.testingLibraryReactVersion = exports.reactRouterDomVersion = exports.styledJsxVersion = exports.emotionBabelPlugin = exports.emotionReactVersion = exports.emotionStyledVersion = exports.typesStyledComponentsVersion = exports.styledComponentsVersion = exports.babelCoreVersion = exports.babelPresetReactVersion = exports.typesNodeVersion = exports.reactViteVersion = exports.typesReactIsVersion = exports.typesReactDomVersion = exports.typesReactVersion = exports.babelLoaderVersion = exports.swcLoaderVersion = exports.reactIsVersion = exports.reactDomVersion = exports.reactVersion = exports.nxRspackVersion = exports.nxVersion = void 0;
3
+ exports.swcPluginStyledComponentsVersion = exports.swcPluginEmotionVersion = exports.swcPluginStyledJsxVersion = exports.svgrRollupVersion = exports.rollupPluginUrlVersion = exports.sassVersion = exports.lessVersion = exports.moduleFederationEnhancedVersion = exports.moduleFederationNodeVersion = exports.typesCorsVersion = exports.corsVersion = exports.isbotVersion = exports.typesExpressVersion = exports.expressVersion = exports.autoprefixerVersion = exports.tailwindcssVersion = exports.postcssVersion = exports.tsLibVersion = exports.babelPluginStyledComponentsVersion = exports.eslintPluginReactHooksVersion = exports.eslintPluginReactVersion = exports.eslintPluginJsxA11yVersion = exports.eslintPluginImportVersion = exports.reactReduxVersion = exports.reduxjsToolkitVersion = exports.testingLibraryReactVersion = exports.reactRouterDomVersion = exports.styledJsxVersion = exports.emotionBabelPlugin = exports.emotionReactVersion = exports.emotionStyledVersion = exports.typesStyledComponentsVersion = exports.styledComponentsVersion = exports.babelCoreVersion = exports.babelPresetReactVersion = exports.typesNodeVersion = exports.reactViteVersion = exports.typesReactIsVersion = exports.typesReactDomVersion = exports.typesReactVersion = exports.babelLoaderVersion = exports.swcLoaderVersion = exports.reactIsVersion = exports.reactDomVersion = exports.reactVersion = exports.nxVersion = void 0;
4
4
  exports.nxVersion = require('../../package.json').version;
5
- // Always pull the latest version until we merge rspack plugin into the repo.
6
- exports.nxRspackVersion = '*';
7
5
  exports.reactVersion = '18.3.1';
8
6
  exports.reactDomVersion = '18.3.1';
9
7
  exports.reactIsVersion = '18.3.1';
@@ -1,2 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- export declare function addProjectRootToRspackPluginExcludesIfExists(tree: Tree, projectRoot: string): void;
@@ -1,31 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.addProjectRootToRspackPluginExcludesIfExists = addProjectRootToRspackPluginExcludesIfExists;
4
- const devkit_1 = require("@nx/devkit");
5
- const devkit_2 = require("@nx/devkit");
6
- function addProjectRootToRspackPluginExcludesIfExists(tree, projectRoot) {
7
- const excludeProjectGlob = (0, devkit_1.joinPathFragments)(projectRoot, '/**');
8
- const nxJson = (0, devkit_2.readNxJson)(tree);
9
- if (!nxJson.plugins?.length) {
10
- return;
11
- }
12
- for (let i = 0; i < nxJson.plugins.length; i++) {
13
- let plugin = nxJson.plugins[i];
14
- const isRspackPlugin = typeof plugin === 'string'
15
- ? plugin === '@nx/rspack/plugin'
16
- : plugin.plugin === '@nx/rspack/plugin';
17
- if (isRspackPlugin) {
18
- if (typeof plugin === 'string') {
19
- plugin = {
20
- plugin: plugin,
21
- exclude: [excludeProjectGlob],
22
- };
23
- }
24
- else {
25
- plugin.exclude = [...(plugin.exclude ?? []), excludeProjectGlob];
26
- }
27
- nxJson.plugins[i] = plugin;
28
- }
29
- }
30
- (0, devkit_1.updateNxJson)(tree, nxJson);
31
- }
@@ -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
- }