@nx/angular 21.1.2 → 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
@@ -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,76 @@
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 semver_1 = require("semver");
8
+ const ensure_typescript_1 = require("@nx/js/src/utils/typescript/ensure-typescript");
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
+ (0, devkit_1.updateJson)(tree, `${options.appProjectRoot}/tsconfig.json`, (json) => {
47
+ json.compilerOptions = {
48
+ ...json.compilerOptions,
49
+ ...compilerOptions,
50
+ };
51
+ json.compilerOptions = (0, configuration_1.getNeededCompilerOptionOverrides)(tree, json.compilerOptions, rootTsConfigPath);
52
+ return json;
53
+ });
54
+ }
55
+ function updateEditorTsConfig(tree, options) {
56
+ const appTsConfig = (0, devkit_1.readJson)(tree, (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.app.json'));
57
+ const types = appTsConfig?.compilerOptions?.types ?? [];
58
+ if (types?.length) {
59
+ (0, devkit_1.updateJson)(tree, (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.editor.json'), (json) => {
60
+ json.compilerOptions ??= {};
61
+ json.compilerOptions.types = Array.from(new Set(types));
62
+ return json;
63
+ });
64
+ }
65
+ const project = (0, devkit_1.readProjectConfiguration)(tree, options.name);
66
+ (0, update_app_editor_tsconfig_excluded_files_1.updateAppEditorTsConfigExcludedFiles)(tree, project);
67
+ }
68
+ function shouldDisableEmitDecoratorMetadata(tree, tsConfigPath) {
69
+ const ts = (0, ensure_typescript_1.ensureTypescript)();
70
+ const tsSysFromTree = {
71
+ ...ts.sys,
72
+ readFile: (path) => tree.read(path, 'utf-8'),
73
+ };
74
+ const parsed = ts.parseJsonConfigFileContent(ts.readConfigFile(tsConfigPath, tsSysFromTree.readFile).config, tsSysFromTree, tree.root);
75
+ return parsed.options.emitDecoratorMetadata === true;
76
+ }
@@ -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;
@@ -5,11 +5,13 @@ const devkit_1 = require("@nx/devkit");
5
5
  const path_1 = require("path");
6
6
  // Adapted from https://github.com/angular/angular-cli/blob/732aab5fa7e63618c89dfbbb6f78753f706d7014/packages/schematics/angular/utility/find-module.ts#L29
7
7
  // to match the logic from the Angular CLI component schematic.
8
- const moduleExt = '.module.ts';
9
- const routingModuleExt = '-routing.module.ts';
8
+ const MODULE_EXT = '.module.ts';
9
+ const ROUTING_MODULE_EXT = '-routing.module.ts';
10
10
  function findModuleFromOptions(tree, options, projectRoot) {
11
+ const moduleExt = options.moduleExt || MODULE_EXT;
12
+ const routingModuleExt = options.routingModuleExt || ROUTING_MODULE_EXT;
11
13
  if (!options.module) {
12
- return (0, devkit_1.normalizePath)(findModule(tree, options.directory, projectRoot));
14
+ return (0, devkit_1.normalizePath)(findModule(tree, options.directory, projectRoot, moduleExt, routingModuleExt));
13
15
  }
14
16
  else {
15
17
  const modulePath = (0, devkit_1.joinPathFragments)(options.directory, options.module);
@@ -32,7 +34,7 @@ function findModuleFromOptions(tree, options, projectRoot) {
32
34
  `${moduleBaseName}${moduleExt}`,
33
35
  ].map((x) => (0, devkit_1.joinPathFragments)(c, x));
34
36
  for (const sc of candidateFiles) {
35
- if (tree.isFile(sc)) {
37
+ if (tree.isFile(sc) && tree.read(sc, 'utf-8').includes('@NgModule')) {
36
38
  return (0, devkit_1.normalizePath)(sc);
37
39
  }
38
40
  }
@@ -41,7 +43,7 @@ function findModuleFromOptions(tree, options, projectRoot) {
41
43
  `Looked in the following directories:\n ${candidatesDirs.join('\n ')}`);
42
44
  }
43
45
  }
44
- function findModule(tree, generateDir, projectRoot) {
46
+ function findModule(tree, generateDir, projectRoot, moduleExt = MODULE_EXT, routingModuleExt = ROUTING_MODULE_EXT) {
45
47
  let dir = generateDir;
46
48
  const projectRootParent = (0, path_1.dirname)(projectRoot);
47
49
  while (dir !== projectRootParent) {
@@ -5,12 +5,16 @@ const devkit_1 = require("@nx/devkit");
5
5
  const artifact_name_and_directory_utils_1 = require("@nx/devkit/src/generators/artifact-name-and-directory-utils");
6
6
  const selector_1 = require("../../utils/selector");
7
7
  const validations_1 = require("../../utils/validations");
8
+ const version_utils_1 = require("../../utils/version-utils");
8
9
  async function normalizeOptions(tree, options) {
9
- options.type ??= 'component';
10
+ const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
11
+ if (angularMajorVersion < 20) {
12
+ options.type ??= 'component';
13
+ }
10
14
  const { artifactName: name, directory, fileName, filePath, project: projectName, } = await (0, artifact_name_and_directory_utils_1.determineArtifactNameAndDirectoryOptions)(tree, {
11
15
  name: options.name,
12
16
  path: options.path,
13
- suffix: options.type ?? 'component',
17
+ suffix: options.type,
14
18
  allowedFileExtensions: ['ts'],
15
19
  fileExtension: 'ts',
16
20
  });
@@ -18,7 +22,7 @@ async function normalizeOptions(tree, options) {
18
22
  throw new Error(`The component name '${name}' cannot contain a slash as it must be a valid JS symbol. Please use a different name.`);
19
23
  }
20
24
  const { className } = (0, devkit_1.names)(name);
21
- const { className: suffixClassName } = (0, devkit_1.names)(options.type);
25
+ const suffixClassName = options.type ? (0, devkit_1.names)(options.type).className : '';
22
26
  const symbolName = `${className}${suffixClassName}`;
23
27
  (0, validations_1.validateClassName)(symbolName);
24
28
  const { prefix, root, sourceRoot } = (0, devkit_1.readProjectConfiguration)(tree, projectName);
@@ -17,6 +17,7 @@ export interface Schema {
17
17
  export?: boolean;
18
18
  exportDefault?: boolean;
19
19
  prefix?: string;
20
+ ngHtml?: boolean;
20
21
  skipFormat?: boolean;
21
22
  }
22
23
 
@@ -95,8 +95,7 @@
95
95
  },
96
96
  "type": {
97
97
  "type": "string",
98
- "description": "Adds a developer-defined type to the filename, in the format `name.type.ts`.",
99
- "default": "component"
98
+ "description": "Append a custom type to the component's filename. It defaults to 'component' for Angular versions below v20. For Angular v20 and above, no type is appended unless specified."
100
99
  },
101
100
  "export": {
102
101
  "type": "boolean",
@@ -109,6 +108,11 @@
109
108
  "default": false,
110
109
  "description": "Use default export for the component instead of a named export."
111
110
  },
111
+ "ngHtml": {
112
+ "type": "boolean",
113
+ "default": false,
114
+ "description": "Generate component template files with an '.ng.html' file extension instead of '.html'."
115
+ },
112
116
  "skipFormat": {
113
117
  "description": "Skip formatting files.",
114
118
  "type": "boolean",