@nx/angular 21.1.1 → 21.2.0-beta.1

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 (269) hide show
  1. package/README.md +3 -3
  2. package/fesm2022/nx-angular-mf.mjs.map +1 -1
  3. package/fesm2022/nx-angular.mjs.map +1 -1
  4. package/index.d.ts +2 -1
  5. package/mf/index.d.ts +71 -1
  6. package/migrations.json +106 -0
  7. package/ng-package.json +0 -1
  8. package/package.json +28 -16
  9. package/plugins/component-testing.js +8 -3
  10. package/src/builders/dev-server/dev-server.impl.js +4 -7
  11. package/src/builders/dev-server/lib/normalize-options.js +0 -6
  12. package/src/builders/dev-server/lib/validate-options.js +0 -4
  13. package/src/builders/dev-server/schema.d.ts +3 -15
  14. package/src/builders/dev-server/schema.json +3 -9
  15. package/src/builders/webpack-browser/webpack-browser.impl.js +2 -0
  16. package/src/builders/webpack-server/webpack-server.impl.d.ts +3 -1
  17. package/src/builders/webpack-server/webpack-server.impl.js +2 -0
  18. package/src/executors/application/application.impl.d.ts +2 -2
  19. package/src/executors/application/application.impl.js +11 -6
  20. package/src/executors/application/schema.d.ts +1 -1
  21. package/src/executors/application/schema.json +21 -10
  22. package/src/executors/application/utils/normalize-options.js +8 -1
  23. package/src/executors/application/utils/validate-options.js +10 -40
  24. package/src/executors/extract-i18n/extract-i18n.impl.js +6 -14
  25. package/src/executors/extract-i18n/schema.d.ts +1 -6
  26. package/src/executors/extract-i18n/schema.json +5 -0
  27. package/src/executors/extract-i18n/utils/validate-options.d.ts +2 -0
  28. package/src/executors/extract-i18n/utils/validate-options.js +13 -0
  29. package/src/executors/module-federation-dev-server/lib/normalize-options.js +1 -7
  30. package/src/executors/module-federation-dev-server/schema.d.ts +3 -15
  31. package/src/executors/module-federation-dev-server/schema.json +2 -15
  32. package/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.js +10 -8
  33. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/entry-point.d.ts +6 -3
  34. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/entry-point.js +46 -8
  35. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.di.d.ts +1 -1
  36. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.di.js +3 -3
  37. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.transform.d.ts +2 -2
  38. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.transform.js +22 -6
  39. package/src/executors/ng-packagr-lite/schema.json +2 -3
  40. package/src/executors/package/package.impl.js +1 -5
  41. package/src/executors/package/schema.d.ts +3 -1
  42. package/src/executors/package/schema.json +2 -3
  43. package/src/executors/utilities/builder-package.d.ts +1 -0
  44. package/src/executors/utilities/builder-package.js +11 -0
  45. package/src/executors/utilities/esbuild-extensions.d.ts +2 -1
  46. package/src/executors/utilities/ng-packagr/package-imports.d.ts +3 -1
  47. package/src/executors/utilities/ng-packagr/package-imports.js +2 -2
  48. package/src/executors/utilities/ng-packagr/pre-v19/stylesheet-processor.d.ts +2 -24
  49. package/src/executors/utilities/ng-packagr/pre-v19/stylesheet-processor.js +40 -107
  50. package/src/executors/utilities/ng-packagr/stylesheet-processor.di.js +4 -8
  51. package/src/executors/utilities/ng-packagr/v19+/stylesheet-processor.d.ts +1 -1
  52. package/src/executors/utilities/ng-packagr/v19+/stylesheet-processor.js +18 -11
  53. package/src/generators/add-linting/add-linting.js +8 -0
  54. package/src/generators/application/application.js +22 -8
  55. package/src/generators/application/files/base/tsconfig.app.json__tpl__ +10 -1
  56. package/src/generators/application/files/base/tsconfig.json__tpl__ +5 -6
  57. package/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.spec.ts__tpl__ +28 -0
  58. package/src/generators/application/files/ng-module/src/app/{app.component.ts__tpl__ → app__componentFileSuffix__.ts__tpl__} +4 -4
  59. package/src/generators/application/files/ng-module/src/app/app__moduleTypeSeparator__module.ts__tpl__ +17 -0
  60. package/src/generators/application/files/ng-module/src/main.ts__tpl__ +11 -3
  61. package/src/generators/application/files/nx-welcome/claimed/ng-module/src/app/{nx-welcome.component.ts__tpl__ → nx-welcome__componentFileSuffix__.ts__tpl__} +1 -1
  62. package/src/generators/application/files/nx-welcome/claimed/standalone/src/app/{nx-welcome.component.ts__tpl__ → nx-welcome__componentFileSuffix__.ts__tpl__} +1 -1
  63. package/src/generators/application/files/nx-welcome/not-configured/ng-module/src/app/{nx-welcome.component.ts__tpl__ → nx-welcome__componentFileSuffix__.ts__tpl__} +1 -1
  64. package/src/generators/application/files/nx-welcome/not-configured/standalone/src/app/{nx-welcome.component.ts__tpl__ → nx-welcome__componentFileSuffix__.ts__tpl__} +1 -1
  65. package/src/generators/application/files/nx-welcome/unclaimed/ng-module/src/app/{nx-welcome.component.ts__tpl__ → nx-welcome__componentFileSuffix__.ts__tpl__} +1 -1
  66. package/src/generators/application/files/nx-welcome/unclaimed/standalone/src/app/{nx-welcome.component.ts__tpl__ → nx-welcome__componentFileSuffix__.ts__tpl__} +1 -1
  67. package/src/generators/application/files/standalone-components/src/app/app.config.ts__tpl__ +6 -2
  68. package/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.spec.ts__tpl__ +27 -0
  69. package/src/generators/application/files/standalone-components/src/app/{app.component.ts__tpl__ → app__componentFileSuffix__.ts__tpl__} +6 -6
  70. package/src/generators/application/files/standalone-components/src/main.ts__tpl__ +2 -2
  71. package/src/generators/application/lib/create-files.d.ts +1 -1
  72. package/src/generators/application/lib/create-files.js +18 -19
  73. package/src/generators/application/lib/create-project.d.ts +1 -1
  74. package/src/generators/application/lib/create-project.js +119 -26
  75. package/src/generators/application/lib/enable-strict-type-checking.js +4 -2
  76. package/src/generators/application/lib/index.d.ts +1 -2
  77. package/src/generators/application/lib/index.js +1 -2
  78. package/src/generators/application/lib/set-generator-defaults.js +1 -0
  79. package/src/generators/application/lib/{update-editor-tsconfig.d.ts → update-tsconfig-files.d.ts} +1 -1
  80. package/src/generators/application/lib/update-tsconfig-files.js +76 -0
  81. package/src/generators/application/schema.json +1 -1
  82. package/src/generators/component/component.js +13 -2
  83. package/src/generators/component/files/__fileName__.ts__tpl__ +1 -1
  84. package/src/generators/component/lib/component.js +11 -1
  85. package/src/generators/component/lib/module.d.ts +7 -2
  86. package/src/generators/component/lib/module.js +7 -5
  87. package/src/generators/component/lib/normalize-options.js +7 -3
  88. package/src/generators/component/schema.d.ts +1 -0
  89. package/src/generators/component/schema.json +6 -2
  90. package/src/generators/convert-to-application-executor/convert-to-application-executor.js +37 -24
  91. package/src/generators/convert-to-rspack/convert-to-rspack.js +2 -6
  92. package/src/generators/convert-to-rspack/lib/get-custom-webpack-config.js +1 -1
  93. package/src/generators/directive/directive.js +1 -1
  94. package/src/generators/directive/lib/normalize-options.js +7 -2
  95. package/src/generators/directive/schema.d.ts +1 -0
  96. package/src/generators/directive/schema.json +10 -2
  97. package/src/generators/host/host.js +21 -1
  98. package/src/generators/host/schema.d.ts +1 -0
  99. package/src/generators/host/schema.json +7 -1
  100. package/src/generators/init/init.js +1 -1
  101. package/src/generators/library/files/base/tsconfig.json__tpl__ +5 -5
  102. package/src/generators/library/files/ng-module/src/index.ts__tpl__ +1 -1
  103. package/src/generators/library/files/standalone-components/src/lib/lib.routes.ts__tpl__ +2 -2
  104. package/src/generators/library/lib/add-standalone-component.js +1 -0
  105. package/src/generators/library/lib/create-files.js +10 -3
  106. package/src/generators/library/lib/normalize-options.d.ts +3 -3
  107. package/src/generators/library/lib/normalize-options.js +6 -1
  108. package/src/generators/library/lib/normalized-schema.d.ts +2 -0
  109. package/src/generators/library/lib/set-generator-defaults.js +1 -0
  110. package/src/generators/library/lib/update-tsconfig-files.d.ts +3 -0
  111. package/src/generators/library/lib/update-tsconfig-files.js +85 -0
  112. package/src/generators/library/library.js +19 -33
  113. package/src/generators/library-secondary-entry-point/files/src/index.ts__tmpl__ +1 -1
  114. package/src/generators/library-secondary-entry-point/lib/add-files.js +2 -1
  115. package/src/generators/library-secondary-entry-point/lib/normalize-options.d.ts +2 -2
  116. package/src/generators/library-secondary-entry-point/lib/normalize-options.js +3 -0
  117. package/src/generators/library-secondary-entry-point/schema.d.ts +1 -0
  118. package/src/generators/move/lib/update-module-name.js +17 -10
  119. package/src/generators/move/lib/update-secondary-entry-points.js +0 -3
  120. package/src/generators/ng-add/migrators/builders/angular-devkit-karma.migrator.js +1 -1
  121. package/src/generators/ng-add/migrators/projects/app.migrator.js +43 -8
  122. package/src/generators/ngrx/schema.json +3 -3
  123. package/src/generators/ngrx-root-store/lib/normalize-options.js +9 -2
  124. package/src/generators/pipe/lib/normalize-options.js +4 -0
  125. package/src/generators/pipe/pipe.js +1 -1
  126. package/src/generators/pipe/schema.d.ts +1 -0
  127. package/src/generators/pipe/schema.json +11 -2
  128. package/src/generators/remote/files/standalone/src/bootstrap.server.ts__tmpl__ +4 -4
  129. package/src/generators/remote/lib/update-ssr-setup.js +5 -0
  130. package/src/generators/remote/remote.js +23 -0
  131. package/src/generators/remote/schema.d.ts +1 -0
  132. package/src/generators/remote/schema.json +7 -1
  133. package/src/generators/scam/lib/convert-component-to-scam.js +1 -3
  134. package/src/generators/scam/lib/normalize-options.js +11 -3
  135. package/src/generators/scam/schema.d.ts +1 -0
  136. package/src/generators/scam/schema.json +1 -2
  137. package/src/generators/scam-directive/lib/convert-directive-to-scam.js +1 -3
  138. package/src/generators/scam-directive/lib/normalize-options.js +11 -2
  139. package/src/generators/scam-directive/schema.d.ts +2 -0
  140. package/src/generators/scam-directive/schema.json +10 -2
  141. package/src/generators/scam-pipe/lib/convert-pipe-to-scam.js +1 -3
  142. package/src/generators/scam-pipe/lib/normalize-options.js +8 -0
  143. package/src/generators/scam-pipe/schema.d.ts +2 -0
  144. package/src/generators/scam-pipe/schema.json +5 -0
  145. package/src/generators/setup-mf/files/entry-module-files/{entry.module.ts__tmpl__ → __entryModuleFileName__.ts__tmpl__} +4 -4
  146. package/src/generators/setup-mf/files/entry-module-files/entry.routes.ts__tmpl__ +2 -2
  147. package/src/generators/setup-mf/files/entry-module-files/{entry.component.ts__tmpl__ → entry__componentFileSuffix__.ts__tmpl__} +1 -1
  148. package/src/generators/setup-mf/files/host-files/__appFileName__.spec.ts__tmpl__ +43 -0
  149. package/src/generators/setup-mf/files/standalone-entry-component-files/entry.routes.ts__tmpl__ +2 -2
  150. package/src/generators/setup-mf/files/standalone-entry-component-files/{entry.component.ts__tmpl__ → entry__componentFileSuffix__.ts__tmpl__} +3 -3
  151. package/src/generators/setup-mf/files/ts-webpack/module-federation.config.ts__tmpl__ +1 -1
  152. package/src/generators/setup-mf/files/ts-webpack/tsconfig.lint.json__tmpl__ +1 -1
  153. package/src/generators/setup-mf/files/webpack/module-federation.config.js__tmpl__ +1 -1
  154. package/src/generators/setup-mf/lib/add-remote-entry.d.ts +2 -2
  155. package/src/generators/setup-mf/lib/add-remote-entry.js +9 -3
  156. package/src/generators/setup-mf/lib/add-remote-to-host.js +11 -1
  157. package/src/generators/setup-mf/lib/fix-bootstrap.d.ts +2 -2
  158. package/src/generators/setup-mf/lib/fix-bootstrap.js +4 -4
  159. package/src/generators/setup-mf/lib/generate-config.d.ts +2 -2
  160. package/src/generators/setup-mf/lib/generate-config.js +1 -0
  161. package/src/generators/setup-mf/lib/normalize-options.d.ts +1 -1
  162. package/src/generators/setup-mf/lib/normalize-options.js +13 -0
  163. package/src/generators/setup-mf/lib/remove-dead-code-from-remote.d.ts +2 -2
  164. package/src/generators/setup-mf/lib/remove-dead-code-from-remote.js +18 -14
  165. package/src/generators/setup-mf/lib/setup-host-if-dynamic.js +1 -5
  166. package/src/generators/setup-mf/lib/setup-tspath-for-remote.d.ts +2 -2
  167. package/src/generators/setup-mf/lib/setup-tspath-for-remote.js +1 -1
  168. package/src/generators/setup-mf/lib/update-host-app-routes.d.ts +2 -2
  169. package/src/generators/setup-mf/lib/update-host-app-routes.js +12 -9
  170. package/src/generators/setup-mf/lib/update-tsconfig.d.ts +2 -2
  171. package/src/generators/setup-mf/lib/update-tsconfig.js +5 -5
  172. package/src/generators/setup-mf/schema.d.ts +7 -0
  173. package/src/generators/setup-mf/setup-mf.d.ts +2 -2
  174. package/src/generators/setup-mf/setup-mf.js +16 -6
  175. package/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/__main__ +1 -0
  176. package/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/app/__rootModuleFileName__ +12 -0
  177. package/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/app/app.routes.server.ts__tpl__ +8 -0
  178. package/src/generators/setup-ssr/files/v20+/application-builder/server/__serverFileName__ +66 -0
  179. package/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/__main__ +7 -0
  180. package/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/app/app.config.server.ts__tpl__ +12 -0
  181. package/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/app/app.routes.server.ts__tpl__ +8 -0
  182. package/src/generators/setup-ssr/files/v20+/server-builder/ngmodule-src/__main__ +1 -0
  183. package/src/generators/setup-ssr/files/v20+/server-builder/ngmodule-src/app/__rootModuleFileName__ +14 -0
  184. package/src/generators/setup-ssr/files/v20+/server-builder/root/tsconfig.server.json.template +18 -0
  185. package/src/generators/setup-ssr/files/v20+/server-builder/server/__serverFileName__ +69 -0
  186. package/src/generators/setup-ssr/files/v20+/server-builder/standalone-src/__main__ +7 -0
  187. package/src/generators/setup-ssr/files/v20+/server-builder/standalone-src/app/app.config.server.ts.template +11 -0
  188. package/src/generators/setup-ssr/lib/add-dependencies.js +11 -8
  189. package/src/generators/setup-ssr/lib/add-hydration.js +10 -3
  190. package/src/generators/setup-ssr/lib/add-server-file.js +7 -2
  191. package/src/generators/setup-ssr/lib/generate-files.js +17 -4
  192. package/src/generators/setup-ssr/lib/generate-server-ts-config.js +32 -6
  193. package/src/generators/setup-ssr/lib/normalize-options.js +5 -3
  194. package/src/generators/setup-ssr/lib/update-project-config.js +5 -0
  195. package/src/generators/setup-ssr/lib/validate-options.js +2 -2
  196. package/src/generators/setup-ssr/schema.d.ts +1 -0
  197. package/src/generators/setup-ssr/schema.json +1 -1
  198. package/src/generators/utils/add-jest.js +6 -1
  199. package/src/generators/utils/app-components-info.d.ts +9 -0
  200. package/src/generators/utils/app-components-info.js +39 -0
  201. package/src/generators/utils/artifact-types.d.ts +3 -0
  202. package/src/generators/utils/artifact-types.js +33 -0
  203. package/src/generators/utils/assert-mf-utils.d.ts +1 -0
  204. package/src/generators/utils/assert-mf-utils.js +11 -0
  205. package/src/generators/utils/ensure-angular-dependencies.js +6 -3
  206. package/src/generators/utils/export-scam.d.ts +1 -0
  207. package/src/generators/utils/export-scam.js +1 -2
  208. package/src/generators/utils/find-module.js +18 -13
  209. package/src/generators/utils/storybook-ast/component-info.js +40 -24
  210. package/src/generators/utils/storybook-ast/module-info.d.ts +1 -1
  211. package/src/generators/utils/storybook-ast/module-info.js +3 -8
  212. package/src/generators/utils/testing.js +28 -28
  213. package/src/generators/utils/version-utils.js +2 -2
  214. package/src/generators/web-worker/lib/add-snippet.js +3 -3
  215. package/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.d.ts +2 -0
  216. package/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.js +110 -0
  217. package/src/migrations/update-21-2-0/replace-provide-server-routing.d.ts +2 -0
  218. package/src/migrations/update-21-2-0/replace-provide-server-routing.js +103 -0
  219. package/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.d.ts +2 -0
  220. package/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.js +47 -0
  221. package/src/migrations/update-21-2-0/update-angular-cli.d.ts +3 -0
  222. package/src/migrations/update-21-2-0/update-angular-cli.js +23 -0
  223. package/src/migrations/update-21-2-0/update-module-resolution.d.ts +2 -0
  224. package/src/migrations/update-21-2-0/update-module-resolution.js +45 -0
  225. package/src/plugins/plugin.js +22 -13
  226. package/src/utils/backward-compatible-versions.d.ts +2 -2
  227. package/src/utils/backward-compatible-versions.js +22 -19
  228. package/src/utils/nx-devkit/ast-utils.js +17 -3
  229. package/src/utils/nx-devkit/testing.js +9 -9
  230. package/src/utils/targets.d.ts +2 -1
  231. package/src/utils/targets.js +6 -0
  232. package/src/utils/versions.d.ts +4 -3
  233. package/src/utils/versions.js +5 -4
  234. package/mf/mf.d.ts +0 -69
  235. package/src/generators/application/files/base-pre18/src/favicon.ico +0 -0
  236. package/src/generators/application/files/ng-module/src/app/app.component.spec.ts__tpl__ +0 -29
  237. package/src/generators/application/files/ng-module/src/app/app.module.ts__tpl__ +0 -17
  238. package/src/generators/application/files/standalone-components/src/app/app.component.__style__ +0 -0
  239. package/src/generators/application/files/standalone-components/src/app/app.component.spec.ts__tpl__ +0 -28
  240. package/src/generators/application/lib/set-app-strict-default.d.ts +0 -2
  241. package/src/generators/application/lib/set-app-strict-default.js +0 -13
  242. package/src/generators/application/lib/update-editor-tsconfig.js +0 -21
  243. package/src/generators/library/lib/enable-strict-type-checking.d.ts +0 -7
  244. package/src/generators/library/lib/enable-strict-type-checking.js +0 -47
  245. package/src/generators/library/lib/update-tsconfig.d.ts +0 -3
  246. package/src/generators/library/lib/update-tsconfig.js +0 -36
  247. package/src/generators/setup-mf/files/host-files/app.component.spec.ts__tmpl__ +0 -47
  248. /package/src/generators/application/files/{base-18+ → base}/public/favicon.ico +0 -0
  249. /package/src/generators/application/files/{base-pre18/src/assets/.gitkeep__tpl__ → ng-module/src/app/app__componentFileSuffix__.__style__} +0 -0
  250. /package/src/generators/application/files/ng-module/src/app/{app.component.html__tpl__ → app__componentFileSuffix__.html__tpl__} +0 -0
  251. /package/src/generators/application/files/{ng-module/src/app/app.component.__style__ → standalone-components/src/app/app__componentFileSuffix__.__style__} +0 -0
  252. /package/src/generators/application/files/standalone-components/src/app/{app.component.html__tpl__ → app__componentFileSuffix__.html__tpl__} +0 -0
  253. /package/src/generators/component/files/{__fileName__.html__tpl__ → __fileName____ngext__.html__tpl__} +0 -0
  254. /package/src/generators/library/files/ng-module/src/lib/{__libFileName__.module.ts__tpl__ → __libFileName____moduleTypeSeparator__module.ts__tpl__} +0 -0
  255. /package/src/generators/library-secondary-entry-point/files/src/lib/{__fileName__.module.ts__tmpl__ → __fileName____moduleTypeSeparator__module.ts__tmpl__} +0 -0
  256. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder/ngmodule-src/__main__ +0 -0
  257. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder/ngmodule-src/app/__rootModuleFileName__ +0 -0
  258. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder/ngmodule-src/app/app.routes.server.ts__tpl__ +0 -0
  259. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder/server/__serverFileName__ +0 -0
  260. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder/standalone-src/__main__ +0 -0
  261. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder/standalone-src/app/app.config.server.ts__tpl__ +0 -0
  262. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder/standalone-src/app/app.routes.server.ts__tpl__ +0 -0
  263. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder-common-engine/server/__serverFileName__ +0 -0
  264. /package/src/generators/setup-ssr/files/{v19+ → v19}/server-builder/ngmodule-src/__main__ +0 -0
  265. /package/src/generators/setup-ssr/files/{v19+ → v19}/server-builder/ngmodule-src/app/__rootModuleFileName__ +0 -0
  266. /package/src/generators/setup-ssr/files/{v19+ → v19}/server-builder/root/tsconfig.server.json.template +0 -0
  267. /package/src/generators/setup-ssr/files/{v19+ → v19}/server-builder/server/__serverFileName__ +0 -0
  268. /package/src/generators/setup-ssr/files/{v19+ → v19}/server-builder/standalone-src/__main__ +0 -0
  269. /package/src/generators/setup-ssr/files/{v19+ → v19}/server-builder/standalone-src/app/app.config.server.ts.template +0 -0
@@ -2,16 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.updateTsConfig = updateTsConfig;
4
4
  const devkit_1 = require("@nx/devkit");
5
- function updateTsConfig(tree, schema) {
6
- const { root } = (0, devkit_1.readProjectConfiguration)(tree, schema.appName);
5
+ function updateTsConfig(tree, options) {
6
+ const { root } = (0, devkit_1.readProjectConfiguration)(tree, options.appName);
7
7
  (0, devkit_1.updateJson)(tree, (0, devkit_1.joinPathFragments)(root, `tsconfig.app.json`), (json) => {
8
8
  json.compilerOptions ??= {};
9
9
  json.compilerOptions.target = 'ES2020';
10
- if (schema.mfType === 'remote') {
10
+ if (options.mfType === 'remote') {
11
11
  json.files ??= [];
12
- json.files.push(schema.standalone
12
+ json.files.push(options.standalone
13
13
  ? 'src/app/remote-entry/entry.routes.ts'
14
- : 'src/app/remote-entry/entry.module.ts');
14
+ : `src/app/remote-entry/${options.entryModuleFileName}.ts`);
15
15
  }
16
16
  return json;
17
17
  });
@@ -1,3 +1,5 @@
1
+ import type { ComponentMetadata } from '../utils/app-components-info';
2
+
1
3
  type FederationType = 'static' | 'dynamic';
2
4
 
3
5
  export interface Schema {
@@ -21,4 +23,9 @@ export interface Schema {
21
23
  export interface NormalizedOptions extends Schema {
22
24
  federationType: FederationType;
23
25
  prefix: string | undefined;
26
+ componentType: string;
27
+ componentFileSuffix: string;
28
+ entryModuleFileName: string;
29
+ appComponentInfo: ComponentMetadata;
30
+ nxWelcomeComponentInfo: ComponentMetadata;
24
31
  }
@@ -1,4 +1,4 @@
1
- import { type Tree } from '@nx/devkit';
1
+ import { type GeneratorCallback, type Tree } from '@nx/devkit';
2
2
  import type { Schema } from './schema';
3
- export declare function setupMf(tree: Tree, rawOptions: Schema): Promise<() => void>;
3
+ export declare function setupMf(tree: Tree, rawOptions: Schema): Promise<GeneratorCallback>;
4
4
  export default setupMf;
@@ -3,11 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.setupMf = setupMf;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const versions_1 = require("../../utils/versions");
6
+ const version_utils_1 = require("../utils/version-utils");
6
7
  const lib_1 = require("./lib");
7
8
  async function setupMf(tree, rawOptions) {
8
9
  const options = (0, lib_1.normalizeOptions)(tree, rawOptions);
9
10
  const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.appName);
10
- let installTask = () => { };
11
+ const tasks = [];
11
12
  if (options.mfType === 'remote') {
12
13
  (0, lib_1.addRemoteToHost)(tree, {
13
14
  appName: options.appName,
@@ -19,13 +20,13 @@ async function setupMf(tree, rawOptions) {
19
20
  (0, lib_1.removeDeadCodeFromRemote)(tree, options);
20
21
  (0, lib_1.setupTspathForRemote)(tree, options);
21
22
  if (!options.skipPackageJson) {
22
- installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {
23
+ tasks.push((0, devkit_1.addDependenciesToPackageJson)(tree, {
23
24
  '@module-federation/enhanced': versions_1.moduleFederationEnhancedVersion,
24
25
  }, {
25
26
  '@nx/web': versions_1.nxVersion,
26
27
  '@nx/webpack': versions_1.nxVersion,
27
28
  '@nx/module-federation': versions_1.nxVersion,
28
- });
29
+ }));
29
30
  }
30
31
  }
31
32
  const remotesWithPorts = (0, lib_1.getRemotesWithPorts)(tree, options);
@@ -45,11 +46,11 @@ async function setupMf(tree, rawOptions) {
45
46
  });
46
47
  }
47
48
  if (!options.skipPackageJson) {
48
- installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
49
+ tasks.push((0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
49
50
  '@nx/webpack': versions_1.nxVersion,
50
51
  '@module-federation/enhanced': versions_1.moduleFederationEnhancedVersion,
51
52
  '@nx/module-federation': versions_1.nxVersion,
52
- });
53
+ }));
53
54
  }
54
55
  }
55
56
  (0, lib_1.fixBootstrap)(tree, projectConfig.root, options);
@@ -64,10 +65,19 @@ async function setupMf(tree, rawOptions) {
64
65
  if (!options.skipE2E) {
65
66
  (0, lib_1.addCypressOnErrorWorkaround)(tree, options);
66
67
  }
68
+ if (!options.skipPackageJson) {
69
+ const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
70
+ if (angularMajorVersion >= 20) {
71
+ const angularDevkitVersion = (0, version_utils_1.getInstalledAngularDevkitVersion)(tree) ??
72
+ (0, version_utils_1.versions)(tree).angularDevkitVersion;
73
+ // the executors used by MF require @angular-devkit/build-angular
74
+ tasks.push((0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@angular-devkit/build-angular': angularDevkitVersion }, undefined, true));
75
+ }
76
+ }
67
77
  // format files
68
78
  if (!options.skipFormat) {
69
79
  await (0, devkit_1.formatFiles)(tree);
70
80
  }
71
- return installTask;
81
+ return (0, devkit_1.runTasksInSerial)(...tasks);
72
82
  }
73
83
  exports.default = setupMf;
@@ -0,0 +1 @@
1
+ export { <%= rootModuleClassName %> as default } from './app/<%= rootModuleFileName.slice(0, -3) %>';
@@ -0,0 +1,12 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { provideServerRendering, withRoutes } from '@angular/ssr';
3
+ import { <%= appSymbolName %> } from './<%= appFileName %>';
4
+ import { AppModule } from './app<%= moduleTypeSeparator %>module';
5
+ import { serverRoutes } from './app.routes.server';
6
+
7
+ @NgModule({
8
+ imports: [AppModule],
9
+ providers: [provideServerRendering(withRoutes(serverRoutes))],
10
+ bootstrap: [<%= appSymbolName %>],
11
+ })
12
+ export class <%= rootModuleClassName %> {}
@@ -0,0 +1,8 @@
1
+ import { RenderMode, ServerRoute } from '@angular/ssr';
2
+
3
+ export const serverRoutes: ServerRoute[] = [
4
+ {
5
+ path: '**',
6
+ renderMode: RenderMode.Prerender
7
+ }
8
+ ];
@@ -0,0 +1,66 @@
1
+ import {
2
+ AngularNodeAppEngine,
3
+ createNodeRequestHandler,
4
+ isMainModule,
5
+ writeResponseToNodeResponse,
6
+ } from '@angular/ssr/node';
7
+ import express from 'express';
8
+ import { dirname, resolve } from 'node:path';
9
+ import { fileURLToPath } from 'node:url';
10
+
11
+ const serverDistFolder = dirname(fileURLToPath(import.meta.url));
12
+ const browserDistFolder = resolve(serverDistFolder, '../<%= browserDistDirectory %>');
13
+
14
+ const app = express();
15
+ const angularApp = new AngularNodeAppEngine();
16
+
17
+ /**
18
+ * Example Express Rest API endpoints can be defined here.
19
+ * Uncomment and define endpoints as necessary.
20
+ *
21
+ * Example:
22
+ * ```ts
23
+ * app.get('/api/**', (req, res) => {
24
+ * // Handle API request
25
+ * });
26
+ * ```
27
+ */
28
+
29
+ /**
30
+ * Serve static files from /<%= browserDistDirectory %>
31
+ */
32
+ app.use(
33
+ express.static(browserDistFolder, {
34
+ maxAge: '1y',
35
+ index: false,
36
+ redirect: false,
37
+ })
38
+ );
39
+
40
+ /**
41
+ * Handle all other requests by rendering the Angular application.
42
+ */
43
+ app.use('/**', (req, res, next) => {
44
+ angularApp
45
+ .handle(req)
46
+ .then((response) =>
47
+ response ? writeResponseToNodeResponse(response, res) : next()
48
+ )
49
+ .catch(next);
50
+ });
51
+
52
+ /**
53
+ * Start the server if this module is the main entry point.
54
+ * The server listens on the port defined by the `PORT` environment variable, or defaults to <%= serverPort %>.
55
+ */
56
+ if (isMainModule(import.meta.url)) {
57
+ const port = process.env['PORT'] || <%= serverPort %>;
58
+ app.listen(port, () => {
59
+ console.log(`Node Express server listening on http://localhost:${port}`);
60
+ });
61
+ }
62
+
63
+ /**
64
+ * Request handler used by the Angular CLI (for dev-server and during build) or Firebase Cloud Functions.
65
+ */
66
+ export const reqHandler = createNodeRequestHandler(app);
@@ -0,0 +1,7 @@
1
+ import { bootstrapApplication } from '@angular/platform-browser';
2
+ import { <%= appSymbolName %> } from './app/<%= appFileName %>';
3
+ import { config } from './app/app.config.server';
4
+
5
+ const bootstrap = () => bootstrapApplication(<%= appSymbolName %>, config);
6
+
7
+ export default bootstrap;
@@ -0,0 +1,12 @@
1
+ import { mergeApplicationConfig, ApplicationConfig } from '@angular/core';
2
+ import { provideServerRendering, withRoutes } from '@angular/ssr';
3
+ import { appConfig } from './app.config';
4
+ import { serverRoutes } from './app.routes.server';
5
+
6
+ const serverConfig: ApplicationConfig = {
7
+ providers: [
8
+ provideServerRendering(withRoutes(serverRoutes))
9
+ ]
10
+ };
11
+
12
+ export const config = mergeApplicationConfig(appConfig, serverConfig);
@@ -0,0 +1,8 @@
1
+ import { RenderMode, ServerRoute } from '@angular/ssr';
2
+
3
+ export const serverRoutes: ServerRoute[] = [
4
+ {
5
+ path: '**',
6
+ renderMode: RenderMode.Prerender
7
+ }
8
+ ];
@@ -0,0 +1 @@
1
+ export { <%= rootModuleClassName %> as default } from './app/<%= rootModuleFileName.slice(0, -3) %>';
@@ -0,0 +1,14 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { ServerModule } from '@angular/platform-server';
3
+
4
+ import { AppModule } from './app<%= moduleTypeSeparator %>module';
5
+ import { <%= appSymbolName %> } from './<%= appFileName %>';
6
+
7
+ @NgModule({
8
+ imports: [
9
+ AppModule,
10
+ ServerModule,
11
+ ],
12
+ bootstrap: [<%= appSymbolName %>],
13
+ })
14
+ export class <%= rootModuleClassName %> {}
@@ -0,0 +1,18 @@
1
+ /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
2
+ /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
3
+ {
4
+ "extends": "./tsconfig.app.json",
5
+ "compilerOptions": {
6
+ "outDir": "<%= rootOffset %>out-tsc/server",
7
+ "module": "commonjs",
8
+ "moduleResolution": "node10",
9
+ "types": [
10
+ "node"<% if (hasLocalizePackage) { %>,
11
+ "@angular/localize"<% } %>
12
+ ]
13
+ },
14
+ "files": [
15
+ "src/<%= main %>",
16
+ "src/server.ts"
17
+ ]
18
+ }
@@ -0,0 +1,69 @@
1
+ import 'zone.js/node';
2
+
3
+ import { APP_BASE_HREF } from '@angular/common';
4
+ import { CommonEngine } from '@angular/ssr/node';
5
+ import * as express from 'express';
6
+ import { existsSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import <% if (standalone) { %>bootstrap<% } else { %><%= rootModuleClassName %><% } %> from './<%= main.slice(0, -3) %>';
9
+
10
+ // The Express app is exported so that it can be used by serverless Functions.
11
+ export function app(): express.Express {
12
+ const server = express();
13
+ const distFolder = join(process.cwd(), '<%= browserDistDirectory %>');
14
+ const indexHtml = existsSync(join(distFolder, 'index.original.html'))
15
+ ? join(distFolder, 'index.original.html')
16
+ : join(distFolder, 'index.html');
17
+
18
+ const commonEngine = new CommonEngine();
19
+
20
+ server.set('view engine', 'html');
21
+ server.set('views', distFolder);
22
+
23
+ // Example Express Rest API endpoints
24
+ // server.get('/api/**', (req, res) => { });
25
+ // Serve static files from /browser
26
+ server.get('*.*', express.static(distFolder, {
27
+ maxAge: '1y'
28
+ }));
29
+
30
+ // All regular routes use the Angular engine
31
+ server.get('*', (req, res, next) => {
32
+ const { protocol, originalUrl, baseUrl, headers } = req;
33
+
34
+ commonEngine
35
+ .render({
36
+ bootstrap<% if (!standalone) { %>: <%= rootModuleClassName %><% } %>,
37
+ documentFilePath: indexHtml,
38
+ url: `${protocol}://${headers.host}${originalUrl}`,
39
+ publicPath: distFolder,
40
+ providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }],
41
+ })
42
+ .then((html) => res.send(html))
43
+ .catch((err) => next(err));
44
+ });
45
+
46
+ return server;
47
+ }
48
+
49
+ function run(): void {
50
+ const port = process.env['PORT'] || <%= serverPort %>;
51
+
52
+ // Start up the Node server
53
+ const server = app();
54
+ server.listen(port, () => {
55
+ console.log(`Node Express server listening on http://localhost:${port}`);
56
+ });
57
+ }
58
+
59
+ // Webpack will replace 'require' with '__webpack_require__'
60
+ // '__non_webpack_require__' is a proxy to Node 'require'
61
+ // The below code is to ensure that the server is run only when not requiring the bundle.
62
+ declare const __non_webpack_require__: NodeRequire;
63
+ const mainModule = __non_webpack_require__.main;
64
+ const moduleFilename = mainModule && mainModule.filename || '';
65
+ if (moduleFilename === __filename || moduleFilename.includes('iisnode')) {
66
+ run();
67
+ }
68
+
69
+ export default <% if (standalone) { %>bootstrap<% } else { %><%= rootModuleClassName %><% } %>;
@@ -0,0 +1,7 @@
1
+ import { bootstrapApplication } from '@angular/platform-browser';
2
+ import { <%= appSymbolName %> } from './app/<%= appFileName %>';
3
+ import { config } from './app/app.config.server';
4
+
5
+ const bootstrap = () => bootstrapApplication(<%= appSymbolName %>, config);
6
+
7
+ export default bootstrap;
@@ -0,0 +1,11 @@
1
+ import { mergeApplicationConfig, ApplicationConfig } from '@angular/core';
2
+ import { provideServerRendering } from '@angular/ssr';
3
+ import { appConfig } from './app.config';
4
+
5
+ const serverConfig: ApplicationConfig = {
6
+ providers: [
7
+ provideServerRendering()
8
+ ]
9
+ };
10
+
11
+ export const config = mergeApplicationConfig(appConfig, serverConfig);
@@ -2,24 +2,27 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.addDependencies = addDependencies;
4
4
  const devkit_1 = require("@nx/devkit");
5
- const semver_1 = require("semver");
6
5
  const version_utils_1 = require("../../utils/version-utils");
7
6
  function addDependencies(tree, isUsingApplicationBuilder) {
8
7
  const pkgVersions = (0, version_utils_1.versions)(tree);
9
- const { version: angularVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
10
8
  const dependencies = {
11
- '@angular/platform-server': (0, version_utils_1.getInstalledPackageVersionInfo)(tree, '@angular/platform-server')
12
- ?.version ?? pkgVersions.angularVersion,
9
+ '@angular/platform-server': (0, version_utils_1.getInstalledPackageVersion)(tree, '@angular/platform-server') ??
10
+ pkgVersions.angularVersion,
13
11
  express: pkgVersions.expressVersion,
14
12
  };
15
13
  const devDependencies = {
16
14
  '@types/express': pkgVersions.typesExpressVersion,
17
15
  };
18
- dependencies['@angular/ssr'] =
19
- (0, version_utils_1.getInstalledPackageVersionInfo)(tree, '@angular-devkit/build-angular')
20
- ?.version ?? pkgVersions.angularDevkitVersion;
21
- if (!isUsingApplicationBuilder && (0, semver_1.gte)(angularVersion, '17.1.0')) {
16
+ const angularDevkitVersion = (0, version_utils_1.getInstalledAngularDevkitVersion)(tree) ?? pkgVersions.angularDevkitVersion;
17
+ dependencies['@angular/ssr'] = angularDevkitVersion;
18
+ if (!isUsingApplicationBuilder) {
22
19
  devDependencies['browser-sync'] = pkgVersions.browserSyncVersion;
23
20
  }
21
+ else {
22
+ const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
23
+ if (angularMajorVersion >= 20) {
24
+ dependencies['@angular-devkit/build-angular'] = angularDevkitVersion;
25
+ }
26
+ }
24
27
  (0, devkit_1.addDependenciesToPackageJson)(tree, dependencies, devDependencies);
25
28
  }
@@ -14,9 +14,16 @@ function addHydration(tree, options) {
14
14
  tsModule = (0, ensure_typescript_1.ensureTypescript)();
15
15
  tsquery = require('@phenomnomnominal/tsquery').tsquery;
16
16
  }
17
- const pathToClientConfigFile = options.standalone
18
- ? (0, devkit_1.joinPathFragments)(projectConfig.sourceRoot, 'app/app.config.ts')
19
- : (0, devkit_1.joinPathFragments)(projectConfig.sourceRoot, 'app/app.module.ts');
17
+ let pathToClientConfigFile;
18
+ if (options.standalone) {
19
+ pathToClientConfigFile = (0, devkit_1.joinPathFragments)(projectConfig.sourceRoot, 'app/app.config.ts');
20
+ }
21
+ else {
22
+ pathToClientConfigFile = (0, devkit_1.joinPathFragments)(projectConfig.sourceRoot, 'app/app.module.ts');
23
+ if (!tree.exists(pathToClientConfigFile)) {
24
+ pathToClientConfigFile = (0, devkit_1.joinPathFragments)(projectConfig.sourceRoot, 'app/app-module.ts');
25
+ }
26
+ }
20
27
  const sourceText = tree.read(pathToClientConfigFile, 'utf-8');
21
28
  let sourceFile = tsModule.createSourceFile(pathToClientConfigFile, sourceText, tsModule.ScriptTarget.Latest, true);
22
29
  const provideClientHydrationCallExpression = tsquery(sourceFile, 'ObjectLiteralExpression PropertyAssignment:has(Identifier[name=providers]) ArrayLiteralExpression CallExpression:has(Identifier[name=provideClientHydration])')[0];
@@ -14,8 +14,13 @@ function addServerFile(tree, options) {
14
14
  const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
15
15
  const baseFilesPath = (0, path_1.join)(__dirname, '..', 'files');
16
16
  let pathToFiles;
17
- if (angularMajorVersion >= 19) {
18
- pathToFiles = (0, path_1.join)(baseFilesPath, 'v19+', options.isUsingApplicationBuilder
17
+ if (angularMajorVersion >= 20) {
18
+ pathToFiles = (0, path_1.join)(baseFilesPath, 'v20+', options.isUsingApplicationBuilder
19
+ ? 'application-builder'
20
+ : 'server-builder', 'server');
21
+ }
22
+ else if (angularMajorVersion === 19) {
23
+ pathToFiles = (0, path_1.join)(baseFilesPath, 'v19', options.isUsingApplicationBuilder
19
24
  ? 'application-builder' +
20
25
  (options.serverRouting ? '' : '-common-engine')
21
26
  : 'server-builder', 'server');
@@ -3,8 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateSSRFiles = generateSSRFiles;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const path_1 = require("path");
6
- const version_utils_1 = require("../../utils/version-utils");
7
6
  const semver_1 = require("semver");
7
+ const app_components_info_1 = require("../../utils/app-components-info");
8
+ const artifact_types_1 = require("../../utils/artifact-types");
9
+ const version_utils_1 = require("../../utils/version-utils");
8
10
  function generateSSRFiles(tree, options) {
9
11
  const project = (0, devkit_1.readProjectConfiguration)(tree, options.project);
10
12
  if (project.targets.server ||
@@ -16,8 +18,13 @@ function generateSSRFiles(tree, options) {
16
18
  const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
17
19
  const baseFilesPath = (0, path_1.join)(__dirname, '..', 'files');
18
20
  let pathToFiles;
19
- if (angularMajorVersion >= 19) {
20
- pathToFiles = (0, path_1.join)(baseFilesPath, 'v19+', options.isUsingApplicationBuilder
21
+ if (angularMajorVersion >= 20) {
22
+ pathToFiles = (0, path_1.join)(baseFilesPath, 'v20+', options.isUsingApplicationBuilder
23
+ ? 'application-builder'
24
+ : 'server-builder', options.standalone ? 'standalone-src' : 'ngmodule-src');
25
+ }
26
+ else if (angularMajorVersion === 19) {
27
+ pathToFiles = (0, path_1.join)(baseFilesPath, 'v19', options.isUsingApplicationBuilder
21
28
  ? 'application-builder'
22
29
  : 'server-builder', options.standalone ? 'standalone-src' : 'ngmodule-src');
23
30
  }
@@ -29,14 +36,20 @@ function generateSSRFiles(tree, options) {
29
36
  const cleanedSsrVersion = ssrVersion
30
37
  ? (0, semver_1.clean)(ssrVersion) ?? (0, semver_1.coerce)(ssrVersion).version
31
38
  : null;
39
+ const componentType = (0, artifact_types_1.getComponentType)(tree);
40
+ const appComponentInfo = (0, app_components_info_1.getAppComponentInfo)(tree, componentType ? `.${componentType}` : '', project);
41
+ const moduleTypeSeparator = (0, artifact_types_1.getModuleTypeSeparator)(tree);
32
42
  (0, devkit_1.generateFiles)(tree, pathToFiles, sourceRoot, {
33
43
  ...options,
34
44
  provideServerRoutingFn: !cleanedSsrVersion || (0, semver_1.gte)(cleanedSsrVersion, '19.2.0')
35
45
  ? 'provideServerRouting'
36
46
  : 'provideServerRoutesConfig',
47
+ appFileName: appComponentInfo.extensionlessFileName,
48
+ appSymbolName: appComponentInfo.symbolName,
49
+ moduleTypeSeparator,
37
50
  tpl: '',
38
51
  });
39
- if (angularMajorVersion >= 19 && !options.serverRouting) {
52
+ if (angularMajorVersion === 19 && !options.serverRouting) {
40
53
  tree.delete((0, devkit_1.joinPathFragments)(sourceRoot, 'app/app.routes.server.ts'));
41
54
  }
42
55
  }
@@ -9,6 +9,14 @@ function setServerTsConfigOptionsForApplicationBuilder(tree, options) {
9
9
  const { targets } = (0, devkit_1.readProjectConfiguration)(tree, options.project);
10
10
  const tsConfigPath = targets.build.options.tsConfig;
11
11
  (0, devkit_1.updateJson)(tree, tsConfigPath, (json) => {
12
+ json.compilerOptions ??= {};
13
+ const types = new Set(json.compilerOptions.types ?? []);
14
+ types.add('node');
15
+ json.compilerOptions.types = Array.from(types);
16
+ if (json.include?.includes('src/**/*.ts')) {
17
+ // server file is already included, no need to add it
18
+ return json;
19
+ }
12
20
  const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
13
21
  const files = new Set(json.files ?? []);
14
22
  files.add((0, devkit_1.joinPathFragments)('src', options.main));
@@ -19,10 +27,6 @@ function setServerTsConfigOptionsForApplicationBuilder(tree, options) {
19
27
  files.add((0, devkit_1.joinPathFragments)(options.serverFileName));
20
28
  }
21
29
  json.files = Array.from(files);
22
- json.compilerOptions ??= {};
23
- const types = new Set(json.compilerOptions.types ?? []);
24
- types.add('node');
25
- json.compilerOptions.types = Array.from(types);
26
30
  return json;
27
31
  });
28
32
  }
@@ -34,8 +38,11 @@ function generateTsConfigServerJsonForBrowserBuilder(tree, options) {
34
38
  !!packageJson.devDependencies?.['@angular/localize'];
35
39
  const baseFilesPath = (0, path_1.join)(__dirname, '..', 'files');
36
40
  let pathToFiles;
37
- if (angularMajorVersion >= 19) {
38
- pathToFiles = (0, path_1.join)(baseFilesPath, 'v19+', 'server-builder', 'root');
41
+ if (angularMajorVersion >= 20) {
42
+ pathToFiles = (0, path_1.join)(baseFilesPath, 'v20+', 'server-builder', 'root');
43
+ }
44
+ else if (angularMajorVersion === 19) {
45
+ pathToFiles = (0, path_1.join)(baseFilesPath, 'v19', 'server-builder', 'root');
39
46
  }
40
47
  else {
41
48
  pathToFiles = (0, path_1.join)(baseFilesPath, 'pre-v19', 'root');
@@ -46,4 +53,23 @@ function generateTsConfigServerJsonForBrowserBuilder(tree, options) {
46
53
  hasLocalizePackage,
47
54
  tpl: '',
48
55
  });
56
+ (0, devkit_1.updateJson)(tree, (0, devkit_1.joinPathFragments)(project.root, 'tsconfig.json'), (json) => {
57
+ json.references ??= [];
58
+ json.references.push({
59
+ path: (0, devkit_1.joinPathFragments)(project.root, 'tsconfig.server.json'),
60
+ });
61
+ return json;
62
+ });
63
+ if (angularMajorVersion >= 20) {
64
+ (0, devkit_1.updateJson)(tree, options.buildTargetTsConfigPath, (json) => {
65
+ const exclude = new Set(json.exclude ?? []);
66
+ exclude.add(`src/${options.main}`);
67
+ exclude.add(`src/${options.serverFileName}`);
68
+ if (options.standalone) {
69
+ exclude.add('src/app/app.config.server.ts');
70
+ }
71
+ json.exclude = Array.from(exclude);
72
+ return json;
73
+ });
74
+ }
49
75
  }
@@ -6,13 +6,13 @@ const prompt_1 = require("@nx/devkit/src/generators/prompt");
6
6
  const ast_utils_1 = require("../../../utils/nx-devkit/ast-utils");
7
7
  const version_utils_1 = require("../../utils/version-utils");
8
8
  async function normalizeOptions(tree, options) {
9
- const { targets } = (0, devkit_1.readProjectConfiguration)(tree, options.project);
9
+ const { targets, root } = (0, devkit_1.readProjectConfiguration)(tree, options.project);
10
10
  const isUsingApplicationBuilder = targets.build.executor === '@angular-devkit/build-angular:application' ||
11
11
  targets.build.executor === '@angular/build:application' ||
12
12
  targets.build.executor === '@nx/angular:application';
13
13
  if (options.serverRouting === undefined && isUsingApplicationBuilder) {
14
14
  const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
15
- if (angularMajorVersion >= 19) {
15
+ if (angularMajorVersion === 19) {
16
16
  options.serverRouting = await (0, prompt_1.promptWhenInteractive)({
17
17
  type: 'confirm',
18
18
  name: 'serverRouting',
@@ -21,7 +21,7 @@ async function normalizeOptions(tree, options) {
21
21
  }, { serverRouting: false }).then(({ serverRouting }) => serverRouting);
22
22
  }
23
23
  else {
24
- options.serverRouting = false;
24
+ options.serverRouting = angularMajorVersion >= 20;
25
25
  }
26
26
  }
27
27
  else if (options.serverRouting !== undefined &&
@@ -42,5 +42,7 @@ async function normalizeOptions(tree, options) {
42
42
  hydration: options.hydration ?? true,
43
43
  serverRouting: options.serverRouting,
44
44
  isUsingApplicationBuilder,
45
+ buildTargetTsConfigPath: targets.build.options?.tsConfig ??
46
+ (0, devkit_1.joinPathFragments)(root, 'tsconfig.app.json'),
45
47
  };
46
48
  }
@@ -21,6 +21,11 @@ function updateProjectConfigForApplicationBuilder(tree, options) {
21
21
  }
22
22
  else {
23
23
  outputPath = outputPath.base;
24
+ if (buildTarget.outputs && buildTarget.outputs.length > 0) {
25
+ buildTarget.outputs = buildTarget.outputs.map((output) => output === '{options.outputPath.base}'
26
+ ? '{options.outputPath}'
27
+ : output);
28
+ }
24
29
  }
25
30
  }
26
31
  const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
@@ -8,8 +8,8 @@ function validateOptions(tree, options) {
8
8
  validateProject(tree, options.project);
9
9
  validateBuildTarget(tree, options.project);
10
10
  const { major: angularMajorVersion, version: angularVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
11
- if (angularMajorVersion < 19 && options.serverRouting) {
12
- throw new Error(`The "serverRouting" option is only supported in Angular versions >= 19.0.0. You are using Angular ${angularVersion}.`);
11
+ if (angularMajorVersion !== 19 && options.serverRouting !== undefined) {
12
+ throw new Error(`The "serverRouting" option is only supported in Angular versions 19.x.x. You are using Angular ${angularVersion}.`);
13
13
  }
14
14
  }
15
15
  function validateProject(tree, project) {
@@ -15,4 +15,5 @@ export interface Schema {
15
15
 
16
16
  export interface NormalizedGeneratorOptions extends Schema {
17
17
  isUsingApplicationBuilder: boolean;
18
+ buildTargetTsConfigPath: string;
18
19
  }
@@ -53,7 +53,7 @@
53
53
  "default": true
54
54
  },
55
55
  "serverRouting": {
56
- "description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview). _Note: this is only supported in Angular versions >= 19.0.0_.",
56
+ "description": "Creates a server application using the Server Routing and App Engine APIs for application using the `application` builder (Developer Preview). _Note: this is only supported in Angular versions 19.x.x_. From Angular 20 onwards, SSR will always enable server routing when using the `application` builder.",
57
57
  "type": "boolean"
58
58
  },
59
59
  "skipFormat": {