@nx/angular 17.1.0-beta.0 → 17.1.0-beta.3

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 (190) hide show
  1. package/fesm2022/nx-angular.mjs +1 -1
  2. package/migrations.json +135 -0
  3. package/ng-package.json +0 -1
  4. package/package.json +15 -20
  5. package/src/builders/module-federation-dev-server/module-federation-dev-server.impl.d.ts +1 -1
  6. package/src/builders/module-federation-dev-server/module-federation-dev-server.impl.js +112 -60
  7. package/src/builders/module-federation-dev-server/schema.d.ts +23 -7
  8. package/src/builders/module-federation-dev-server/schema.json +13 -3
  9. package/src/builders/module-federation-dev-ssr/module-federation-dev-ssr.impl.d.ts +1 -1
  10. package/src/builders/module-federation-dev-ssr/module-federation-dev-ssr.impl.js +13 -8
  11. package/src/builders/webpack-browser/schema.json +7 -7
  12. package/src/builders/webpack-browser/webpack-browser.impl.js +0 -2
  13. package/src/builders/webpack-dev-server/lib/normalize-options.d.ts +2 -2
  14. package/src/builders/webpack-dev-server/lib/normalize-options.js +11 -5
  15. package/src/builders/webpack-dev-server/schema.d.ts +22 -7
  16. package/src/builders/webpack-dev-server/schema.json +9 -3
  17. package/src/builders/webpack-dev-server/webpack-dev-server.impl.js +24 -13
  18. package/src/builders/webpack-server/schema.d.ts +0 -1
  19. package/src/builders/webpack-server/schema.json +1 -13
  20. package/src/builders/webpack-server/validate-options.js +0 -7
  21. package/src/builders/webpack-server/webpack-server.impl.js +0 -8
  22. package/src/executors/browser-esbuild/browser-esbuild.impl.js +0 -2
  23. package/src/executors/browser-esbuild/schema.json +5 -4
  24. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-package.transform.js +20 -12
  25. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ngc/compile-source-files.js +10 -1
  26. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/styles/stylesheet-processor.js +0 -13
  27. package/src/executors/package/ng-packagr-adjustments/ngc/compile-source-files.js +10 -1
  28. package/src/executors/package/ng-packagr-adjustments/styles/stylesheet-processor.js +0 -13
  29. package/src/executors/utilities/ng-compiler-cli.d.ts +15 -0
  30. package/src/executors/utilities/ng-compiler-cli.js +28 -0
  31. package/src/generators/application/application.js +7 -17
  32. package/src/generators/application/files/base/tsconfig.app.json__tpl__ +1 -1
  33. package/src/generators/application/files/base/tsconfig.json__tpl__ +3 -2
  34. package/src/generators/application/files/ng-module/src/app/app.module.ts__tpl__ +1 -1
  35. package/src/generators/application/files/ng-module/src/app/nx-welcome.component.ts__tpl__ +2 -2
  36. package/src/generators/application/files/ng-module/src/main.ts__tpl__ +2 -8
  37. package/src/generators/application/files/standalone-components/src/app/app.config.ts__tpl__ +2 -2
  38. package/src/generators/application/files/standalone-components/src/app/nx-welcome.component.ts__tpl__ +2 -2
  39. package/src/generators/application/lib/add-e2e.js +7 -1
  40. package/src/generators/application/lib/add-unit-test-runner.js +11 -1
  41. package/src/generators/application/lib/create-files.js +10 -5
  42. package/src/generators/application/lib/create-project.js +46 -38
  43. package/src/generators/application/lib/normalize-options.d.ts +1 -1
  44. package/src/generators/application/lib/normalize-options.js +14 -3
  45. package/src/generators/application/lib/normalized-schema.d.ts +2 -0
  46. package/src/generators/application/schema.d.ts +1 -0
  47. package/src/generators/application/schema.json +13 -6
  48. package/src/generators/component/component.js +0 -1
  49. package/src/generators/component/lib/index.d.ts +0 -1
  50. package/src/generators/component/lib/index.js +0 -1
  51. package/src/generators/component/lib/normalize-options.js +1 -0
  52. package/src/generators/component/schema.json +2 -2
  53. package/src/generators/directive/directive.js +0 -1
  54. package/src/generators/directive/lib/index.d.ts +0 -1
  55. package/src/generators/directive/lib/index.js +0 -1
  56. package/src/generators/directive/lib/normalize-options.js +1 -0
  57. package/src/generators/directive/schema.json +2 -2
  58. package/src/generators/federate-module/federate-module.js +1 -0
  59. package/src/generators/federate-module/lib/add-remote.d.ts +1 -1
  60. package/src/generators/federate-module/lib/add-remote.js +2 -11
  61. package/src/generators/federate-module/schema.json +9 -9
  62. package/src/generators/host/files/common/v17+/src/main.server.ts__tmpl__ +67 -0
  63. package/src/generators/host/host.js +5 -9
  64. package/src/generators/host/lib/index.d.ts +1 -1
  65. package/src/generators/host/lib/index.js +1 -1
  66. package/src/generators/host/lib/update-ssr-setup.d.ts +3 -0
  67. package/src/generators/host/lib/{add-ssr.js → update-ssr-setup.js} +8 -14
  68. package/src/generators/host/schema.json +2 -2
  69. package/src/generators/library/lib/normalize-options.js +1 -0
  70. package/src/generators/library/library.js +10 -6
  71. package/src/generators/library/schema.json +12 -12
  72. package/src/generators/ng-add/migrators/projects/app.migrator.js +50 -7
  73. package/src/generators/ngrx/lib/generate-files.js +1 -10
  74. package/src/generators/ngrx/lib/validate-options.js +0 -23
  75. package/src/generators/ngrx/schema.json +2 -2
  76. package/src/generators/ngrx-feature-store/lib/generate-files.js +1 -12
  77. package/src/generators/ngrx-feature-store/lib/validate-options.js +0 -22
  78. package/src/generators/ngrx-feature-store/schema.json +2 -2
  79. package/src/generators/ngrx-root-store/lib/normalize-options.js +1 -1
  80. package/src/generators/ngrx-root-store/lib/validate-options.js +0 -15
  81. package/src/generators/ngrx-root-store/schema.json +1 -1
  82. package/src/generators/pipe/lib/index.d.ts +0 -1
  83. package/src/generators/pipe/lib/index.js +0 -1
  84. package/src/generators/pipe/lib/normalize-options.js +1 -0
  85. package/src/generators/pipe/pipe.js +0 -1
  86. package/src/generators/pipe/schema.json +2 -2
  87. package/src/generators/remote/files/common/v17+/src/main.server.ts__tmpl__ +74 -0
  88. package/src/generators/remote/lib/index.d.ts +1 -1
  89. package/src/generators/remote/lib/index.js +1 -1
  90. package/src/generators/remote/lib/{add-ssr.d.ts → update-ssr-setup.d.ts} +1 -1
  91. package/src/generators/remote/lib/{add-ssr.js → update-ssr-setup.js} +9 -13
  92. package/src/generators/remote/remote.js +4 -9
  93. package/src/generators/remote/schema.json +2 -2
  94. package/src/generators/scam-to-standalone/scam-to-standalone.js +0 -7
  95. package/src/generators/scam-to-standalone/schema.json +1 -1
  96. package/src/generators/setup-mf/lib/add-remote-entry.js +2 -11
  97. package/src/generators/setup-mf/lib/fix-bootstrap.js +3 -12
  98. package/src/generators/setup-mf/lib/index.d.ts +1 -1
  99. package/src/generators/setup-mf/lib/index.js +1 -1
  100. package/src/generators/setup-mf/lib/normalize-options.js +1 -0
  101. package/src/generators/{component/lib/validate-options.d.ts → setup-mf/lib/update-tsconfig.d.ts} +1 -1
  102. package/src/generators/setup-mf/lib/update-tsconfig.js +19 -0
  103. package/src/generators/setup-mf/schema.json +2 -2
  104. package/src/generators/setup-mf/setup-mf.js +1 -7
  105. package/src/generators/setup-ssr/files/server/application-builder/__serverFileName__ +54 -0
  106. package/src/generators/setup-ssr/files/{ngmodule/base → server/server-builder/pre-v17}/__serverFileName__ +3 -4
  107. package/src/generators/setup-ssr/files/{standalone → server/server-builder/v17+}/__serverFileName__ +25 -16
  108. package/src/generators/setup-ssr/lib/add-dependencies.d.ts +2 -0
  109. package/src/generators/setup-ssr/lib/add-dependencies.js +32 -0
  110. package/src/generators/setup-ssr/lib/generate-files.d.ts +1 -1
  111. package/src/generators/setup-ssr/lib/generate-files.js +10 -13
  112. package/src/generators/setup-ssr/lib/generate-server-ts-config.d.ts +4 -0
  113. package/src/generators/setup-ssr/lib/generate-server-ts-config.js +26 -0
  114. package/src/generators/setup-ssr/lib/index.d.ts +3 -0
  115. package/src/generators/setup-ssr/lib/index.js +3 -0
  116. package/src/generators/setup-ssr/lib/normalize-options.js +7 -1
  117. package/src/generators/setup-ssr/lib/set-router-initial-navigation.d.ts +3 -0
  118. package/src/generators/setup-ssr/lib/set-router-initial-navigation.js +93 -0
  119. package/src/generators/setup-ssr/lib/update-project-config.d.ts +2 -1
  120. package/src/generators/setup-ssr/lib/update-project-config.js +24 -6
  121. package/src/generators/setup-ssr/lib/validate-options.js +15 -2
  122. package/src/generators/setup-ssr/schema.json +3 -3
  123. package/src/generators/setup-ssr/setup-ssr.js +16 -12
  124. package/src/generators/utils/create-ts-config.d.ts +1 -0
  125. package/src/generators/utils/create-ts-config.js +2 -3
  126. package/src/generators/utils/project.js +4 -4
  127. package/src/generators/utils/testing.js +12 -0
  128. package/src/generators/utils/validations.d.ts +0 -1
  129. package/src/generators/utils/validations.js +1 -14
  130. package/src/generators/utils/version-utils.js +2 -2
  131. package/src/migrations/update-17-1-0/browser-target-to-build-target.d.ts +3 -0
  132. package/src/migrations/update-17-1-0/browser-target-to-build-target.js +50 -0
  133. package/src/migrations/update-17-1-0/replace-nguniversal-builders.d.ts +2 -0
  134. package/src/migrations/update-17-1-0/replace-nguniversal-builders.js +75 -0
  135. package/src/migrations/update-17-1-0/replace-nguniversal-engines.d.ts +2 -0
  136. package/src/migrations/update-17-1-0/replace-nguniversal-engines.js +185 -0
  137. package/src/migrations/update-17-1-0/stub-performance-mark-in-jest-test-setup.d.ts +2 -0
  138. package/src/migrations/update-17-1-0/stub-performance-mark-in-jest-test-setup.js +63 -0
  139. package/src/migrations/update-17-1-0/update-angular-cli.d.ts +3 -0
  140. package/src/migrations/update-17-1-0/update-angular-cli.js +23 -0
  141. package/src/utils/backward-compatible-versions.d.ts +1 -1
  142. package/src/utils/backward-compatible-versions.js +18 -18
  143. package/src/utils/nx-devkit/ast-utils.js +4 -2
  144. package/src/utils/versions.d.ts +6 -6
  145. package/src/utils/versions.js +6 -6
  146. package/src/builders/webpack-browser/validate-options.d.ts +0 -2
  147. package/src/builders/webpack-browser/validate-options.js +0 -40
  148. package/src/executors/browser-esbuild/lib/validate-options.d.ts +0 -2
  149. package/src/executors/browser-esbuild/lib/validate-options.js +0 -40
  150. package/src/generators/application/files/tsconfig.editor.json__tpl__ +0 -5
  151. package/src/generators/application/files/v14/.browserlistrc__tpl__ +0 -16
  152. package/src/generators/application/files/v14/src/environments/environment.prod.ts__tpl__ +0 -3
  153. package/src/generators/application/files/v14/src/environments/environment.ts__tpl__ +0 -16
  154. package/src/generators/application/files/v14/src/polyfills.ts__tpl__ +0 -53
  155. package/src/generators/component/lib/validate-options.js +0 -8
  156. package/src/generators/directive/lib/validate-options.d.ts +0 -3
  157. package/src/generators/directive/lib/validate-options.js +0 -8
  158. package/src/generators/host/lib/add-ssr.d.ts +0 -3
  159. package/src/generators/ngrx/files/no-inject/__directory__/__fileName__.effects.ts__tmpl__ +0 -22
  160. package/src/generators/ngrx/files/no-inject/__directory__/__fileName__.facade.ts__tmpl__ +0 -27
  161. package/src/generators/ngrx-feature-store/files/no-inject/__directory__/__fileName__.effects.ts__tmpl__ +0 -22
  162. package/src/generators/ngrx-feature-store/files/no-inject/__directory__/__fileName__.facade.ts__tmpl__ +0 -27
  163. package/src/generators/pipe/lib/validate-options.d.ts +0 -3
  164. package/src/generators/pipe/lib/validate-options.js +0 -8
  165. package/src/generators/setup-mf/lib/set-tsconfig-target.d.ts +0 -3
  166. package/src/generators/setup-mf/lib/set-tsconfig-target.js +0 -16
  167. package/src/generators/setup-ssr/files/ngmodule/v14/src/__main__ +0 -11
  168. /package/src/generators/host/files/common/{src → pre-v17/src}/main.server.ts__tmpl__ +0 -0
  169. /package/src/generators/ngrx/files/{base/__directory__ → __directory__}/__fileName__.actions.ts__tmpl__ +0 -0
  170. /package/src/generators/ngrx/files/{base/__directory__ → __directory__}/__fileName__.effects.spec.ts__tmpl__ +0 -0
  171. /package/src/generators/ngrx/files/{base/__directory__ → __directory__}/__fileName__.effects.ts__tmpl__ +0 -0
  172. /package/src/generators/ngrx/files/{base/__directory__ → __directory__}/__fileName__.facade.spec.ts__tmpl__ +0 -0
  173. /package/src/generators/ngrx/files/{base/__directory__ → __directory__}/__fileName__.facade.ts__tmpl__ +0 -0
  174. /package/src/generators/ngrx/files/{base/__directory__ → __directory__}/__fileName__.models.ts__tmpl__ +0 -0
  175. /package/src/generators/ngrx/files/{base/__directory__ → __directory__}/__fileName__.reducer.spec.ts__tmpl__ +0 -0
  176. /package/src/generators/ngrx/files/{base/__directory__ → __directory__}/__fileName__.reducer.ts__tmpl__ +0 -0
  177. /package/src/generators/ngrx/files/{base/__directory__ → __directory__}/__fileName__.selectors.spec.ts__tmpl__ +0 -0
  178. /package/src/generators/ngrx/files/{base/__directory__ → __directory__}/__fileName__.selectors.ts__tmpl__ +0 -0
  179. /package/src/generators/ngrx-feature-store/files/{base/__directory__ → __directory__}/__fileName__.actions.ts__tmpl__ +0 -0
  180. /package/src/generators/ngrx-feature-store/files/{base/__directory__ → __directory__}/__fileName__.effects.spec.ts__tmpl__ +0 -0
  181. /package/src/generators/ngrx-feature-store/files/{base/__directory__ → __directory__}/__fileName__.effects.ts__tmpl__ +0 -0
  182. /package/src/generators/ngrx-feature-store/files/{base/__directory__ → __directory__}/__fileName__.facade.spec.ts__tmpl__ +0 -0
  183. /package/src/generators/ngrx-feature-store/files/{base/__directory__ → __directory__}/__fileName__.facade.ts__tmpl__ +0 -0
  184. /package/src/generators/ngrx-feature-store/files/{base/__directory__ → __directory__}/__fileName__.models.ts__tmpl__ +0 -0
  185. /package/src/generators/ngrx-feature-store/files/{base/__directory__ → __directory__}/__fileName__.reducer.spec.ts__tmpl__ +0 -0
  186. /package/src/generators/ngrx-feature-store/files/{base/__directory__ → __directory__}/__fileName__.reducer.ts__tmpl__ +0 -0
  187. /package/src/generators/ngrx-feature-store/files/{base/__directory__ → __directory__}/__fileName__.selectors.spec.ts__tmpl__ +0 -0
  188. /package/src/generators/ngrx-feature-store/files/{base/__directory__ → __directory__}/__fileName__.selectors.ts__tmpl__ +0 -0
  189. /package/src/generators/remote/files/common/{src → pre-v17/src}/main.server.ts__tmpl__ +0 -0
  190. /package/src/generators/setup-ssr/files/{base → root}/tsconfig.server.json__tpl__ +0 -0
@@ -742,9 +742,9 @@ import { Component, ViewEncapsulation } from '@angular/core';
742
742
  Add UI library
743
743
  </summary>
744
744
  <pre><span># Generate UI lib</span>
745
- nx g @nx/angular:lib ui
745
+ nx g &#64;nx/angular:lib ui
746
746
  <span># Add a component</span>
747
- nx g @nx/angular:component button --project ui</pre>
747
+ nx g &#64;nx/angular:component button --project ui</pre>
748
748
  </details>
749
749
  <details>
750
750
  <summary>
@@ -1,11 +1,5 @@
1
- import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';<% if(installedAngularInfo.major === 14) { %>
2
- import { enableProdMode } from '@angular/core';<% } %>
3
- import { AppModule } from './app/app.module';<% if(installedAngularInfo.major === 14) { %>
4
- import { environment } from './environments/environment';
5
-
6
- if(environment.production) {
7
- enableProdMode();
8
- }<% } %>
1
+ import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
2
+ import { AppModule } from './app/app.module';
9
3
 
10
4
  platformBrowserDynamic()
11
5
  .bootstrapModule(AppModule)
@@ -1,7 +1,7 @@
1
1
  import { ApplicationConfig } from <% if (installedAngularInfo.major >= 16) { %>'@angular/core';<% } else { %>'@angular/platform-browser';<% } %><% if (routing) { %>
2
- import { provideRouter, withEnabledBlockingInitialNavigation } from '@angular/router';
2
+ import { provideRouter } from '@angular/router';
3
3
  import { appRoutes } from './app.routes';<% } %>
4
4
 
5
5
  export const appConfig: ApplicationConfig = {
6
- providers: [<% if (routing) { %>provideRouter(appRoutes, withEnabledBlockingInitialNavigation()) <% } %>]
6
+ providers: [<% if (routing) { %>provideRouter(appRoutes) <% } %>]
7
7
  };
@@ -745,9 +745,9 @@ import { CommonModule } from '@angular/common';
745
745
  Add UI library
746
746
  </summary>
747
747
  <pre><span># Generate UI lib</span>
748
- nx g @nx/angular:lib ui
748
+ nx g &#64;nx/angular:lib ui
749
749
  <span># Add a component</span>
750
- nx g @nx/angular:component button --project ui</pre>
750
+ nx g &#64;nx/angular:component button --project ui</pre>
751
751
  </details>
752
752
  <details>
753
753
  <summary>
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.addE2e = void 0;
4
+ const cypress_1 = require("@nx/cypress");
4
5
  const devkit_1 = require("@nx/devkit");
5
6
  const versions_1 = require("../../../utils/versions");
6
- const cypress_1 = require("@nx/cypress");
7
+ const version_utils_1 = require("../../utils/version-utils");
7
8
  async function addE2e(tree, options) {
8
9
  if (options.e2eTestRunner === 'cypress') {
9
10
  // TODO: This can call `@nx/web:static-config` generator when ready
@@ -52,12 +53,17 @@ async function addE2e(tree, options) {
52
53
  exports.addE2e = addE2e;
53
54
  function addFileServerTarget(tree, options, targetName) {
54
55
  (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@nx/web': versions_1.nxVersion });
56
+ const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
57
+ const isUsingApplicationBuilder = angularMajorVersion >= 17 && options.bundler === 'esbuild';
55
58
  const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.name);
56
59
  projectConfig.targets[targetName] = {
57
60
  executor: '@nx/web:file-server',
58
61
  options: {
59
62
  buildTarget: `${options.name}:build`,
60
63
  port: options.port,
64
+ staticFilePath: isUsingApplicationBuilder
65
+ ? (0, devkit_1.joinPathFragments)(options.outputPath, 'browser')
66
+ : undefined,
61
67
  },
62
68
  };
63
69
  (0, devkit_1.updateProjectConfiguration)(tree, options.name, projectConfig);
@@ -4,6 +4,7 @@ exports.addUnitTestRunner = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const jest_1 = require("@nx/jest");
6
6
  const test_runners_1 = require("../../../utils/test-runners");
7
+ const version_utils_1 = require("../../utils/version-utils");
7
8
  async function addUnitTestRunner(host, options) {
8
9
  if (options.unitTestRunner === test_runners_1.UnitTestRunner.Jest) {
9
10
  await (0, jest_1.configurationGenerator)(host, {
@@ -15,6 +16,7 @@ async function addUnitTestRunner(host, options) {
15
16
  skipFormat: true,
16
17
  });
17
18
  const setupFile = (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'src', 'test-setup.ts');
19
+ const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(host);
18
20
  if (options.strict && host.exists(setupFile)) {
19
21
  const contents = host.read(setupFile, 'utf-8');
20
22
  host.write(setupFile, `// @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment
@@ -24,7 +26,15 @@ globalThis.ngJest = {
24
26
  errorOnUnknownProperties: true,
25
27
  },
26
28
  };
27
- ${contents}`);
29
+ ${contents}${angularMajorVersion >= 17
30
+ ? `
31
+ /**
32
+ * Angular uses performance.mark() which is not supported by jsdom. Stub it out
33
+ * to avoid errors.
34
+ */
35
+ global.performance.mark = jest.fn();
36
+ `
37
+ : ''}`);
28
38
  }
29
39
  }
30
40
  }
@@ -8,6 +8,7 @@ const test_runners_1 = require("../../../utils/test-runners");
8
8
  const version_utils_1 = require("../../utils/version-utils");
9
9
  async function createFiles(tree, options, rootOffset) {
10
10
  const installedAngularInfo = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
11
+ const isUsingApplicationBuilder = installedAngularInfo.major >= 17 && options.bundler === 'esbuild';
11
12
  const substitutions = {
12
13
  rootSelector: `${options.prefix}-root`,
13
14
  appName: options.name,
@@ -22,19 +23,23 @@ async function createFiles(tree, options, rootOffset) {
22
23
  rootTsConfig: (0, devkit_1.joinPathFragments)(rootOffset, (0, js_1.getRootTsConfigFileName)(tree)),
23
24
  installedAngularInfo,
24
25
  rootOffset,
26
+ isUsingApplicationBuilder,
25
27
  tpl: '',
26
28
  };
27
29
  (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, '../files/base'), options.appProjectRoot, substitutions);
28
- if (installedAngularInfo.major === 14) {
29
- (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, '../files/v14'), options.appProjectRoot, substitutions);
30
- }
31
30
  if (options.standalone) {
32
31
  (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, '../files/standalone-components'), options.appProjectRoot, substitutions);
33
32
  }
34
33
  else {
35
- await (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, '../files/ng-module'), options.appProjectRoot, substitutions);
34
+ (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, '../files/ng-module'), options.appProjectRoot, substitutions);
36
35
  }
37
- (0, create_ts_config_1.createTsConfig)(tree, options.appProjectRoot, 'app', options, (0, js_1.getRelativePathToRootTsConfig)(tree, options.appProjectRoot));
36
+ (0, create_ts_config_1.createTsConfig)(tree, options.appProjectRoot, 'app', {
37
+ bundler: options.bundler,
38
+ rootProject: options.rootProject,
39
+ strict: options.strict,
40
+ style: options.style,
41
+ esModuleInterop: isUsingApplicationBuilder,
42
+ }, (0, js_1.getRelativePathToRootTsConfig)(tree, options.appProjectRoot));
38
43
  if (!options.routing) {
39
44
  tree.delete((0, devkit_1.joinPathFragments)(options.appProjectRoot, '/src/app/app.routes.ts'));
40
45
  }
@@ -4,64 +4,72 @@ exports.createProject = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const version_utils_1 = require("../../utils/version-utils");
6
6
  function createProject(tree, options) {
7
- const installedAngularInfo = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
7
+ const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
8
8
  const buildExecutor = options.bundler === 'webpack'
9
9
  ? '@angular-devkit/build-angular:browser'
10
- : '@angular-devkit/build-angular:browser-esbuild';
10
+ : angularMajorVersion >= 17
11
+ ? '@angular-devkit/build-angular:application'
12
+ : '@angular-devkit/build-angular:browser-esbuild';
13
+ const buildTargetOptionName = angularMajorVersion >= 17 ? 'buildTarget' : 'browserTarget';
14
+ const buildMainOptionName = angularMajorVersion >= 17 && options.bundler === 'esbuild'
15
+ ? 'browser'
16
+ : 'main';
17
+ let budgets = undefined;
18
+ if (options.bundler === 'webpack' || angularMajorVersion >= 17) {
19
+ if (options.strict) {
20
+ budgets = [
21
+ { type: 'initial', maximumWarning: '500kb', maximumError: '1mb' },
22
+ {
23
+ type: 'anyComponentStyle',
24
+ maximumWarning: '2kb',
25
+ maximumError: '4kb',
26
+ },
27
+ ];
28
+ }
29
+ else {
30
+ budgets = [
31
+ { type: 'initial', maximumWarning: '2mb', maximumError: '5mb' },
32
+ {
33
+ type: 'anyComponentStyle',
34
+ maximumWarning: '6kb',
35
+ maximumError: '10kb',
36
+ },
37
+ ];
38
+ }
39
+ }
40
+ const inlineStyleLanguage = options?.style !== 'css' ? options.style : undefined;
11
41
  const project = {
12
42
  name: options.name,
13
43
  projectType: 'application',
14
44
  prefix: options.prefix,
15
45
  root: options.appProjectRoot,
16
- sourceRoot: `${options.appProjectRoot}/src`,
46
+ sourceRoot: options.appProjectSourceRoot,
17
47
  tags: options.parsedTags,
18
48
  targets: {
19
49
  build: {
20
50
  executor: buildExecutor,
21
51
  outputs: ['{options.outputPath}'],
22
52
  options: {
23
- outputPath: `dist/${!options.rootProject ? options.appProjectRoot : options.name}`,
24
- index: `${options.appProjectRoot}/src/index.html`,
25
- main: `${options.appProjectRoot}/src/main.ts`,
26
- polyfills: installedAngularInfo.major === 14
27
- ? `${options.appProjectRoot}/src/polyfills.ts`
28
- : ['zone.js'],
53
+ outputPath: options.outputPath,
54
+ index: `${options.appProjectSourceRoot}/index.html`,
55
+ [buildMainOptionName]: `${options.appProjectSourceRoot}/main.ts`,
56
+ polyfills: ['zone.js'],
29
57
  tsConfig: `${options.appProjectRoot}/tsconfig.app.json`,
58
+ inlineStyleLanguage,
30
59
  assets: [
31
- `${options.appProjectRoot}/src/favicon.ico`,
32
- `${options.appProjectRoot}/src/assets`,
60
+ `${options.appProjectSourceRoot}/favicon.ico`,
61
+ `${options.appProjectSourceRoot}/assets`,
33
62
  ],
34
- styles: [`${options.appProjectRoot}/src/styles.${options.style}`],
63
+ styles: [`${options.appProjectSourceRoot}/styles.${options.style}`],
35
64
  scripts: [],
36
65
  },
37
66
  configurations: {
38
67
  production: {
39
- budgets: options.bundler === 'webpack'
40
- ? [
41
- {
42
- type: 'initial',
43
- maximumWarning: '500kb',
44
- maximumError: '1mb',
45
- },
46
- {
47
- type: 'anyComponentStyle',
48
- maximumWarning: '2kb',
49
- maximumError: '4kb',
50
- },
51
- ]
52
- : undefined,
53
- fileReplacements: installedAngularInfo.major === 14
54
- ? [
55
- {
56
- replace: `${options.appProjectRoot}/src/environments/environment.ts`,
57
- with: `${options.appProjectRoot}/src/environments/environment.prod.ts`,
58
- },
59
- ]
60
- : undefined,
68
+ budgets,
61
69
  outputHashing: 'all',
62
70
  },
63
71
  development: {
64
- buildOptimizer: false,
72
+ buildOptimizer: options.bundler === 'webpack' ? false : undefined,
65
73
  optimization: false,
66
74
  vendorChunk: options.bundler === 'webpack' ? true : undefined,
67
75
  extractLicenses: false,
@@ -80,10 +88,10 @@ function createProject(tree, options) {
80
88
  : undefined,
81
89
  configurations: {
82
90
  production: {
83
- browserTarget: `${options.name}:build:production`,
91
+ [buildTargetOptionName]: `${options.name}:build:production`,
84
92
  },
85
93
  development: {
86
- browserTarget: `${options.name}:build:development`,
94
+ [buildTargetOptionName]: `${options.name}:build:development`,
87
95
  },
88
96
  },
89
97
  defaultConfiguration: 'development',
@@ -91,7 +99,7 @@ function createProject(tree, options) {
91
99
  'extract-i18n': {
92
100
  executor: '@angular-devkit/build-angular:extract-i18n',
93
101
  options: {
94
- browserTarget: `${options.name}:build`,
102
+ [buildTargetOptionName]: `${options.name}:build`,
95
103
  },
96
104
  },
97
105
  },
@@ -1,4 +1,4 @@
1
- import { Tree } from '@nx/devkit';
1
+ import { type Tree } from '@nx/devkit';
2
2
  import type { Schema } from '../schema';
3
3
  import type { NormalizedSchema } from './normalized-schema';
4
4
  export declare function normalizeOptions(host: Tree, options: Partial<Schema>): Promise<NormalizedSchema>;
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.normalizeOptions = void 0;
4
+ const devkit_1 = require("@nx/devkit");
4
5
  const project_name_and_root_utils_1 = require("@nx/devkit/src/generators/project-name-and-root-utils");
5
- const get_npm_scope_1 = require("@nx/js/src/utils/package-json/get-npm-scope");
6
6
  const eslint_1 = require("@nx/eslint");
7
+ const get_npm_scope_1 = require("@nx/js/src/utils/package-json/get-npm-scope");
7
8
  const test_runners_1 = require("../../../utils/test-runners");
8
9
  const project_1 = require("../../utils/project");
10
+ const version_utils_1 = require("../../utils/version-utils");
9
11
  async function normalizeOptions(host, options) {
10
12
  const { projectName: appProjectName, projectRoot: appProjectRoot, projectNameAndRootFormat, } = await (0, project_name_and_root_utils_1.determineProjectNameAndRootOptions)(host, {
11
13
  name: options.name,
@@ -23,10 +25,15 @@ async function normalizeOptions(host, options) {
23
25
  ? options.tags.split(',').map((s) => s.trim())
24
26
  : [];
25
27
  const prefix = (0, project_1.normalizeNewProjectPrefix)(options.prefix, (0, get_npm_scope_1.getNpmScope)(host), 'app');
28
+ let bundler = options.bundler;
29
+ if (!bundler) {
30
+ const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(host);
31
+ bundler = angularMajorVersion >= 17 ? 'esbuild' : 'webpack';
32
+ }
26
33
  // Set defaults and then overwrite with user options
27
34
  return {
28
35
  style: 'css',
29
- routing: false,
36
+ routing: true,
30
37
  inlineStyle: false,
31
38
  inlineTemplate: false,
32
39
  skipTests: options.unitTestRunner === test_runners_1.UnitTestRunner.None,
@@ -35,14 +42,18 @@ async function normalizeOptions(host, options) {
35
42
  e2eTestRunner: test_runners_1.E2eTestRunner.Cypress,
36
43
  linter: eslint_1.Linter.EsLint,
37
44
  strict: true,
38
- bundler: options.bundler ?? 'webpack',
45
+ standalone: true,
39
46
  ...options,
40
47
  prefix,
41
48
  name: appProjectName,
42
49
  appProjectRoot,
50
+ appProjectSourceRoot: `${appProjectRoot}/src`,
43
51
  e2eProjectRoot,
44
52
  e2eProjectName,
45
53
  parsedTags,
54
+ bundler,
55
+ outputPath: (0, devkit_1.joinPathFragments)('dist', !options.rootProject ? appProjectRoot : appProjectName),
56
+ ssr: options.ssr ?? false,
46
57
  };
47
58
  }
48
59
  exports.normalizeOptions = normalizeOptions;
@@ -7,7 +7,9 @@ export interface NormalizedSchema extends Schema {
7
7
  e2eTestRunner: E2eTestRunner;
8
8
  prefix: string;
9
9
  appProjectRoot: string;
10
+ appProjectSourceRoot: string;
10
11
  e2eProjectName: string;
11
12
  e2eProjectRoot: string;
12
13
  parsedTags: string[];
14
+ outputPath: string;
13
15
  }
@@ -30,4 +30,5 @@ export interface Schema {
30
30
  rootProject?: boolean;
31
31
  minimal?: boolean;
32
32
  bundler?: 'webpack' | 'esbuild';
33
+ ssr?: boolean;
33
34
  }
@@ -56,9 +56,8 @@
56
56
  },
57
57
  "routing": {
58
58
  "type": "boolean",
59
- "description": "Generate a routing module.",
60
- "default": false,
61
- "x-prompt": "Would you like to configure routing for this application?",
59
+ "description": "Enable routing for the application.",
60
+ "default": true,
62
61
  "x-priority": "important"
63
62
  },
64
63
  "inlineStyle": {
@@ -155,8 +154,9 @@
155
154
  "default": false
156
155
  },
157
156
  "standalone": {
158
- "description": "Generate an application that is setup to use standalone components. _Note: This is only supported in Angular versions >= 14.1.0_",
157
+ "description": "Generate an application that is setup to use standalone components.",
159
158
  "type": "boolean",
159
+ "default": true,
160
160
  "x-priority": "important"
161
161
  },
162
162
  "rootProject": {
@@ -172,10 +172,17 @@
172
172
  "default": false
173
173
  },
174
174
  "bundler": {
175
- "description": "Bundler to use to build the application.",
175
+ "description": "Bundler to use to build the application. It defaults to `esbuild` for Angular versions >= 17.0.0. Otherwise, it defaults to `webpack`. _Note: The `esbuild` bundler is only considered stable from Angular v17._",
176
176
  "type": "string",
177
177
  "enum": ["webpack", "esbuild"],
178
- "default": "webpack"
178
+ "x-prompt": "Which bundler do you want to use to build the application?",
179
+ "x-priority": "important"
180
+ },
181
+ "ssr": {
182
+ "description": "Creates an application with Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) enabled.",
183
+ "type": "boolean",
184
+ "x-prompt": "Do you want to enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering)?",
185
+ "default": false
179
186
  }
180
187
  },
181
188
  "additionalProperties": false,
@@ -12,7 +12,6 @@ async function componentGenerator(tree, rawOptions) {
12
12
  }
13
13
  exports.componentGenerator = componentGenerator;
14
14
  async function componentGeneratorInternal(tree, rawOptions) {
15
- (0, lib_1.validateOptions)(tree, rawOptions);
16
15
  const options = await (0, lib_1.normalizeOptions)(tree, rawOptions);
17
16
  (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files'), options.directory, {
18
17
  name: options.name,
@@ -1,4 +1,3 @@
1
1
  export * from './component';
2
2
  export * from './module';
3
3
  export * from './normalize-options';
4
- export * from './validate-options';
@@ -4,4 +4,3 @@ const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./component"), exports);
5
5
  tslib_1.__exportStar(require("./module"), exports);
6
6
  tslib_1.__exportStar(require("./normalize-options"), exports);
7
- tslib_1.__exportStar(require("./validate-options"), exports);
@@ -28,6 +28,7 @@ async function normalizeOptions(tree, options) {
28
28
  projectName,
29
29
  changeDetection: options.changeDetection ?? 'Default',
30
30
  style: options.style ?? 'css',
31
+ standalone: options.standalone ?? true,
31
32
  directory,
32
33
  fileName,
33
34
  filePath,
@@ -60,9 +60,9 @@
60
60
  "alias": "t"
61
61
  },
62
62
  "standalone": {
63
- "description": "Whether the generated component is standalone. _Note: This is only supported in Angular versions >= 14.1.0_.",
63
+ "description": "Whether the generated component is standalone.",
64
64
  "type": "boolean",
65
- "default": false,
65
+ "default": true,
66
66
  "x-priority": "important"
67
67
  },
68
68
  "viewEncapsulation": {
@@ -5,7 +5,6 @@ const devkit_1 = require("@nx/devkit");
5
5
  const utils_1 = require("../utils");
6
6
  const lib_1 = require("./lib");
7
7
  async function directiveGenerator(tree, schema) {
8
- (0, lib_1.validateOptions)(tree, schema);
9
8
  const options = await (0, lib_1.normalizeOptions)(tree, schema);
10
9
  (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files'), options.directory, {
11
10
  selector: options.selector,
@@ -1,2 +1 @@
1
1
  export * from './normalize-options';
2
- export * from './validate-options';
@@ -2,4 +2,3 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./normalize-options"), exports);
5
- tslib_1.__exportStar(require("./validate-options"), exports);
@@ -30,6 +30,7 @@ async function normalizeOptions(tree, options) {
30
30
  filePath,
31
31
  symbolName,
32
32
  selector,
33
+ standalone: options.standalone ?? true,
33
34
  };
34
35
  }
35
36
  exports.normalizeOptions = normalizeOptions;
@@ -66,9 +66,9 @@
66
66
  "description": "The HTML selector to use for this directive."
67
67
  },
68
68
  "standalone": {
69
- "description": "Whether the generated directive is standalone. _Note: This is only supported in Angular versions >= 14.1.0_.",
69
+ "description": "Whether the generated directive is standalone.",
70
70
  "type": "boolean",
71
- "default": false
71
+ "default": true
72
72
  },
73
73
  "flat": {
74
74
  "type": "boolean",
@@ -9,6 +9,7 @@ async function federateModuleGenerator(tree, schema) {
9
9
 
10
10
  Path: ${schema.path}`);
11
11
  }
12
+ schema.standalone = schema.standalone ?? true;
12
13
  const { tasks, projectRoot, remoteName } = await (0, lib_1.addRemote)(tree, schema);
13
14
  (0, lib_1.addFileToRemoteTsconfig)(tree, remoteName, schema.path);
14
15
  (0, lib_1.addPathToExposes)(tree, {
@@ -1,4 +1,4 @@
1
- import { GeneratorCallback, type Tree } from '@nx/devkit';
1
+ import type { GeneratorCallback, Tree } from '@nx/devkit';
2
2
  import { type Schema } from '../schema';
3
3
  export declare function addRemote(tree: Tree, schema: Schema): Promise<{
4
4
  tasks: GeneratorCallback[];
@@ -1,24 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.addRemote = void 0;
4
- const devkit_1 = require("@nx/devkit");
5
4
  const project_name_and_root_utils_1 = require("@nx/devkit/src/generators/project-name-and-root-utils");
6
- const semver_1 = require("semver");
7
- const check_remote_exists_1 = require("./check-remote-exists");
8
- const version_utils_1 = require("../../utils/version-utils");
9
- const remote_1 = require("../../remote/remote");
10
5
  const test_runners_1 = require("../../../utils/test-runners");
6
+ const remote_1 = require("../../remote/remote");
7
+ const check_remote_exists_1 = require("./check-remote-exists");
11
8
  async function addRemote(tree, schema) {
12
9
  const tasks = [];
13
10
  const remote = (0, check_remote_exists_1.getRemoteIfExists)(tree, schema.remote);
14
11
  let projectRoot, remoteName;
15
12
  if (!remote) {
16
- const installedAngularVersionInfo = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
17
- if ((0, semver_1.lt)(installedAngularVersionInfo.version, '14.1.0') &&
18
- schema.standalone) {
19
- throw new Error((0, devkit_1.stripIndents) `The "standalone" option is only supported in Angular >= 14.1.0. You are currently using ${installedAngularVersionInfo.version}.
20
- You can resolve this error by removing the "standalone" option or by migrating to Angular 14.1.0.`);
21
- }
22
13
  const remoteGeneratorCallback = await (0, remote_1.default)(tree, {
23
14
  name: schema.remote,
24
15
  directory: schema.remoteDirectory,
@@ -12,22 +12,22 @@
12
12
  ],
13
13
  "type": "object",
14
14
  "properties": {
15
- "name": {
16
- "description": "The name of the module.",
15
+ "path": {
17
16
  "type": "string",
18
17
  "$default": {
19
18
  "$source": "argv",
20
19
  "index": 0
21
20
  },
21
+ "description": "The path to locate the federated module.",
22
+ "x-prompt": "What is the path to the module to be federated?"
23
+ },
24
+ "name": {
25
+ "description": "The name of the module.",
26
+ "type": "string",
22
27
  "x-prompt": "What name would you like to use for the module?",
23
28
  "pattern": "^[a-zA-Z][^:]*$",
24
29
  "x-priority": "important"
25
30
  },
26
- "path": {
27
- "type": "string",
28
- "description": "The path to locate the federated module.",
29
- "x-prompt": "What is the path to the module to be federated?"
30
- },
31
31
  "remote": {
32
32
  "type": "string",
33
33
  "description": "The name of the remote.",
@@ -67,9 +67,9 @@
67
67
  "default": "cypress"
68
68
  },
69
69
  "standalone": {
70
- "description": "Whether to generate the remote application with standalone components if it needs to be created. _Note: This is only supported in Angular versions >= 14.1.0_",
70
+ "description": "Whether to generate the remote application with standalone components if it needs to be created.",
71
71
  "type": "boolean",
72
- "default": false
72
+ "default": true
73
73
  },
74
74
  "host": {
75
75
  "type": "string",
@@ -0,0 +1,67 @@
1
+ import 'zone.js/node';
2
+
3
+ import { APP_BASE_HREF } from '@angular/common';
4
+ import { CommonEngine } from '@angular/ssr';
5
+ import * as express from 'express';
6
+ import * as cors from 'cors';
7
+ import { existsSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import<% if(standalone) { %> bootstrap <% } else { %> { AppServerModule } <% } %>from './bootstrap.server';
10
+
11
+ // The Express app is exported so that it can be used by serverless Functions.
12
+ export function app(): express.Express {
13
+ const server = express();
14
+ const distFolder = join(process.cwd(), '<%= browserBundleOutput %>');
15
+ const indexHtml = existsSync(join(distFolder, 'index.original.html'))
16
+ ? join(distFolder, 'index.original.html')
17
+ : join(distFolder, 'index.html');
18
+
19
+ server.use(cors());
20
+
21
+ const commonEngine = new CommonEngine();
22
+
23
+ server.set('view engine', 'html');
24
+ server.set('views', distFolder);
25
+
26
+ // Example Express Rest API endpoints
27
+ // server.get('/api/**', (req, res) => { });
28
+ // Serve static files from /browser
29
+ server.get(
30
+ '*.*',
31
+ express.static(distFolder, {
32
+ maxAge: '1y',
33
+ })
34
+ );
35
+
36
+ // All regular routes use the Angular engine
37
+ server.get('*', (req, res, next) => {
38
+ const { protocol, originalUrl, baseUrl, headers } = req;
39
+
40
+ commonEngine
41
+ .render({
42
+ bootstrap<% if (!standalone) { %>: AppServerModule<% } %>,
43
+ documentFilePath: indexHtml,
44
+ url: `${protocol}://${headers.host}${originalUrl}`,
45
+ publicPath: distFolder,
46
+ providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }],
47
+ })
48
+ .then((html) => res.send(html))
49
+ .catch((err) => next(err));
50
+ });
51
+
52
+ return server;
53
+ }
54
+
55
+ function run(): void {
56
+ const port = process.env['PORT'] || 4000;
57
+
58
+ // Start up the Node server
59
+ const server = app();
60
+ server.listen(port, () => {
61
+ console.log(`Node Express server listening on http://localhost:${port}`);
62
+ });
63
+ }
64
+
65
+ run();
66
+
67
+ export default <% if (standalone) { %>bootstrap<% } else { %>AppServerModule<% } %>;