@nx/angular 18.3.0-beta.0 → 18.3.0-beta.2

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 (28) hide show
  1. package/package.json +8 -8
  2. package/plugins/component-testing.js +1 -1
  3. package/src/generators/add-linting/add-linting.js +1 -0
  4. package/src/generators/application/application.js +4 -1
  5. package/src/generators/application/lib/add-e2e.js +3 -1
  6. package/src/generators/host/lib/update-ssr-setup.js +9 -7
  7. package/src/generators/library/library.js +7 -4
  8. package/src/generators/remote/lib/update-ssr-setup.d.ts +2 -1
  9. package/src/generators/remote/lib/update-ssr-setup.js +10 -8
  10. package/src/generators/remote/remote.js +8 -4
  11. package/src/generators/setup-mf/files/ts-webpack/module-federation.config.ts__tmpl__ +1 -1
  12. package/src/generators/setup-mf/files/webpack/module-federation.config.js__tmpl__ +1 -1
  13. package/src/generators/setup-mf/lib/add-remote-to-host.d.ts +7 -2
  14. package/src/generators/setup-mf/lib/add-remote-to-host.js +2 -15
  15. package/src/generators/setup-mf/lib/generate-config.js +1 -0
  16. package/src/generators/setup-mf/lib/update-host-app-routes.js +1 -4
  17. package/src/generators/setup-mf/setup-mf.js +20 -3
  18. package/src/generators/setup-ssr/schema.d.ts +1 -0
  19. package/src/generators/setup-ssr/schema.json +6 -0
  20. package/src/generators/setup-ssr/setup-ssr.js +3 -1
  21. package/src/generators/utils/add-jest.js +1 -2
  22. package/src/generators/utils/ensure-angular-dependencies.d.ts +1 -1
  23. package/src/generators/utils/ensure-angular-dependencies.js +44 -27
  24. package/src/generators/utils/testing.js +0 -17
  25. package/src/generators/utils/version-utils.d.ts +1 -2
  26. package/src/generators/utils/version-utils.js +1 -13
  27. package/src/migrations/update-15-2-0/remove-browserlist-config.d.ts +1 -0
  28. package/src/migrations/update-15-2-0/remove-browserlist-config.js +1 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/angular",
3
- "version": "18.3.0-beta.0",
3
+ "version": "18.3.0-beta.2",
4
4
  "private": false,
5
5
  "description": "The Nx Plugin for Angular contains executors, generators, and utilities for managing Angular applications and libraries within an Nx workspace. It provides: \n\n- Integration with libraries such as Storybook, Jest, ESLint, Tailwind CSS, and Cypress. \n\n- Generators to help scaffold code quickly (like: Micro Frontends, Libraries, both internal to your codebase and publishable to npm) \n\n- Single Component Application Modules (SCAMs) \n\n- NgRx helpers. \n\n- Utilities for automatic workspace refactoring.",
6
6
  "repository": {
@@ -78,14 +78,14 @@
78
78
  "tslib": "^2.3.0",
79
79
  "webpack": "^5.80.0",
80
80
  "webpack-merge": "^5.8.0",
81
- "@nx/devkit": "18.3.0-beta.0",
82
- "@nx/js": "18.3.0-beta.0",
83
- "@nx/eslint": "18.3.0-beta.0",
84
- "@nx/webpack": "18.3.0-beta.0",
85
- "@nx/web": "18.3.0-beta.0",
86
- "@nx/workspace": "18.3.0-beta.0",
81
+ "@nx/devkit": "18.3.0-beta.2",
82
+ "@nx/js": "18.3.0-beta.2",
83
+ "@nx/eslint": "18.3.0-beta.2",
84
+ "@nx/webpack": "18.3.0-beta.2",
85
+ "@nx/web": "18.3.0-beta.2",
86
+ "@nx/workspace": "18.3.0-beta.2",
87
87
  "piscina": "^4.4.0",
88
- "@nrwl/angular": "18.3.0-beta.0"
88
+ "@nrwl/angular": "18.3.0-beta.2"
89
89
  },
90
90
  "peerDependencies": {
91
91
  "@angular-devkit/build-angular": ">= 15.0.0 < 18.0.0",
@@ -26,7 +26,7 @@ const semver_1 = require("semver");
26
26
  * @param options override options
27
27
  */
28
28
  function nxComponentTestingPreset(pathToConfig, options) {
29
- if (global.NX_GRAPH_CREATION || global.NX_CYPRESS_INIT_GENERATOR_RUNNING) {
29
+ if (global.NX_GRAPH_CREATION) {
30
30
  // this is only used by plugins, so we don't need the component testing
31
31
  // options, cast to any to avoid type errors
32
32
  return (0, cypress_preset_1.nxBaseCypressPreset)(pathToConfig, {
@@ -23,6 +23,7 @@ async function addLintingGenerator(tree, options) {
23
23
  rootProject: rootProject,
24
24
  addPlugin: false,
25
25
  addExplicitTargets: true,
26
+ skipPackageJson: options.skipPackageJson,
26
27
  });
27
28
  tasks.push(lintTask);
28
29
  if ((0, eslint_file_1.isEslintConfigSupported)(tree)) {
@@ -29,7 +29,9 @@ async function applicationGeneratorInternal(tree, schema) {
29
29
  ...options,
30
30
  skipFormat: true,
31
31
  });
32
- (0, ensure_angular_dependencies_1.ensureAngularDependencies)(tree);
32
+ if (!options.skipPackageJson) {
33
+ (0, ensure_angular_dependencies_1.ensureAngularDependencies)(tree);
34
+ }
33
35
  (0, lib_1.createProject)(tree, options);
34
36
  await (0, lib_1.createFiles)(tree, options, rootOffset);
35
37
  if (options.addTailwind) {
@@ -62,6 +64,7 @@ async function applicationGeneratorInternal(tree, schema) {
62
64
  await (0, setup_ssr_1.setupSsr)(tree, {
63
65
  project: options.name,
64
66
  standalone: options.standalone,
67
+ skipPackageJson: options.skipPackageJson,
65
68
  });
66
69
  }
67
70
  if (!options.skipFormat) {
@@ -59,7 +59,9 @@ async function addE2e(tree, options) {
59
59
  }
60
60
  exports.addE2e = addE2e;
61
61
  function addFileServerTarget(tree, options, targetName) {
62
- (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@nx/web': versions_1.nxVersion });
62
+ if (!options.skipPackageJson) {
63
+ (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@nx/web': versions_1.nxVersion });
64
+ }
63
65
  const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
64
66
  const isUsingApplicationBuilder = angularMajorVersion >= 17 && options.bundler === 'esbuild';
65
67
  const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.name);
@@ -29,12 +29,14 @@ async function updateSsrSetup(tree, options, appName, typescriptConfiguration) {
29
29
  project.targets['serve-ssr'].executor =
30
30
  '@nx/angular:module-federation-dev-ssr';
31
31
  (0, devkit_1.updateProjectConfiguration)(tree, appName, project);
32
- const installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {
33
- cors: versions_1.corsVersion,
34
- '@module-federation/node': versions_1.moduleFederationNodeVersion,
35
- }, {
36
- '@types/cors': versions_1.typesCorsVersion,
37
- });
38
- return installTask;
32
+ if (!options.skipPackageJson) {
33
+ return (0, devkit_1.addDependenciesToPackageJson)(tree, {
34
+ cors: versions_1.corsVersion,
35
+ '@module-federation/node': versions_1.moduleFederationNodeVersion,
36
+ }, {
37
+ '@types/cors': versions_1.typesCorsVersion,
38
+ });
39
+ }
40
+ return () => { };
39
41
  }
40
42
  exports.updateSsrSetup = updateSsrSetup;
@@ -50,7 +50,9 @@ async function libraryGeneratorInternal(tree, schema) {
50
50
  skipFormat: true,
51
51
  });
52
52
  await (0, init_1.default)(tree, { ...libraryOptions, skipFormat: true });
53
- (0, ensure_angular_dependencies_1.ensureAngularDependencies)(tree);
53
+ if (!libraryOptions.skipPackageJson) {
54
+ (0, ensure_angular_dependencies_1.ensureAngularDependencies)(tree);
55
+ }
54
56
  const project = (0, add_project_1.addProject)(tree, libraryOptions);
55
57
  (0, create_files_1.createFiles)(tree, options, project);
56
58
  (0, update_tsconfig_1.updateTsConfig)(tree, libraryOptions);
@@ -72,10 +74,11 @@ async function libraryGeneratorInternal(tree, schema) {
72
74
  skipPackageJson: libraryOptions.skipPackageJson,
73
75
  });
74
76
  }
75
- if (libraryOptions.buildable || libraryOptions.publishable) {
76
- (0, version_utils_1.addDependenciesToPackageJsonIfDontExist)(tree, {}, {
77
+ if ((libraryOptions.buildable || libraryOptions.publishable) &&
78
+ !libraryOptions.skipPackageJson) {
79
+ (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
77
80
  'ng-packagr': pkgVersions.ngPackagrVersion,
78
- });
81
+ }, undefined, true);
79
82
  (0, dependencies_1.addBuildableLibrariesPostCssDependencies)(tree);
80
83
  }
81
84
  (0, js_1.addTsConfigPath)(tree, libraryOptions.importPath, [
@@ -1,7 +1,8 @@
1
1
  import type { Tree } from '@nx/devkit';
2
- export declare function updateSsrSetup(tree: Tree, { appName, port, standalone, typescriptConfiguration, }: {
2
+ export declare function updateSsrSetup(tree: Tree, { appName, port, standalone, typescriptConfiguration, skipPackageJson, }: {
3
3
  appName: string;
4
4
  port: number;
5
5
  standalone: boolean;
6
6
  typescriptConfiguration: boolean;
7
+ skipPackageJson?: boolean;
7
8
  }): Promise<import("@nx/devkit").GeneratorCallback>;
@@ -5,7 +5,7 @@ const devkit_1 = require("@nx/devkit");
5
5
  const path_1 = require("path");
6
6
  const versions_1 = require("../../../utils/versions");
7
7
  const version_utils_1 = require("../../utils/version-utils");
8
- async function updateSsrSetup(tree, { appName, port, standalone, typescriptConfiguration, }) {
8
+ async function updateSsrSetup(tree, { appName, port, standalone, typescriptConfiguration, skipPackageJson, }) {
9
9
  let project = (0, devkit_1.readProjectConfiguration)(tree, appName);
10
10
  tree.rename((0, devkit_1.joinPathFragments)(project.sourceRoot, 'main.server.ts'), (0, devkit_1.joinPathFragments)(project.sourceRoot, 'bootstrap.server.ts'));
11
11
  tree.write((0, devkit_1.joinPathFragments)(project.root, 'server.ts'), "import('./src/main.server');");
@@ -48,12 +48,14 @@ async function updateSsrSetup(tree, { appName, port, standalone, typescriptConfi
48
48
  },
49
49
  };
50
50
  (0, devkit_1.updateProjectConfiguration)(tree, appName, project);
51
- const installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {
52
- cors: versions_1.corsVersion,
53
- '@module-federation/node': versions_1.moduleFederationNodeVersion,
54
- }, {
55
- '@types/cors': versions_1.typesCorsVersion,
56
- });
57
- return installTask;
51
+ if (!skipPackageJson) {
52
+ return (0, devkit_1.addDependenciesToPackageJson)(tree, {
53
+ cors: versions_1.corsVersion,
54
+ '@module-federation/node': versions_1.moduleFederationNodeVersion,
55
+ }, {
56
+ '@types/cors': versions_1.typesCorsVersion,
57
+ });
58
+ }
59
+ return () => { };
58
60
  }
59
61
  exports.updateSsrSetup = updateSsrSetup;
@@ -56,16 +56,20 @@ async function remoteInternal(tree, schema) {
56
56
  typescriptConfiguration,
57
57
  setParserOptionsProject: options.setParserOptionsProject,
58
58
  });
59
- const installSwcHelpersTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
60
- '@swc/helpers': versions_1.swcHelpersVersion,
61
- });
62
- let installTasks = [appInstallTask, installSwcHelpersTask];
59
+ const installTasks = [appInstallTask];
60
+ if (!options.skipPackageJson) {
61
+ const installSwcHelpersTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
62
+ '@swc/helpers': versions_1.swcHelpersVersion,
63
+ });
64
+ installTasks.push(installSwcHelpersTask);
65
+ }
63
66
  if (options.ssr) {
64
67
  let ssrInstallTask = await (0, lib_1.updateSsrSetup)(tree, {
65
68
  appName: remoteProjectName,
66
69
  port,
67
70
  typescriptConfiguration,
68
71
  standalone: options.standalone,
72
+ skipPackageJson: options.skipPackageJson,
69
73
  });
70
74
  installTasks.push(ssrInstallTask);
71
75
  }
@@ -14,7 +14,7 @@ const config: ModuleFederationConfig = {
14
14
  * declare module 'my-external-remote';
15
15
  *
16
16
  */
17
- remotes: [<% remotes.forEach(function(remote) { %>'<%= remote.remoteName %>',<% }); %>]<% } %><% if(type === 'remote') { %>
17
+ remotes: [<% if (federationType === 'static') { remotes.forEach(function(remote) { %>'<%= remote.remoteName %>',<% }); } %>]<% } %><% if(type === 'remote') { %>
18
18
  exposes: {<% if(standalone) { %>
19
19
  './Routes': '<%= projectRoot %>/src/app/remote-entry/entry.routes.ts',<% } else { %>
20
20
  './Module': '<%= projectRoot %>/src/app/remote-entry/entry.module.ts',<% } %>
@@ -12,7 +12,7 @@ module.exports = {
12
12
  * declare module 'my-external-remote';
13
13
  *
14
14
  */
15
- remotes: [<% remotes.forEach(function(remote) { %>'<%= remote.remoteName %>',<% }); %>]<% } %><% if(type === 'remote') { %>
15
+ remotes: [<% if (federationType === 'static') { remotes.forEach(function(remote) { %>'<%= remote.remoteName %>',<% }); } %>]<% } %><% if(type === 'remote') { %>
16
16
  exposes: {<% if(standalone) { %>
17
17
  './Routes': '<%= projectRoot %>/src/app/remote-entry/entry.routes.ts',<% } else { %>
18
18
  './Module': '<%= projectRoot %>/src/app/remote-entry/entry.module.ts',<% } %>
@@ -1,4 +1,9 @@
1
1
  import { Tree } from '@nx/devkit';
2
- import type { Schema } from '../schema';
2
+ export type AddRemoteOptions = {
3
+ host: string;
4
+ appName: string;
5
+ standalone: boolean;
6
+ port: number;
7
+ };
3
8
  export declare function checkIsCommaNeeded(mfRemoteText: string): boolean;
4
- export declare function addRemoteToHost(tree: Tree, options: Schema): void;
9
+ export declare function addRemoteToHost(tree: Tree, options: AddRemoteOptions): void;
@@ -27,19 +27,6 @@ function addRemoteToHost(tree, options) {
27
27
  else if (hostFederationType === 'dynamic') {
28
28
  addRemoteToDynamicHost(tree, options, pathToMFManifest);
29
29
  }
30
- // const declarationFilePath = joinPathFragments(
31
- // hostProject.sourceRoot,
32
- // 'remotes.d.ts'
33
- // );
34
- //
35
- // const declarationFileContent =
36
- // (tree.exists(declarationFilePath)
37
- // ? tree.read(declarationFilePath, 'utf-8')
38
- // : '') +
39
- // `\ndeclare module '${options.appName}/${
40
- // options.standalone ? `Routes` : `Module`
41
- // }';`;
42
- // tree.write(declarationFilePath, declarationFileContent);
43
30
  addLazyLoadedRouteToHostAppModule(tree, options, hostFederationType);
44
31
  }
45
32
  }
@@ -47,8 +34,8 @@ exports.addRemoteToHost = addRemoteToHost;
47
34
  function determineHostFederationType(tree, pathToMfManifest) {
48
35
  return tree.exists(pathToMfManifest) ? 'dynamic' : 'static';
49
36
  }
50
- function addRemoteToStaticHost(tree, options, hostProject, isHostUsingTypescrpt) {
51
- const hostMFConfigPath = (0, devkit_1.joinPathFragments)(hostProject.root, isHostUsingTypescrpt
37
+ function addRemoteToStaticHost(tree, options, hostProject, isHostUsingTypescript) {
38
+ const hostMFConfigPath = (0, devkit_1.joinPathFragments)(hostProject.root, isHostUsingTypescript
52
39
  ? 'module-federation.config.ts'
53
40
  : 'module-federation.config.js');
54
41
  if (!hostMFConfigPath || !tree.exists(hostMFConfigPath)) {
@@ -18,6 +18,7 @@ function generateWebpackConfig(tree, options, appRoot, remotesWithPorts) {
18
18
  (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, `../files/${pathToWebpackTemplateFiles}`), appRoot, {
19
19
  tmpl: '',
20
20
  type: options.mfType,
21
+ federationType: options.federationType,
21
22
  name: options.appName,
22
23
  remotes: remotesWithPorts ?? [],
23
24
  projectRoot: appRoot,
@@ -11,11 +11,8 @@ function updateHostAppRoutes(tree, options) {
11
11
  tsModule = (0, ensure_typescript_1.ensureTypescript)();
12
12
  }
13
13
  const { sourceRoot } = (0, project_configuration_1.readProjectConfiguration)(tree, options.appName);
14
- const remoteRoutes = options.remotes && Array.isArray(options.remotes)
15
- ? options.remotes.reduce((routes, remote) => `${routes}\n<li><a routerLink='${remote}'>${(0, devkit_1.names)(remote).className}</a></li>`, '')
16
- : '';
17
14
  tree.write((0, devkit_1.joinPathFragments)(sourceRoot, 'app/app.component.html'), `<ul class="remote-menu">
18
- <li><a routerLink="/">Home</a></li>${remoteRoutes}
15
+ <li><a routerLink="/">Home</a></li>
19
16
  </ul>
20
17
  <router-outlet></router-outlet>
21
18
  `);
@@ -9,11 +9,18 @@ async function setupMf(tree, rawOptions) {
9
9
  const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.appName);
10
10
  let installTask = () => { };
11
11
  if (options.mfType === 'remote') {
12
- (0, lib_1.addRemoteToHost)(tree, options);
12
+ (0, lib_1.addRemoteToHost)(tree, {
13
+ appName: options.appName,
14
+ host: options.host,
15
+ standalone: options.standalone,
16
+ port: options.port,
17
+ });
13
18
  (0, lib_1.addRemoteEntry)(tree, options, projectConfig.root);
14
19
  (0, lib_1.removeDeadCodeFromRemote)(tree, options);
15
20
  (0, lib_1.setupTspathForRemote)(tree, options);
16
- installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@nx/web': versions_1.nxVersion, '@nx/webpack': versions_1.nxVersion });
21
+ if (!options.skipPackageJson) {
22
+ installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@nx/web': versions_1.nxVersion, '@nx/webpack': versions_1.nxVersion });
23
+ }
17
24
  }
18
25
  const remotesWithPorts = (0, lib_1.getRemotesWithPorts)(tree, options);
19
26
  (0, lib_1.generateWebpackConfig)(tree, options, projectConfig.root, remotesWithPorts);
@@ -24,7 +31,17 @@ async function setupMf(tree, rawOptions) {
24
31
  if (options.mfType === 'host') {
25
32
  (0, lib_1.setupHostIfDynamic)(tree, options);
26
33
  (0, lib_1.updateHostAppRoutes)(tree, options);
27
- installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@nx/webpack': versions_1.nxVersion });
34
+ for (const { remoteName, port } of remotesWithPorts) {
35
+ (0, lib_1.addRemoteToHost)(tree, {
36
+ appName: remoteName,
37
+ host: options.appName,
38
+ standalone: options.standalone,
39
+ port,
40
+ });
41
+ }
42
+ if (!options.skipPackageJson) {
43
+ installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@nx/webpack': versions_1.nxVersion });
44
+ }
28
45
  }
29
46
  if (!options.skipE2E) {
30
47
  (0, lib_1.addCypressOnErrorWorkaround)(tree, options);
@@ -9,4 +9,5 @@ export interface Schema {
9
9
  standalone?: boolean;
10
10
  hydration?: boolean;
11
11
  skipFormat?: boolean;
12
+ skipPackageJson?: boolean;
12
13
  }
@@ -61,6 +61,12 @@
61
61
  "type": "boolean",
62
62
  "description": "Skip formatting the workspace after the generator completes.",
63
63
  "x-priority": "internal"
64
+ },
65
+ "skipPackageJson": {
66
+ "type": "boolean",
67
+ "default": false,
68
+ "description": "Do not add dependencies to `package.json`.",
69
+ "x-priority": "internal"
64
70
  }
65
71
  },
66
72
  "required": ["project"],
@@ -10,7 +10,9 @@ async function setupSsr(tree, schema) {
10
10
  const { targets } = (0, devkit_1.readProjectConfiguration)(tree, options.project);
11
11
  const isUsingApplicationBuilder = targets.build.executor === '@angular-devkit/build-angular:application' ||
12
12
  targets.build.executor === '@nx/angular:application';
13
- (0, lib_1.addDependencies)(tree, isUsingApplicationBuilder);
13
+ if (!schema.skipPackageJson) {
14
+ (0, lib_1.addDependencies)(tree, isUsingApplicationBuilder);
15
+ }
14
16
  (0, lib_1.generateSSRFiles)(tree, options, isUsingApplicationBuilder);
15
17
  if (!options.standalone) {
16
18
  (0, lib_1.updateAppModule)(tree, options);
@@ -3,11 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.addJest = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const versions_1 = require("../../utils/versions");
6
- const version_utils_1 = require("./version-utils");
7
6
  async function addJest(tree, options) {
8
7
  if (!options.skipPackageJson) {
9
8
  process.env.npm_config_legacy_peer_deps ??= 'true';
10
- (0, version_utils_1.addDependenciesToPackageJsonIfDontExist)(tree, {}, { 'jest-preset-angular': versions_1.jestPresetAngularVersion });
9
+ (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { 'jest-preset-angular': versions_1.jestPresetAngularVersion }, undefined, true);
11
10
  }
12
11
  const { configurationGenerator } = (0, devkit_1.ensurePackage)('@nx/jest', versions_1.nxVersion);
13
12
  await configurationGenerator(tree, {
@@ -1,2 +1,2 @@
1
- import type { GeneratorCallback, Tree } from '@nx/devkit';
1
+ import { type GeneratorCallback, type Tree } from '@nx/devkit';
2
2
  export declare function ensureAngularDependencies(tree: Tree): GeneratorCallback;
@@ -1,35 +1,52 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ensureAngularDependencies = void 0;
4
+ const devkit_1 = require("@nx/devkit");
4
5
  const version_utils_1 = require("./version-utils");
5
6
  function ensureAngularDependencies(tree) {
7
+ const dependencies = {};
8
+ const devDependencies = {};
6
9
  const pkgVersions = (0, version_utils_1.versions)(tree);
7
- const angularVersion = (0, version_utils_1.getInstalledPackageVersion)(tree, '@angular/core') ??
8
- pkgVersions.angularVersion;
9
- const angularDevkitVersion = (0, version_utils_1.getInstalledPackageVersion)(tree, '@angular-devkit/build-angular') ??
10
- pkgVersions.angularDevkitVersion;
11
- const rxjsVersion = (0, version_utils_1.getInstalledPackageVersion)(tree, 'rxjs') ?? pkgVersions.rxjsVersion;
12
- const tsLibVersion = (0, version_utils_1.getInstalledPackageVersion)(tree, 'tslib') ?? pkgVersions.tsLibVersion;
13
- const zoneJsVersion = (0, version_utils_1.getInstalledPackageVersion)(tree, 'zone.js') ?? pkgVersions.zoneJsVersion;
14
- return (0, version_utils_1.addDependenciesToPackageJsonIfDontExist)(tree, {
15
- '@angular/animations': angularVersion,
16
- '@angular/common': angularVersion,
17
- '@angular/compiler': angularVersion,
18
- '@angular/core': angularVersion,
19
- '@angular/forms': angularVersion,
20
- '@angular/platform-browser': angularVersion,
21
- '@angular/platform-browser-dynamic': angularVersion,
22
- '@angular/router': angularVersion,
23
- rxjs: rxjsVersion,
24
- tslib: tsLibVersion,
25
- 'zone.js': zoneJsVersion,
26
- }, {
27
- '@angular/cli': angularDevkitVersion,
28
- '@angular/compiler-cli': angularVersion,
29
- '@angular/language-service': angularVersion,
30
- '@angular-devkit/build-angular': angularDevkitVersion,
31
- '@angular-devkit/schematics': angularDevkitVersion,
32
- '@schematics/angular': angularDevkitVersion,
33
- });
10
+ const installedAngularCoreVersion = (0, version_utils_1.getInstalledPackageVersion)(tree, '@angular/core');
11
+ if (!installedAngularCoreVersion) {
12
+ /**
13
+ * If @angular/core is already installed, we assume the workspace was already
14
+ * initialized with Angular dependencies and we don't want to re-install them.
15
+ * This is to avoid re-installing Angular runtime dependencies that the user
16
+ * might have removed.
17
+ */
18
+ const angularVersion = pkgVersions.angularVersion;
19
+ const rxjsVersion = (0, version_utils_1.getInstalledPackageVersion)(tree, 'rxjs') ?? pkgVersions.rxjsVersion;
20
+ const tsLibVersion = (0, version_utils_1.getInstalledPackageVersion)(tree, 'tslib') ?? pkgVersions.tsLibVersion;
21
+ const zoneJsVersion = (0, version_utils_1.getInstalledPackageVersion)(tree, 'zone.js') ?? pkgVersions.zoneJsVersion;
22
+ dependencies['@angular/animations'] = angularVersion;
23
+ dependencies['@angular/common'] = angularVersion;
24
+ dependencies['@angular/compiler'] = angularVersion;
25
+ dependencies['@angular/core'] = angularVersion;
26
+ dependencies['@angular/forms'] = angularVersion;
27
+ dependencies['@angular/platform-browser'] = angularVersion;
28
+ dependencies['@angular/platform-browser-dynamic'] = angularVersion;
29
+ dependencies['@angular/router'] = angularVersion;
30
+ dependencies.rxjs = rxjsVersion;
31
+ dependencies.tslib = tsLibVersion;
32
+ dependencies['zone.js'] = zoneJsVersion;
33
+ }
34
+ const installedAngularDevkitVersion = (0, version_utils_1.getInstalledPackageVersion)(tree, '@angular-devkit/build-angular');
35
+ if (!installedAngularDevkitVersion) {
36
+ /**
37
+ * If `@angular-devkit/build-angular` is already installed, we assume the workspace
38
+ * was already initialized with Angular and we don't want to re-install the tooling.
39
+ * This is to avoid re-installing Angular tooling that the user might have removed.
40
+ */
41
+ devDependencies['@angular/cli'] = pkgVersions.angularDevkitVersion;
42
+ devDependencies['@angular/compiler-cli'] = pkgVersions.angularVersion;
43
+ devDependencies['@angular/language-service'] = pkgVersions.angularVersion;
44
+ }
45
+ // Ensure the `@nx/angular` peer dependencies are always installed.
46
+ const angularDevkitVersion = installedAngularDevkitVersion ?? pkgVersions.angularDevkitVersion;
47
+ devDependencies['@angular-devkit/build-angular'] = angularDevkitVersion;
48
+ devDependencies['@angular-devkit/schematics'] = angularDevkitVersion;
49
+ devDependencies['@schematics/angular'] = angularDevkitVersion;
50
+ return (0, devkit_1.addDependenciesToPackageJson)(tree, dependencies, devDependencies, undefined, true);
34
51
  }
35
52
  exports.ensureAngularDependencies = ensureAngularDependencies;
@@ -5,14 +5,12 @@ const devkit_1 = require("@nx/devkit");
5
5
  const testing_1 = require("@nx/devkit/testing");
6
6
  const eslint_1 = require("@nx/eslint");
7
7
  const test_runners_1 = require("../../utils/test-runners");
8
- const versions_1 = require("../../utils/versions");
9
8
  const application_1 = require("../application/application");
10
9
  const component_1 = require("../component/component");
11
10
  const host_1 = require("../host/host");
12
11
  const library_1 = require("../library/library");
13
12
  const remote_1 = require("../remote/remote");
14
13
  async function generateTestApplication(tree, options) {
15
- addAngularPluginPeerDeps(tree);
16
14
  tree.write('.gitignore', '');
17
15
  await (0, application_1.applicationGenerator)(tree, {
18
16
  projectNameAndRootFormat: 'as-provided',
@@ -21,19 +19,16 @@ async function generateTestApplication(tree, options) {
21
19
  }
22
20
  exports.generateTestApplication = generateTestApplication;
23
21
  async function generateTestHostApplication(tree, options) {
24
- addAngularPluginPeerDeps(tree);
25
22
  tree.write('.gitignore', '');
26
23
  await (0, host_1.host)(tree, { projectNameAndRootFormat: 'as-provided', ...options });
27
24
  }
28
25
  exports.generateTestHostApplication = generateTestHostApplication;
29
26
  async function generateTestRemoteApplication(tree, options) {
30
- addAngularPluginPeerDeps(tree);
31
27
  tree.write('.gitignore', '');
32
28
  await (0, remote_1.remote)(tree, { projectNameAndRootFormat: 'as-provided', ...options });
33
29
  }
34
30
  exports.generateTestRemoteApplication = generateTestRemoteApplication;
35
31
  async function generateTestLibrary(tree, options) {
36
- addAngularPluginPeerDeps(tree);
37
32
  tree.write('.gitignore', '');
38
33
  await (0, library_1.libraryGenerator)(tree, {
39
34
  projectNameAndRootFormat: 'as-provided',
@@ -43,7 +38,6 @@ async function generateTestLibrary(tree, options) {
43
38
  exports.generateTestLibrary = generateTestLibrary;
44
39
  async function createStorybookTestWorkspaceForLib(libName) {
45
40
  let tree = (0, testing_1.createTreeWithEmptyWorkspace)({ layout: 'apps-libs' });
46
- addAngularPluginPeerDeps(tree);
47
41
  tree.write('.gitignore', '');
48
42
  await (0, library_1.libraryGenerator)(tree, {
49
43
  name: libName,
@@ -243,17 +237,6 @@ export class StaticMemberDeclarationsModule {
243
237
  return tree;
244
238
  }
245
239
  exports.createStorybookTestWorkspaceForLib = createStorybookTestWorkspaceForLib;
246
- function addAngularPluginPeerDeps(tree) {
247
- (0, devkit_1.updateJson)(tree, 'package.json', (json) => ({
248
- ...json,
249
- devDependencies: {
250
- ...json.devDependencies,
251
- '@angular-devkit/core': versions_1.angularDevkitVersion,
252
- '@angular-devkit/schematics': versions_1.angularDevkitVersion,
253
- '@schematics/angular': versions_1.angularDevkitVersion,
254
- },
255
- }));
256
- }
257
240
  function generateModule(tree, options) {
258
241
  const project = (0, devkit_1.readProjectConfiguration)(tree, options.project);
259
242
  if (options.path === undefined) {
@@ -1,4 +1,4 @@
1
- import type { GeneratorCallback, Tree } from '@nx/devkit';
1
+ import { type Tree } from '@nx/devkit';
2
2
  import { type PackageCompatVersions, type PackageLatestVersions } from '../../utils/backward-compatible-versions';
3
3
  export declare function getInstalledAngularVersion(tree: Tree): string;
4
4
  export declare function getInstalledAngularMajorVersion(tree: Tree): number;
@@ -11,5 +11,4 @@ export declare function getInstalledPackageVersionInfo(tree: Tree, pkgName: stri
11
11
  major: number;
12
12
  version: string;
13
13
  };
14
- export declare function addDependenciesToPackageJsonIfDontExist(tree: Tree, dependencies: Record<string, string>, devDependencies: Record<string, string>, packageJsonPath?: string): GeneratorCallback;
15
14
  export declare function versions(tree: Tree): PackageLatestVersions | PackageCompatVersions;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.versions = exports.addDependenciesToPackageJsonIfDontExist = exports.getInstalledPackageVersionInfo = exports.getInstalledPackageVersion = exports.getInstalledAngularVersionInfo = exports.getInstalledAngularMajorVersion = exports.getInstalledAngularVersion = void 0;
3
+ exports.versions = exports.getInstalledPackageVersionInfo = exports.getInstalledPackageVersion = exports.getInstalledAngularVersionInfo = exports.getInstalledAngularMajorVersion = exports.getInstalledAngularVersion = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const semver_1 = require("semver");
6
6
  const backward_compatible_versions_1 = require("../../utils/backward-compatible-versions");
@@ -40,18 +40,6 @@ function getInstalledPackageVersionInfo(tree, pkgName) {
40
40
  return version ? { major: (0, semver_1.major)((0, semver_1.coerce)(version)), version } : null;
41
41
  }
42
42
  exports.getInstalledPackageVersionInfo = getInstalledPackageVersionInfo;
43
- function addDependenciesToPackageJsonIfDontExist(tree, dependencies, devDependencies, packageJsonPath = 'package.json') {
44
- const packageJson = (0, devkit_1.readJson)(tree, packageJsonPath);
45
- function filterExisting(deps) {
46
- return Object.keys(deps)
47
- .filter((d) => !packageJson.dependencies?.[d] && !packageJson.devDependencies?.[d])
48
- .reduce((acc, d) => ({ ...acc, [d]: deps[d] }), {});
49
- }
50
- const depsToAdd = filterExisting(dependencies);
51
- const devDepsToAdd = filterExisting(devDependencies);
52
- return (0, devkit_1.addDependenciesToPackageJson)(tree, depsToAdd, devDepsToAdd, packageJsonPath);
53
- }
54
- exports.addDependenciesToPackageJsonIfDontExist = addDependenciesToPackageJsonIfDontExist;
55
43
  function versions(tree) {
56
44
  const majorAngularVersion = getInstalledAngularMajorVersion(tree);
57
45
  switch (majorAngularVersion) {
@@ -1,3 +1,4 @@
1
+ import 'nx/src/internal-testing-utils/mock-project-graph';
1
2
  import type { Tree } from '@nx/devkit';
2
3
  export declare const DEFAULT_BROWSERS: string[];
3
4
  export default function removeBrowserlistConfig(tree: Tree): Promise<void>;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DEFAULT_BROWSERS = void 0;
4
+ require("nx/src/internal-testing-utils/mock-project-graph");
4
5
  const devkit_1 = require("@nx/devkit");
5
6
  const path_1 = require("path");
6
7
  const validBrowserslistConfigFilenames = new Set([