@nx/angular 21.1.2 → 21.2.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 (271) hide show
  1. package/README.md +4 -4
  2. package/fesm2022/nx-angular-mf.mjs +10 -3
  3. package/fesm2022/nx-angular-mf.mjs.map +1 -1
  4. package/fesm2022/nx-angular.mjs.map +1 -1
  5. package/index.d.ts +2 -1
  6. package/mf/index.d.ts +71 -1
  7. package/migrations.json +106 -0
  8. package/ng-package.json +0 -1
  9. package/package.json +28 -16
  10. package/plugins/component-testing.js +8 -3
  11. package/src/builders/dev-server/dev-server.impl.js +4 -7
  12. package/src/builders/dev-server/lib/normalize-options.js +0 -6
  13. package/src/builders/dev-server/lib/validate-options.js +0 -4
  14. package/src/builders/dev-server/schema.d.ts +3 -15
  15. package/src/builders/dev-server/schema.json +3 -9
  16. package/src/builders/webpack-browser/webpack-browser.impl.js +2 -0
  17. package/src/builders/webpack-server/webpack-server.impl.d.ts +3 -1
  18. package/src/builders/webpack-server/webpack-server.impl.js +2 -0
  19. package/src/executors/application/application.impl.d.ts +2 -2
  20. package/src/executors/application/application.impl.js +11 -6
  21. package/src/executors/application/schema.d.ts +1 -1
  22. package/src/executors/application/schema.json +21 -10
  23. package/src/executors/application/utils/normalize-options.js +8 -1
  24. package/src/executors/application/utils/validate-options.js +10 -40
  25. package/src/executors/extract-i18n/extract-i18n.impl.js +6 -14
  26. package/src/executors/extract-i18n/schema.d.ts +1 -6
  27. package/src/executors/extract-i18n/schema.json +5 -0
  28. package/src/executors/extract-i18n/utils/validate-options.d.ts +2 -0
  29. package/src/executors/extract-i18n/utils/validate-options.js +13 -0
  30. package/src/executors/module-federation-dev-server/lib/normalize-options.js +1 -7
  31. package/src/executors/module-federation-dev-server/schema.d.ts +3 -15
  32. package/src/executors/module-federation-dev-server/schema.json +2 -15
  33. package/src/executors/module-federation-ssr-dev-server/module-federation-ssr-dev-server.impl.js +10 -8
  34. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/entry-point.d.ts +6 -3
  35. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/entry-point.js +46 -8
  36. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.di.d.ts +1 -1
  37. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.di.js +3 -3
  38. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.transform.d.ts +2 -2
  39. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.transform.js +36 -7
  40. package/src/executors/ng-packagr-lite/schema.json +2 -3
  41. package/src/executors/package/package.impl.js +1 -5
  42. package/src/executors/package/schema.d.ts +3 -1
  43. package/src/executors/package/schema.json +2 -3
  44. package/src/executors/utilities/builder-package.d.ts +1 -0
  45. package/src/executors/utilities/builder-package.js +11 -0
  46. package/src/executors/utilities/esbuild-extensions.d.ts +2 -1
  47. package/src/executors/utilities/ng-packagr/package-imports.d.ts +3 -1
  48. package/src/executors/utilities/ng-packagr/package-imports.js +2 -2
  49. package/src/executors/utilities/ng-packagr/pre-v19/stylesheet-processor.d.ts +2 -24
  50. package/src/executors/utilities/ng-packagr/pre-v19/stylesheet-processor.js +40 -107
  51. package/src/executors/utilities/ng-packagr/stylesheet-processor.di.js +4 -8
  52. package/src/executors/utilities/ng-packagr/v19+/stylesheet-processor.d.ts +1 -1
  53. package/src/executors/utilities/ng-packagr/v19+/stylesheet-processor.js +18 -11
  54. package/src/generators/add-linting/add-linting.js +8 -0
  55. package/src/generators/application/application.js +22 -8
  56. package/src/generators/application/files/base/tsconfig.app.json__tpl__ +10 -1
  57. package/src/generators/application/files/base/tsconfig.json__tpl__ +7 -8
  58. package/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.spec.ts__tpl__ +28 -0
  59. package/src/generators/application/files/ng-module/src/app/{app.component.ts__tpl__ → app__componentFileSuffix__.ts__tpl__} +4 -4
  60. package/src/generators/application/files/ng-module/src/app/app__moduleTypeSeparator__module.ts__tpl__ +17 -0
  61. package/src/generators/application/files/ng-module/src/main.ts__tpl__ +11 -3
  62. package/src/generators/application/files/nx-welcome/claimed/ng-module/src/app/{nx-welcome.component.ts__tpl__ → nx-welcome__componentFileSuffix__.ts__tpl__} +1 -1
  63. package/src/generators/application/files/nx-welcome/claimed/standalone/src/app/{nx-welcome.component.ts__tpl__ → nx-welcome__componentFileSuffix__.ts__tpl__} +1 -1
  64. 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
  65. package/src/generators/application/files/nx-welcome/not-configured/standalone/src/app/{nx-welcome.component.ts__tpl__ → nx-welcome__componentFileSuffix__.ts__tpl__} +1 -1
  66. package/src/generators/application/files/nx-welcome/unclaimed/ng-module/src/app/{nx-welcome.component.ts__tpl__ → nx-welcome__componentFileSuffix__.ts__tpl__} +1 -1
  67. package/src/generators/application/files/nx-welcome/unclaimed/standalone/src/app/{nx-welcome.component.ts__tpl__ → nx-welcome__componentFileSuffix__.ts__tpl__} +1 -1
  68. package/src/generators/application/files/standalone-components/src/app/app.config.ts__tpl__ +6 -2
  69. package/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.spec.ts__tpl__ +27 -0
  70. package/src/generators/application/files/standalone-components/src/app/{app.component.ts__tpl__ → app__componentFileSuffix__.ts__tpl__} +6 -6
  71. package/src/generators/application/files/standalone-components/src/main.ts__tpl__ +2 -2
  72. package/src/generators/application/lib/create-files.d.ts +1 -1
  73. package/src/generators/application/lib/create-files.js +18 -19
  74. package/src/generators/application/lib/create-project.d.ts +1 -1
  75. package/src/generators/application/lib/create-project.js +119 -26
  76. package/src/generators/application/lib/enable-strict-type-checking.js +4 -2
  77. package/src/generators/application/lib/index.d.ts +1 -2
  78. package/src/generators/application/lib/index.js +1 -2
  79. package/src/generators/application/lib/set-generator-defaults.js +1 -0
  80. package/src/generators/application/lib/{update-editor-tsconfig.d.ts → update-tsconfig-files.d.ts} +1 -1
  81. package/src/generators/application/lib/update-tsconfig-files.js +93 -0
  82. package/src/generators/application/schema.json +1 -1
  83. package/src/generators/component/component.js +13 -2
  84. package/src/generators/component/files/__fileName__.ts__tpl__ +1 -1
  85. package/src/generators/component/lib/component.js +11 -1
  86. package/src/generators/component/lib/module.d.ts +7 -2
  87. package/src/generators/component/lib/module.js +7 -5
  88. package/src/generators/component/lib/normalize-options.js +7 -3
  89. package/src/generators/component/schema.d.ts +1 -0
  90. package/src/generators/component/schema.json +6 -2
  91. package/src/generators/convert-to-application-executor/convert-to-application-executor.js +37 -24
  92. package/src/generators/convert-to-rspack/convert-to-rspack.d.ts +1 -1
  93. package/src/generators/convert-to-rspack/convert-to-rspack.js +173 -28
  94. package/src/generators/convert-to-rspack/lib/get-custom-webpack-config.js +1 -1
  95. package/src/generators/directive/directive.js +1 -1
  96. package/src/generators/directive/lib/normalize-options.js +7 -2
  97. package/src/generators/directive/schema.d.ts +1 -0
  98. package/src/generators/directive/schema.json +10 -2
  99. package/src/generators/host/host.js +21 -1
  100. package/src/generators/host/schema.d.ts +1 -0
  101. package/src/generators/host/schema.json +7 -1
  102. package/src/generators/init/init.js +1 -1
  103. package/src/generators/library/files/base/tsconfig.json__tpl__ +5 -5
  104. package/src/generators/library/files/ng-module/src/index.ts__tpl__ +1 -1
  105. package/src/generators/library/files/standalone-components/src/lib/lib.routes.ts__tpl__ +2 -2
  106. package/src/generators/library/lib/add-standalone-component.js +1 -0
  107. package/src/generators/library/lib/create-files.js +10 -3
  108. package/src/generators/library/lib/normalize-options.d.ts +3 -3
  109. package/src/generators/library/lib/normalize-options.js +6 -1
  110. package/src/generators/library/lib/normalized-schema.d.ts +2 -0
  111. package/src/generators/library/lib/set-generator-defaults.js +1 -0
  112. package/src/generators/library/lib/update-tsconfig-files.d.ts +3 -0
  113. package/src/generators/library/lib/update-tsconfig-files.js +98 -0
  114. package/src/generators/library/library.js +19 -33
  115. package/src/generators/library-secondary-entry-point/files/src/index.ts__tmpl__ +1 -1
  116. package/src/generators/library-secondary-entry-point/lib/add-files.js +2 -1
  117. package/src/generators/library-secondary-entry-point/lib/normalize-options.d.ts +2 -2
  118. package/src/generators/library-secondary-entry-point/lib/normalize-options.js +3 -0
  119. package/src/generators/library-secondary-entry-point/schema.d.ts +1 -0
  120. package/src/generators/move/lib/update-module-name.js +17 -10
  121. package/src/generators/move/lib/update-secondary-entry-points.js +0 -3
  122. package/src/generators/ng-add/migrators/builders/angular-devkit-karma.migrator.js +1 -1
  123. package/src/generators/ng-add/migrators/projects/app.migrator.js +43 -8
  124. package/src/generators/ngrx/schema.json +3 -3
  125. package/src/generators/ngrx-root-store/lib/normalize-options.js +9 -2
  126. package/src/generators/pipe/lib/normalize-options.js +4 -0
  127. package/src/generators/pipe/pipe.js +1 -1
  128. package/src/generators/pipe/schema.d.ts +1 -0
  129. package/src/generators/pipe/schema.json +11 -2
  130. package/src/generators/remote/files/standalone/src/bootstrap.server.ts__tmpl__ +4 -4
  131. package/src/generators/remote/lib/update-ssr-setup.js +5 -0
  132. package/src/generators/remote/remote.js +23 -0
  133. package/src/generators/remote/schema.d.ts +1 -0
  134. package/src/generators/remote/schema.json +7 -1
  135. package/src/generators/scam/lib/convert-component-to-scam.js +1 -3
  136. package/src/generators/scam/lib/normalize-options.js +11 -3
  137. package/src/generators/scam/schema.d.ts +1 -0
  138. package/src/generators/scam/schema.json +1 -2
  139. package/src/generators/scam-directive/lib/convert-directive-to-scam.js +1 -3
  140. package/src/generators/scam-directive/lib/normalize-options.js +11 -2
  141. package/src/generators/scam-directive/schema.d.ts +2 -0
  142. package/src/generators/scam-directive/schema.json +10 -2
  143. package/src/generators/scam-pipe/lib/convert-pipe-to-scam.js +1 -3
  144. package/src/generators/scam-pipe/lib/normalize-options.js +8 -0
  145. package/src/generators/scam-pipe/schema.d.ts +2 -0
  146. package/src/generators/scam-pipe/schema.json +5 -0
  147. package/src/generators/setup-mf/files/entry-module-files/{entry.module.ts__tmpl__ → __entryModuleFileName__.ts__tmpl__} +4 -4
  148. package/src/generators/setup-mf/files/entry-module-files/entry.routes.ts__tmpl__ +2 -2
  149. package/src/generators/setup-mf/files/entry-module-files/{entry.component.ts__tmpl__ → entry__componentFileSuffix__.ts__tmpl__} +1 -1
  150. package/src/generators/setup-mf/files/host-files/__appFileName__.spec.ts__tmpl__ +43 -0
  151. package/src/generators/setup-mf/files/standalone-entry-component-files/entry.routes.ts__tmpl__ +2 -2
  152. package/src/generators/setup-mf/files/standalone-entry-component-files/{entry.component.ts__tmpl__ → entry__componentFileSuffix__.ts__tmpl__} +3 -3
  153. package/src/generators/setup-mf/files/ts-webpack/module-federation.config.ts__tmpl__ +1 -1
  154. package/src/generators/setup-mf/files/ts-webpack/tsconfig.lint.json__tmpl__ +1 -1
  155. package/src/generators/setup-mf/files/webpack/module-federation.config.js__tmpl__ +1 -1
  156. package/src/generators/setup-mf/lib/add-remote-entry.d.ts +2 -2
  157. package/src/generators/setup-mf/lib/add-remote-entry.js +9 -3
  158. package/src/generators/setup-mf/lib/add-remote-to-host.js +11 -1
  159. package/src/generators/setup-mf/lib/fix-bootstrap.d.ts +2 -2
  160. package/src/generators/setup-mf/lib/fix-bootstrap.js +4 -4
  161. package/src/generators/setup-mf/lib/generate-config.d.ts +2 -2
  162. package/src/generators/setup-mf/lib/generate-config.js +1 -0
  163. package/src/generators/setup-mf/lib/normalize-options.d.ts +1 -1
  164. package/src/generators/setup-mf/lib/normalize-options.js +13 -0
  165. package/src/generators/setup-mf/lib/remove-dead-code-from-remote.d.ts +2 -2
  166. package/src/generators/setup-mf/lib/remove-dead-code-from-remote.js +18 -14
  167. package/src/generators/setup-mf/lib/setup-host-if-dynamic.js +1 -5
  168. package/src/generators/setup-mf/lib/setup-tspath-for-remote.d.ts +2 -2
  169. package/src/generators/setup-mf/lib/setup-tspath-for-remote.js +1 -1
  170. package/src/generators/setup-mf/lib/update-host-app-routes.d.ts +2 -2
  171. package/src/generators/setup-mf/lib/update-host-app-routes.js +12 -9
  172. package/src/generators/setup-mf/lib/update-tsconfig.d.ts +2 -2
  173. package/src/generators/setup-mf/lib/update-tsconfig.js +5 -5
  174. package/src/generators/setup-mf/schema.d.ts +7 -0
  175. package/src/generators/setup-mf/setup-mf.d.ts +2 -2
  176. package/src/generators/setup-mf/setup-mf.js +16 -6
  177. package/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/__main__ +1 -0
  178. package/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/app/__rootModuleFileName__ +12 -0
  179. package/src/generators/setup-ssr/files/v20+/application-builder/ngmodule-src/app/app.routes.server.ts__tpl__ +8 -0
  180. package/src/generators/setup-ssr/files/v20+/application-builder/server/__serverFileName__ +66 -0
  181. package/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/__main__ +7 -0
  182. package/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/app/app.config.server.ts__tpl__ +12 -0
  183. package/src/generators/setup-ssr/files/v20+/application-builder/standalone-src/app/app.routes.server.ts__tpl__ +8 -0
  184. package/src/generators/setup-ssr/files/v20+/server-builder/ngmodule-src/__main__ +1 -0
  185. package/src/generators/setup-ssr/files/v20+/server-builder/ngmodule-src/app/__rootModuleFileName__ +14 -0
  186. package/src/generators/setup-ssr/files/v20+/server-builder/root/tsconfig.server.json.template +18 -0
  187. package/src/generators/setup-ssr/files/v20+/server-builder/server/__serverFileName__ +69 -0
  188. package/src/generators/setup-ssr/files/v20+/server-builder/standalone-src/__main__ +7 -0
  189. package/src/generators/setup-ssr/files/v20+/server-builder/standalone-src/app/app.config.server.ts.template +11 -0
  190. package/src/generators/setup-ssr/lib/add-dependencies.js +11 -8
  191. package/src/generators/setup-ssr/lib/add-hydration.js +10 -3
  192. package/src/generators/setup-ssr/lib/add-server-file.js +7 -2
  193. package/src/generators/setup-ssr/lib/generate-files.js +17 -4
  194. package/src/generators/setup-ssr/lib/generate-server-ts-config.js +32 -6
  195. package/src/generators/setup-ssr/lib/normalize-options.js +5 -3
  196. package/src/generators/setup-ssr/lib/update-project-config.js +5 -0
  197. package/src/generators/setup-ssr/lib/validate-options.js +2 -2
  198. package/src/generators/setup-ssr/schema.d.ts +1 -0
  199. package/src/generators/setup-ssr/schema.json +1 -1
  200. package/src/generators/utils/add-jest.js +6 -1
  201. package/src/generators/utils/app-components-info.d.ts +9 -0
  202. package/src/generators/utils/app-components-info.js +39 -0
  203. package/src/generators/utils/artifact-types.d.ts +3 -0
  204. package/src/generators/utils/artifact-types.js +33 -0
  205. package/src/generators/utils/assert-mf-utils.d.ts +1 -0
  206. package/src/generators/utils/assert-mf-utils.js +11 -0
  207. package/src/generators/utils/ensure-angular-dependencies.js +6 -3
  208. package/src/generators/utils/export-scam.d.ts +1 -0
  209. package/src/generators/utils/export-scam.js +1 -2
  210. package/src/generators/utils/find-module.js +18 -13
  211. package/src/generators/utils/storybook-ast/component-info.js +40 -24
  212. package/src/generators/utils/storybook-ast/module-info.d.ts +1 -1
  213. package/src/generators/utils/storybook-ast/module-info.js +3 -8
  214. package/src/generators/utils/testing.js +28 -28
  215. package/src/generators/utils/version-utils.js +2 -2
  216. package/src/generators/web-worker/lib/add-snippet.js +3 -3
  217. package/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.d.ts +2 -0
  218. package/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.js +110 -0
  219. package/src/migrations/update-21-2-0/replace-provide-server-routing.d.ts +2 -0
  220. package/src/migrations/update-21-2-0/replace-provide-server-routing.js +103 -0
  221. package/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.d.ts +2 -0
  222. package/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.js +47 -0
  223. package/src/migrations/update-21-2-0/update-angular-cli.d.ts +3 -0
  224. package/src/migrations/update-21-2-0/update-angular-cli.js +23 -0
  225. package/src/migrations/update-21-2-0/update-module-resolution.d.ts +2 -0
  226. package/src/migrations/update-21-2-0/update-module-resolution.js +45 -0
  227. package/src/plugins/plugin.js +22 -13
  228. package/src/utils/backward-compatible-versions.d.ts +2 -2
  229. package/src/utils/backward-compatible-versions.js +22 -19
  230. package/src/utils/nx-devkit/ast-utils.js +17 -3
  231. package/src/utils/nx-devkit/testing.js +9 -9
  232. package/src/utils/targets.d.ts +2 -1
  233. package/src/utils/targets.js +6 -0
  234. package/src/utils/versions.d.ts +4 -3
  235. package/src/utils/versions.js +5 -4
  236. package/mf/mf.d.ts +0 -69
  237. package/src/generators/application/files/base-pre18/src/favicon.ico +0 -0
  238. package/src/generators/application/files/ng-module/src/app/app.component.spec.ts__tpl__ +0 -29
  239. package/src/generators/application/files/ng-module/src/app/app.module.ts__tpl__ +0 -17
  240. package/src/generators/application/files/standalone-components/src/app/app.component.__style__ +0 -0
  241. package/src/generators/application/files/standalone-components/src/app/app.component.spec.ts__tpl__ +0 -28
  242. package/src/generators/application/lib/set-app-strict-default.d.ts +0 -2
  243. package/src/generators/application/lib/set-app-strict-default.js +0 -13
  244. package/src/generators/application/lib/update-editor-tsconfig.js +0 -21
  245. package/src/generators/library/lib/enable-strict-type-checking.d.ts +0 -7
  246. package/src/generators/library/lib/enable-strict-type-checking.js +0 -47
  247. package/src/generators/library/lib/update-tsconfig.d.ts +0 -3
  248. package/src/generators/library/lib/update-tsconfig.js +0 -36
  249. package/src/generators/setup-mf/files/host-files/app.component.spec.ts__tmpl__ +0 -47
  250. /package/src/generators/application/files/{base-18+ → base}/public/favicon.ico +0 -0
  251. /package/src/generators/application/files/{base-pre18/src/assets/.gitkeep__tpl__ → ng-module/src/app/app__componentFileSuffix__.__style__} +0 -0
  252. /package/src/generators/application/files/ng-module/src/app/{app.component.html__tpl__ → app__componentFileSuffix__.html__tpl__} +0 -0
  253. /package/src/generators/application/files/{ng-module/src/app/app.component.__style__ → standalone-components/src/app/app__componentFileSuffix__.__style__} +0 -0
  254. /package/src/generators/application/files/standalone-components/src/app/{app.component.html__tpl__ → app__componentFileSuffix__.html__tpl__} +0 -0
  255. /package/src/generators/component/files/{__fileName__.html__tpl__ → __fileName____ngext__.html__tpl__} +0 -0
  256. /package/src/generators/library/files/ng-module/src/lib/{__libFileName__.module.ts__tpl__ → __libFileName____moduleTypeSeparator__module.ts__tpl__} +0 -0
  257. /package/src/generators/library-secondary-entry-point/files/src/lib/{__fileName__.module.ts__tmpl__ → __fileName____moduleTypeSeparator__module.ts__tmpl__} +0 -0
  258. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder/ngmodule-src/__main__ +0 -0
  259. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder/ngmodule-src/app/__rootModuleFileName__ +0 -0
  260. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder/ngmodule-src/app/app.routes.server.ts__tpl__ +0 -0
  261. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder/server/__serverFileName__ +0 -0
  262. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder/standalone-src/__main__ +0 -0
  263. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder/standalone-src/app/app.config.server.ts__tpl__ +0 -0
  264. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder/standalone-src/app/app.routes.server.ts__tpl__ +0 -0
  265. /package/src/generators/setup-ssr/files/{v19+ → v19}/application-builder-common-engine/server/__serverFileName__ +0 -0
  266. /package/src/generators/setup-ssr/files/{v19+ → v19}/server-builder/ngmodule-src/__main__ +0 -0
  267. /package/src/generators/setup-ssr/files/{v19+ → v19}/server-builder/ngmodule-src/app/__rootModuleFileName__ +0 -0
  268. /package/src/generators/setup-ssr/files/{v19+ → v19}/server-builder/root/tsconfig.server.json.template +0 -0
  269. /package/src/generators/setup-ssr/files/{v19+ → v19}/server-builder/server/__serverFileName__ +0 -0
  270. /package/src/generators/setup-ssr/files/{v19+ → v19}/server-builder/standalone-src/__main__ +0 -0
  271. /package/src/generators/setup-ssr/files/{v19+ → v19}/server-builder/standalone-src/app/app.config.server.ts.template +0 -0
@@ -810,4 +810,4 @@ nx g &#64;nx/angular:component ui/src/lib/button</pre>
810
810
  styles: [],
811
811
  encapsulation: ViewEncapsulation.None,
812
812
  })
813
- export class NxWelcomeComponent {}
813
+ export class NxWelcome<%= componentType %> {}
@@ -1,7 +1,11 @@
1
- import { ApplicationConfig<% if (useEventCoalescing) { %>, provideZoneChangeDetection<% } %> } from '@angular/core';<% if (routing) { %>
1
+ import { ApplicationConfig<% if (provideGlobalErrorListener) { %>, provideBrowserGlobalErrorListeners<% } %>, provideZoneChangeDetection } from '@angular/core';<% if (routing) { %>
2
2
  import { provideRouter } from '@angular/router';
3
3
  import { appRoutes } from './app.routes';<% } %>
4
4
 
5
5
  export const appConfig: ApplicationConfig = {
6
- providers: [<% if (useEventCoalescing) { %>provideZoneChangeDetection({ eventCoalescing: true }), <% } %><% if (routing) { %>provideRouter(appRoutes) <% } %>]
6
+ providers: [<% if (provideGlobalErrorListener) { %>
7
+ provideBrowserGlobalErrorListeners(),<% } %>
8
+ provideZoneChangeDetection({ eventCoalescing: true })<% if (routing) { %>,
9
+ provideRouter(appRoutes)<% } %>
10
+ ]
7
11
  };
@@ -0,0 +1,27 @@
1
+ import { TestBed } from '@angular/core/testing';
2
+ import { App<%= componentType %> } from './app<%= componentFileSuffix %>';<% if(!minimal) { %>
3
+ import { NxWelcome<%= componentType %> } from './nx-welcome<%= componentFileSuffix %>';<% } %><% if(routing) { %>
4
+ import { RouterModule } from '@angular/router';<% } %>
5
+
6
+ describe('App<%= componentType %>', () => {
7
+ beforeEach(async () => {
8
+ await TestBed.configureTestingModule({
9
+ imports: [App<%= componentType %><% if(!minimal) { %>, NxWelcome<%= componentType %><% } %><% if(routing) { %>, RouterModule.forRoot([])<% } %>],
10
+ }).compileComponents();
11
+ });
12
+
13
+ it('should render title', () => {
14
+ const fixture = TestBed.createComponent(App<%= componentType %>);
15
+ fixture.detectChanges();
16
+ const compiled = fixture.nativeElement as HTMLElement;
17
+ expect(compiled.querySelector('h1')?.textContent).toContain(
18
+ 'Welcome <%= appName %>'
19
+ );
20
+ });<% if(!minimal && angularMajorVersion < 20) { %>
21
+
22
+ it(`should have as title '<%= appName %>'`, () => {
23
+ const fixture = TestBed.createComponent(App<%= componentType %>);
24
+ const app = fixture.componentInstance;
25
+ expect(app.title).toEqual('<%= appName %>');
26
+ });<% } %>
27
+ });
@@ -1,17 +1,17 @@
1
1
  import { Component<% if(viewEncapsulation) { %>, ViewEncapsulation<% } %> } from '@angular/core';<% if(routing) { %>
2
2
  import { RouterModule } from '@angular/router';<% } %><% if(!minimal) { %>
3
- import { NxWelcomeComponent } from './nx-welcome.component';<% } %>
3
+ import { NxWelcome<%= componentType %> } from './nx-welcome<%= componentFileSuffix %>';<% } %>
4
4
 
5
5
  @Component({<% if (setStandaloneTrue) { %>
6
6
  standalone: true,<% } %>
7
- imports: [<% if(!minimal) { %>NxWelcomeComponent, <% } %><% if(routing) { %>RouterModule<% } %>],
7
+ imports: [<% if(!minimal) { %>NxWelcome<%= componentType %>, <% } %><% if(routing) { %>RouterModule<% } %>],
8
8
  selector: '<%= rootSelector %>',<% if(!inlineTemplate) { %>
9
- templateUrl: './app.component.html',<% } else { %>
9
+ templateUrl: './app<%= componentFileSuffix %>.html',<% } else { %>
10
10
  template: `<% if(minimal) { %><h1>Welcome <%= appName %></h1><% } else { %><<%= nxWelcomeSelector %>></<%= nxWelcomeSelector %>><% } %> <% if(routing) { %><router-outlet></router-outlet><% } %>`,<% } %><% if(!inlineStyle) { %>
11
- styleUrl: './app.component.<%= style %>',<% } else { %>
11
+ styleUrl: './app<%= componentFileSuffix %>.<%= style %>',<% } else { %>
12
12
  styles: ``,<% } %><% if(viewEncapsulation) { %>
13
13
  encapsulation: ViewEncapsulation.<%= viewEncapsulation %>,<% } %>
14
14
  })
15
- export class AppComponent {<% if(!minimal) { %>
16
- title = '<%= appName %>';
15
+ export class App<%= componentType %> {<% if(!minimal) { %>
16
+ <% if (angularMajorVersion >= 20) { %>protected <% } %>title = '<%= appName %>';
17
17
  <% } %>}
@@ -1,7 +1,7 @@
1
1
  import { bootstrapApplication } from '@angular/platform-browser';
2
2
  import { appConfig } from './app/app.config';
3
- import { AppComponent } from './app/app.component';
3
+ import { App<%= componentType %> } from './app/app<%= componentFileSuffix %>';
4
4
 
5
- bootstrapApplication(AppComponent, appConfig).catch((err) =>
5
+ bootstrapApplication(App<%= componentType %>, appConfig).catch((err) =>
6
6
  console.error(err)
7
7
  );
@@ -1,3 +1,3 @@
1
- import type { Tree } from '@nx/devkit';
1
+ import { type Tree } from '@nx/devkit';
2
2
  import type { NormalizedSchema } from './normalized-schema';
3
3
  export declare function createFiles(tree: Tree, options: NormalizedSchema, rootOffset: string): Promise<void>;
@@ -3,16 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createFiles = createFiles;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const js_1 = require("@nx/js");
6
- const semver_1 = require("semver");
6
+ const onboarding_1 = require("nx/src/nx-cloud/utilities/onboarding");
7
7
  const test_runners_1 = require("../../../utils/test-runners");
8
+ const artifact_types_1 = require("../../utils/artifact-types");
8
9
  const selector_1 = require("../../utils/selector");
9
10
  const update_project_root_tsconfig_1 = require("../../utils/update-project-root-tsconfig");
10
11
  const version_utils_1 = require("../../utils/version-utils");
11
- const onboarding_1 = require("nx/src/nx-cloud/utilities/onboarding");
12
12
  async function createFiles(tree, options, rootOffset) {
13
- const { major: angularMajorVersion, version: angularVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
14
- const isUsingApplicationBuilder = options.bundler === 'esbuild';
15
- const disableModernClassFieldsBehavior = (0, semver_1.lt)(angularVersion, '18.1.0-rc.0');
13
+ const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
16
14
  const rootSelector = `${options.prefix}-root`;
17
15
  (0, selector_1.validateHtmlSelector)(rootSelector);
18
16
  const nxWelcomeSelector = `${options.prefix}-nx-welcome`;
@@ -20,6 +18,9 @@ async function createFiles(tree, options, rootOffset) {
20
18
  const onBoardingStatus = await (0, onboarding_1.createNxCloudOnboardingURLForWelcomeApp)(tree, options.nxCloudToken);
21
19
  const connectCloudUrl = onBoardingStatus === 'unclaimed' &&
22
20
  (await (0, onboarding_1.getNxCloudAppOnBoardingUrl)(options.nxCloudToken));
21
+ const componentType = (0, artifact_types_1.getComponentType)(tree);
22
+ const componentFileSuffix = componentType ? `.${componentType}` : '';
23
+ const moduleTypeSeparator = (0, artifact_types_1.getModuleTypeSeparator)(tree);
23
24
  const substitutions = {
24
25
  rootSelector,
25
26
  appName: options.name,
@@ -34,13 +35,14 @@ async function createFiles(tree, options, rootOffset) {
34
35
  rootTsConfig: (0, devkit_1.joinPathFragments)(rootOffset, (0, js_1.getRootTsConfigFileName)(tree)),
35
36
  angularMajorVersion,
36
37
  rootOffset,
37
- isUsingApplicationBuilder,
38
- disableModernClassFieldsBehavior,
39
- useEventCoalescing: angularMajorVersion >= 18,
40
- useRouterTestingModule: angularMajorVersion < 18,
41
- // Angular v19 or higher defaults to true, while v18 or lower defaults to false
38
+ // Angular v19 or higher defaults to true, while lower versions default to false
42
39
  setStandaloneFalse: angularMajorVersion >= 19,
43
40
  setStandaloneTrue: angularMajorVersion < 19,
41
+ provideGlobalErrorListener: angularMajorVersion >= 20,
42
+ usePlatformBrowserDynamic: angularMajorVersion < 20,
43
+ componentType: componentType ? (0, devkit_1.names)(componentType).className : '',
44
+ componentFileSuffix,
45
+ moduleTypeSeparator,
44
46
  connectCloudUrl,
45
47
  tutorialUrl: options.standalone
46
48
  ? 'https://nx.dev/getting-started/tutorials/angular-standalone-tutorial?utm_source=nx-project'
@@ -49,11 +51,8 @@ async function createFiles(tree, options, rootOffset) {
49
51
  };
50
52
  const angularAppType = options.standalone ? 'standalone' : 'ng-module';
51
53
  (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, '../files/base'), options.appProjectRoot, substitutions);
52
- if (angularMajorVersion >= 18) {
53
- (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, '../files/base-18+'), options.appProjectRoot, substitutions);
54
- }
55
- else {
56
- (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, '../files/base-pre18'), options.appProjectRoot, substitutions);
54
+ if (angularMajorVersion >= 20) {
55
+ tree.delete((0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.editor.json'));
57
56
  }
58
57
  if (options.standalone) {
59
58
  (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, '../files/standalone-components'), options.appProjectRoot, substitutions);
@@ -67,15 +66,15 @@ async function createFiles(tree, options, rootOffset) {
67
66
  tree.delete((0, devkit_1.joinPathFragments)(options.appProjectRoot, '/src/app/app.routes.ts'));
68
67
  }
69
68
  if (options.skipTests || options.unitTestRunner === test_runners_1.UnitTestRunner.None) {
70
- tree.delete((0, devkit_1.joinPathFragments)(options.appProjectRoot, '/src/app/app.component.spec.ts'));
69
+ tree.delete((0, devkit_1.joinPathFragments)(options.appProjectRoot, `src/app/app${componentFileSuffix}.spec.ts`));
71
70
  }
72
71
  if (options.inlineTemplate) {
73
- tree.delete((0, devkit_1.joinPathFragments)(options.appProjectRoot, '/src/app/app.component.html'));
72
+ tree.delete((0, devkit_1.joinPathFragments)(options.appProjectRoot, `src/app/app${componentFileSuffix}.html`));
74
73
  }
75
74
  if (options.inlineStyle) {
76
- tree.delete((0, devkit_1.joinPathFragments)(options.appProjectRoot, `/src/app/app.component.${options.style}`));
75
+ tree.delete((0, devkit_1.joinPathFragments)(options.appProjectRoot, `src/app/app${componentFileSuffix}.${options.style}`));
77
76
  }
78
77
  if (options.minimal) {
79
- tree.delete((0, devkit_1.joinPathFragments)(options.appProjectRoot, 'src/app/nx-welcome.component.ts'));
78
+ tree.delete((0, devkit_1.joinPathFragments)(options.appProjectRoot, `src/app/nx-welcome${componentFileSuffix}.ts`));
80
79
  }
81
80
  }
@@ -1,3 +1,3 @@
1
- import { Tree } from '@nx/devkit';
1
+ import { type Tree } from '@nx/devkit';
2
2
  import type { NormalizedSchema } from './normalized-schema';
3
3
  export declare function createProject(tree: Tree, options: NormalizedSchema): void;
@@ -2,14 +2,117 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createProject = createProject;
4
4
  const devkit_1 = require("@nx/devkit");
5
- const version_utils_1 = require("../../utils/version-utils");
6
5
  const target_defaults_utils_1 = require("@nx/devkit/src/generators/target-defaults-utils");
6
+ const version_utils_1 = require("../../utils/version-utils");
7
7
  function createProject(tree, options) {
8
+ let project;
9
+ if (options.bundler === 'esbuild') {
10
+ project = createProjectForEsbuild(tree, options);
11
+ }
12
+ else {
13
+ project = createProjectForWebpack(tree, options);
14
+ }
15
+ (0, devkit_1.addProjectConfiguration)(tree, options.name, project);
16
+ }
17
+ function createProjectForEsbuild(tree, options) {
8
18
  const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
9
- const buildExecutor = options.bundler === 'webpack'
10
- ? '@angular-devkit/build-angular:browser'
19
+ const buildExecutor = angularMajorVersion >= 20
20
+ ? '@angular/build:application'
11
21
  : '@angular-devkit/build-angular:application';
12
- const buildMainOptionName = options.bundler === 'esbuild' ? 'browser' : 'main';
22
+ (0, target_defaults_utils_1.addBuildTargetDefaults)(tree, buildExecutor);
23
+ let budgets = undefined;
24
+ if (options.strict) {
25
+ budgets = [
26
+ { type: 'initial', maximumWarning: '500kb', maximumError: '1mb' },
27
+ {
28
+ type: 'anyComponentStyle',
29
+ maximumWarning: '4kb',
30
+ maximumError: '8kb',
31
+ },
32
+ ];
33
+ }
34
+ else {
35
+ budgets = [
36
+ { type: 'initial', maximumWarning: '2mb', maximumError: '5mb' },
37
+ {
38
+ type: 'anyComponentStyle',
39
+ maximumWarning: '6kb',
40
+ maximumError: '10kb',
41
+ },
42
+ ];
43
+ }
44
+ const inlineStyleLanguage = options?.style !== 'css' ? options.style : undefined;
45
+ const project = {
46
+ name: options.name,
47
+ projectType: 'application',
48
+ prefix: options.prefix,
49
+ root: options.appProjectRoot,
50
+ sourceRoot: options.appProjectSourceRoot,
51
+ tags: options.parsedTags,
52
+ targets: {
53
+ build: {
54
+ executor: buildExecutor,
55
+ outputs: ['{options.outputPath}'],
56
+ options: {
57
+ outputPath: options.outputPath,
58
+ index: angularMajorVersion >= 20
59
+ ? undefined
60
+ : `${options.appProjectSourceRoot}/index.html`,
61
+ browser: `${options.appProjectSourceRoot}/main.ts`,
62
+ polyfills: ['zone.js'],
63
+ tsConfig: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.app.json'),
64
+ inlineStyleLanguage,
65
+ assets: [
66
+ {
67
+ glob: '**/*',
68
+ input: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'public'),
69
+ },
70
+ ],
71
+ styles: [`${options.appProjectSourceRoot}/styles.${options.style}`],
72
+ },
73
+ configurations: {
74
+ production: {
75
+ budgets,
76
+ outputHashing: 'all',
77
+ },
78
+ development: {
79
+ optimization: false,
80
+ extractLicenses: false,
81
+ sourceMap: true,
82
+ },
83
+ },
84
+ defaultConfiguration: 'production',
85
+ },
86
+ serve: {
87
+ continuous: true,
88
+ executor: angularMajorVersion >= 20
89
+ ? '@angular/build:dev-server'
90
+ : '@angular-devkit/build-angular:dev-server',
91
+ options: options.port ? { port: options.port } : undefined,
92
+ configurations: {
93
+ production: {
94
+ buildTarget: `${options.name}:build:production`,
95
+ },
96
+ development: {
97
+ buildTarget: `${options.name}:build:development`,
98
+ },
99
+ },
100
+ defaultConfiguration: 'development',
101
+ },
102
+ 'extract-i18n': {
103
+ executor: angularMajorVersion >= 20
104
+ ? '@angular/build:extract-i18n'
105
+ : '@angular-devkit/build-angular:extract-i18n',
106
+ options: {
107
+ buildTarget: `${options.name}:build`,
108
+ },
109
+ },
110
+ },
111
+ };
112
+ return project;
113
+ }
114
+ function createProjectForWebpack(tree, options) {
115
+ const buildExecutor = '@angular-devkit/build-angular:browser';
13
116
  (0, target_defaults_utils_1.addBuildTargetDefaults)(tree, buildExecutor);
14
117
  let budgets = undefined;
15
118
  if (options.strict) {
@@ -47,23 +150,17 @@ function createProject(tree, options) {
47
150
  options: {
48
151
  outputPath: options.outputPath,
49
152
  index: `${options.appProjectSourceRoot}/index.html`,
50
- [buildMainOptionName]: `${options.appProjectSourceRoot}/main.ts`,
153
+ main: `${options.appProjectSourceRoot}/main.ts`,
51
154
  polyfills: ['zone.js'],
52
155
  tsConfig: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.app.json'),
53
156
  inlineStyleLanguage,
54
- assets: angularMajorVersion >= 18
55
- ? [
56
- {
57
- glob: '**/*',
58
- input: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'public'),
59
- },
60
- ]
61
- : [
62
- `${options.appProjectSourceRoot}/favicon.ico`,
63
- `${options.appProjectSourceRoot}/assets`,
64
- ],
157
+ assets: [
158
+ {
159
+ glob: '**/*',
160
+ input: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'public'),
161
+ },
162
+ ],
65
163
  styles: [`${options.appProjectSourceRoot}/styles.${options.style}`],
66
- scripts: [],
67
164
  },
68
165
  configurations: {
69
166
  production: {
@@ -71,12 +168,12 @@ function createProject(tree, options) {
71
168
  outputHashing: 'all',
72
169
  },
73
170
  development: {
74
- buildOptimizer: options.bundler === 'webpack' ? false : undefined,
171
+ buildOptimizer: false,
75
172
  optimization: false,
76
- vendorChunk: options.bundler === 'webpack' ? true : undefined,
173
+ vendorChunk: true,
77
174
  extractLicenses: false,
78
175
  sourceMap: true,
79
- namedChunks: options.bundler === 'webpack' ? true : undefined,
176
+ namedChunks: true,
80
177
  },
81
178
  },
82
179
  defaultConfiguration: 'production',
@@ -84,11 +181,7 @@ function createProject(tree, options) {
84
181
  serve: {
85
182
  continuous: true,
86
183
  executor: '@angular-devkit/build-angular:dev-server',
87
- options: options.port
88
- ? {
89
- port: options.port,
90
- }
91
- : undefined,
184
+ options: options.port ? { port: options.port } : undefined,
92
185
  configurations: {
93
186
  production: {
94
187
  buildTarget: `${options.name}:build:production`,
@@ -107,5 +200,5 @@ function createProject(tree, options) {
107
200
  },
108
201
  },
109
202
  };
110
- (0, devkit_1.addProjectConfiguration)(tree, options.name, project);
203
+ return project;
111
204
  }
@@ -2,10 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.enableStrictTypeChecking = enableStrictTypeChecking;
4
4
  const devkit_1 = require("@nx/devkit");
5
+ const version_utils_1 = require("../../utils/version-utils");
5
6
  function enableStrictTypeChecking(host, options) {
6
7
  // This matches the settings defined by the Angular CLI https://angular.io/guide/strict-mode
7
8
  const compilerOptions = {
8
- forceConsistentCasingInFileNames: true,
9
9
  strict: true,
10
10
  noImplicitOverride: true,
11
11
  noPropertyAccessFromIndexSignature: true,
@@ -14,12 +14,14 @@ function enableStrictTypeChecking(host, options) {
14
14
  };
15
15
  const appTsConfigPath = `${options.appProjectRoot}/tsconfig.json`;
16
16
  if (host.exists(appTsConfigPath)) {
17
+ const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(host);
17
18
  (0, devkit_1.updateJson)(host, appTsConfigPath, (json) => {
18
19
  json.compilerOptions = { ...json.compilerOptions, ...compilerOptions };
19
20
  json.angularCompilerOptions = {
20
- enableI18nLegacyMessageIdFormat: false,
21
+ ...json.angularCompilerOptions,
21
22
  strictInjectionParameters: true,
22
23
  strictInputAccessModifiers: true,
24
+ typeCheckHostBindings: angularMajorVersion >= 20 ? true : undefined,
23
25
  strictTemplates: true,
24
26
  };
25
27
  return json;
@@ -7,7 +7,6 @@ export * from './create-project';
7
7
  export * from './enable-strict-type-checking';
8
8
  export * from './normalize-options';
9
9
  export * from './normalized-schema';
10
- export * from './set-app-strict-default';
11
10
  export * from './set-generator-defaults';
12
- export * from './update-editor-tsconfig';
11
+ export * from './update-tsconfig-files';
13
12
  export * from './add-serve-static-target';
@@ -10,7 +10,6 @@ tslib_1.__exportStar(require("./create-project"), exports);
10
10
  tslib_1.__exportStar(require("./enable-strict-type-checking"), exports);
11
11
  tslib_1.__exportStar(require("./normalize-options"), exports);
12
12
  tslib_1.__exportStar(require("./normalized-schema"), exports);
13
- tslib_1.__exportStar(require("./set-app-strict-default"), exports);
14
13
  tslib_1.__exportStar(require("./set-generator-defaults"), exports);
15
- tslib_1.__exportStar(require("./update-editor-tsconfig"), exports);
14
+ tslib_1.__exportStar(require("./update-tsconfig-files"), exports);
16
15
  tslib_1.__exportStar(require("./add-serve-static-target"), exports);
@@ -10,6 +10,7 @@ function setGeneratorDefaults(tree, options) {
10
10
  linter: options.linter,
11
11
  style: options.style,
12
12
  unitTestRunner: options.unitTestRunner,
13
+ strict: !options.strict ? false : undefined,
13
14
  ...(nxJson.generators['@nx/angular:application'] || {}),
14
15
  };
15
16
  (0, devkit_1.updateNxJson)(tree, nxJson);
@@ -1,3 +1,3 @@
1
1
  import { type Tree } from '@nx/devkit';
2
2
  import type { NormalizedSchema } from './normalized-schema';
3
- export declare function updateEditorTsConfig(tree: Tree, options: NormalizedSchema): void;
3
+ export declare function updateTsconfigFiles(tree: Tree, options: NormalizedSchema): void;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateTsconfigFiles = updateTsconfigFiles;
4
+ const devkit_1 = require("@nx/devkit");
5
+ const js_1 = require("@nx/js");
6
+ const configuration_1 = require("@nx/js/src/utils/typescript/configuration");
7
+ const ensure_typescript_1 = require("@nx/js/src/utils/typescript/ensure-typescript");
8
+ const semver_1 = require("semver");
9
+ const update_app_editor_tsconfig_excluded_files_1 = require("../../utils/update-app-editor-tsconfig-excluded-files");
10
+ const version_utils_1 = require("../../utils/version-utils");
11
+ const enable_strict_type_checking_1 = require("./enable-strict-type-checking");
12
+ function updateTsconfigFiles(tree, options) {
13
+ (0, enable_strict_type_checking_1.enableStrictTypeChecking)(tree, options);
14
+ updateEditorTsConfig(tree, options);
15
+ const compilerOptions = {
16
+ skipLibCheck: true,
17
+ experimentalDecorators: true,
18
+ importHelpers: true,
19
+ target: 'es2022',
20
+ moduleResolution: 'bundler',
21
+ };
22
+ const rootTsConfigPath = (0, js_1.getRootTsConfigFileName)(tree);
23
+ const { major: angularMajorVersion, version: angularVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
24
+ if ((0, semver_1.lt)(angularVersion, '18.1.0')) {
25
+ compilerOptions.useDefineForClassFields = false;
26
+ }
27
+ if ((0, semver_1.gte)(angularVersion, '18.2.0')) {
28
+ compilerOptions.isolatedModules = true;
29
+ }
30
+ if ((0, semver_1.gte)(angularVersion, '19.1.0')) {
31
+ // Angular started warning about emitDecoratorMetadata and isolatedModules
32
+ // in v19.1.0. If enabled in the root tsconfig, we need to disable it.
33
+ if (shouldDisableEmitDecoratorMetadata(tree, rootTsConfigPath)) {
34
+ compilerOptions.emitDecoratorMetadata = false;
35
+ }
36
+ }
37
+ if (angularMajorVersion >= 20) {
38
+ compilerOptions.module = 'preserve';
39
+ }
40
+ else {
41
+ compilerOptions.module = 'es2022';
42
+ if (options.bundler === 'esbuild') {
43
+ compilerOptions.esModuleInterop = true;
44
+ }
45
+ }
46
+ const tsconfigPath = (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.json');
47
+ (0, devkit_1.updateJson)(tree, tsconfigPath, (json) => {
48
+ json.compilerOptions = {
49
+ ...json.compilerOptions,
50
+ ...compilerOptions,
51
+ };
52
+ json.compilerOptions = (0, configuration_1.getNeededCompilerOptionOverrides)(tree, json.compilerOptions, rootTsConfigPath);
53
+ return json;
54
+ });
55
+ if (options.unitTestRunner === 'jest') {
56
+ const tsconfigSpecPath = (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.spec.json');
57
+ (0, devkit_1.updateJson)(tree, tsconfigSpecPath, (json) => {
58
+ json.compilerOptions = {
59
+ ...json.compilerOptions,
60
+ module: 'commonjs',
61
+ moduleResolution: 'node10',
62
+ };
63
+ json.compilerOptions = (0, configuration_1.getNeededCompilerOptionOverrides)(tree, json.compilerOptions, tsconfigPath);
64
+ return json;
65
+ });
66
+ }
67
+ }
68
+ function updateEditorTsConfig(tree, options) {
69
+ const tsconfigEditorPath = (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.editor.json');
70
+ if (!tree.exists(tsconfigEditorPath)) {
71
+ return;
72
+ }
73
+ const appTsConfig = (0, devkit_1.readJson)(tree, (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.app.json'));
74
+ const types = appTsConfig?.compilerOptions?.types ?? [];
75
+ if (types?.length) {
76
+ (0, devkit_1.updateJson)(tree, (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.editor.json'), (json) => {
77
+ json.compilerOptions ??= {};
78
+ json.compilerOptions.types = Array.from(new Set(types));
79
+ return json;
80
+ });
81
+ }
82
+ const project = (0, devkit_1.readProjectConfiguration)(tree, options.name);
83
+ (0, update_app_editor_tsconfig_excluded_files_1.updateAppEditorTsConfigExcludedFiles)(tree, project);
84
+ }
85
+ function shouldDisableEmitDecoratorMetadata(tree, tsConfigPath) {
86
+ const ts = (0, ensure_typescript_1.ensureTypescript)();
87
+ const tsSysFromTree = {
88
+ ...ts.sys,
89
+ readFile: (path) => tree.read(path, 'utf-8'),
90
+ };
91
+ const parsed = ts.parseJsonConfigFileContent(ts.readConfigFile(tsConfigPath, tsSysFromTree.readFile).config, tsSysFromTree, tree.root);
92
+ return parsed.options.emitDecoratorMetadata === true;
93
+ }
@@ -177,7 +177,7 @@
177
177
  "default": false
178
178
  },
179
179
  "serverRouting": {
180
- "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_.",
180
+ "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.",
181
181
  "type": "boolean"
182
182
  }
183
183
  },
@@ -22,10 +22,11 @@ async function componentGenerator(tree, rawOptions) {
22
22
  viewEncapsulation: options.viewEncapsulation,
23
23
  displayBlock: options.displayBlock,
24
24
  selector: options.selector,
25
- // Angular v19 or higher defaults to true, while v18 or lower defaults to false
25
+ // Angular v19 or higher defaults to true, while lower versions default to false
26
26
  setStandalone: (angularMajorVersion >= 19 && !options.standalone) ||
27
27
  (angularMajorVersion < 19 && options.standalone),
28
28
  angularMajorVersion,
29
+ ngext: options.ngHtml ? '.ng' : '',
29
30
  tpl: '',
30
31
  });
31
32
  if (options.skipTests) {
@@ -41,7 +42,17 @@ async function componentGenerator(tree, rawOptions) {
41
42
  tree.delete(pathToStyleFile);
42
43
  }
43
44
  if (!options.skipImport && !options.standalone) {
44
- const modulePath = (0, lib_1.findModuleFromOptions)(tree, options, options.projectRoot);
45
+ let modulePath;
46
+ try {
47
+ modulePath = (0, lib_1.findModuleFromOptions)(tree, options, options.projectRoot);
48
+ }
49
+ catch (e) {
50
+ modulePath = (0, lib_1.findModuleFromOptions)(tree, {
51
+ ...options,
52
+ moduleExt: '-module.ts',
53
+ routingModuleExt: '-routing-module.ts',
54
+ }, options.projectRoot);
55
+ }
45
56
  (0, utils_1.addToNgModule)(tree, options.directory, modulePath, options.name, options.symbolName, options.fileName, 'declarations', true, options.export);
46
57
  }
47
58
  (0, lib_1.exportComponentInEntryPoint)(tree, options);
@@ -6,7 +6,7 @@ import { CommonModule } from '@angular/common';<% } %>
6
6
  standalone: <%= standalone %>,<% } %><% if(standalone) { %>
7
7
  imports: [CommonModule],<%}%><% if(inlineTemplate) { %>
8
8
  template: `<p><%= name %> works!</p>`<% } else { %>
9
- templateUrl: './<%= fileName %>.html'<% } if(inlineStyle) { %>,
9
+ templateUrl: './<%= fileName %><%= ngext %>.html'<% } if(inlineStyle) { %>,
10
10
  styles: `<% if(displayBlock){ %>
11
11
  :host {
12
12
  display: block;
@@ -21,7 +21,17 @@ function exportComponentInEntryPoint(tree, schema) {
21
21
  return;
22
22
  }
23
23
  if (!schema.standalone) {
24
- const modulePath = (0, module_1.findModuleFromOptions)(tree, schema, root);
24
+ let modulePath;
25
+ try {
26
+ modulePath = (0, module_1.findModuleFromOptions)(tree, schema, root);
27
+ }
28
+ catch (e) {
29
+ modulePath = (0, module_1.findModuleFromOptions)(tree, {
30
+ ...schema,
31
+ moduleExt: '-module.ts',
32
+ routingModuleExt: '-routing-module.ts',
33
+ }, root);
34
+ }
25
35
  if (!shouldExportInEntryPoint(tree, entryPointPath, modulePath)) {
26
36
  return;
27
37
  }
@@ -1,3 +1,8 @@
1
1
  import type { Tree } from '@nx/devkit';
2
- import type { NormalizedSchema } from '../schema';
3
- export declare function findModuleFromOptions(tree: Tree, options: NormalizedSchema, projectRoot: string): string;
2
+ export type ModuleOptions = {
3
+ directory: string;
4
+ module?: string;
5
+ moduleExt?: string;
6
+ routingModuleExt?: string;
7
+ };
8
+ export declare function findModuleFromOptions(tree: Tree, options: ModuleOptions, projectRoot: string): string;