@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
@@ -0,0 +1,43 @@
1
+ import { fakeAsync, TestBed, tick } from '@angular/core/testing';
2
+ import { <%= appSymbolName %> } from './<%= appFileName %>';
3
+ import { <%= nxWelcomeSymbolName %> } from './<%= nxWelcomeFileName %>';
4
+ import { Router, RouterModule } from '@angular/router';
5
+
6
+ describe('<%= appSymbolName %>', () => {
7
+ beforeEach(async () => {
8
+ await TestBed.configureTestingModule({
9
+ imports: [
10
+ RouterModule.forRoot([
11
+ { path: '', component: <%= nxWelcomeSymbolName %> },
12
+ ]),<% if (standalone) { %>
13
+ <%= appSymbolName %>,
14
+ <%= nxWelcomeSymbolName %>,<% } %>
15
+ ],<% if (!standalone) { %>
16
+ declarations: [<%= appSymbolName %>, <%= nxWelcomeSymbolName %>],<% } %>
17
+ }).compileComponents();
18
+ });
19
+
20
+ it('should create the app', () => {
21
+ const fixture = TestBed.createComponent(<%= appSymbolName %>);
22
+ const app = fixture.componentInstance;
23
+ expect(app).toBeTruthy();
24
+ });
25
+
26
+ it(`should have as title '<%= appName %>'`, () => {
27
+ const fixture = TestBed.createComponent(<%= appSymbolName %>);
28
+ const app = fixture.componentInstance;
29
+ expect(app.title).toEqual('<%= appName %>');
30
+ });
31
+
32
+ it('should render title', fakeAsync(() => {
33
+ const fixture = TestBed.createComponent(<%= appSymbolName %>);
34
+ const router = TestBed.inject(Router);
35
+ fixture.ngZone?.run(() => router.navigate(['']));
36
+ tick();
37
+ fixture.detectChanges();
38
+ const compiled = fixture.nativeElement as HTMLElement;
39
+ expect(compiled.querySelector('h1')?.textContent).toContain(
40
+ 'Welcome <%= appName %>'
41
+ );
42
+ }));
43
+ });
@@ -1,4 +1,4 @@
1
1
  import { Route } from '@angular/router';
2
- import { RemoteEntryComponent } from './entry.component';
2
+ import { RemoteEntry<%= componentType %> } from './entry<%= componentFileSuffix %>';
3
3
 
4
- export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntryComponent }];
4
+ export const remoteRoutes: Route[] = [{ path: '', component: RemoteEntry<%= componentType %> }];
@@ -1,13 +1,13 @@
1
1
  import { Component } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
- import { NxWelcomeComponent } from './nx-welcome.component';
3
+ import { <%= nxWelcomeSymbolName %> } from './<%= nxWelcomeFileName %>';
4
4
 
5
5
  @Component({<% if (setStandaloneTrue) { %>
6
6
  standalone: true,<% } %>
7
- imports: [CommonModule, NxWelcomeComponent],<% if (prefix) { %>
7
+ imports: [CommonModule, <%= nxWelcomeSymbolName %>],<% if (prefix) { %>
8
8
  selector: '<%= prefix %>-<%= appName %>-entry',
9
9
  template: `<<%= prefix %>-nx-welcome></<%= prefix %>-nx-welcome>`<% } else { %>
10
10
  selector: '<%= appName %>-entry',
11
11
  template: `<nx-welcome></nx-welcome>`<% } %>
12
12
  })
13
- export class RemoteEntryComponent {}
13
+ export class RemoteEntry<%= componentType %> {}
@@ -17,7 +17,7 @@ const config: ModuleFederationConfig = {
17
17
  remotes: [<% if (federationType === 'static') { remotes.forEach(function(remote) { %>'<%= remote.remoteName %>',<% }); } %>]<% } %><% if(type === 'remote') { %>
18
18
  exposes: {<% if(standalone) { %>
19
19
  './Routes': '<%= projectRoot %>/src/app/remote-entry/entry.routes.ts',<% } else { %>
20
- './Module': '<%= projectRoot %>/src/app/remote-entry/entry.module.ts',<% } %>
20
+ './Module': '<%= projectRoot %>/src/app/remote-entry/<%= entryModuleFileName %>.ts',<% } %>
21
21
  },<% } %>
22
22
  };
23
23
 
@@ -5,7 +5,7 @@
5
5
  },
6
6
  "include": [
7
7
  "src/main.ts",
8
- <% if(type === "remote") { %> "src/remote-entry/<% if(standalone) { %>entry.routes.ts", <% } else { %> entry.module.ts", <% } } %>
8
+ <% if(type === "remote") { %> "src/remote-entry/<% if(standalone) { %>entry.routes.ts",<% } else { %><%= entryModuleFileName %>.ts",<% } } %>
9
9
  "webpack.config.ts",
10
10
  "webpack.prod.config.ts"
11
11
  ]
@@ -18,6 +18,6 @@ module.exports = {
18
18
  remotes: [<% if (federationType === 'static') { remotes.forEach(function(remote) { %>'<%= remote.remoteName %>',<% }); } %>]<% } %><% if(type === 'remote') { %>
19
19
  exposes: {<% if(standalone) { %>
20
20
  './Routes': '<%= projectRoot %>/src/app/remote-entry/entry.routes.ts',<% } else { %>
21
- './Module': '<%= projectRoot %>/src/app/remote-entry/entry.module.ts',<% } %>
21
+ './Module': '<%= projectRoot %>/src/app/remote-entry/<%= entryModuleFileName %>.ts',<% } %>
22
22
  },<% } %>
23
23
  };
@@ -1,3 +1,3 @@
1
1
  import type { Tree } from '@nx/devkit';
2
- import type { Schema } from '../schema';
3
- export declare function addRemoteEntry(tree: Tree, { appName, routing, prefix, standalone }: Schema, appRoot: string): void;
2
+ import type { NormalizedOptions } from '../schema';
3
+ export declare function addRemoteEntry(tree: Tree, options: NormalizedOptions, appRoot: string): void;
@@ -4,8 +4,9 @@ exports.addRemoteEntry = addRemoteEntry;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const route_utils_1 = require("../../../utils/nx-devkit/route-utils");
6
6
  const version_utils_1 = require("../../utils/version-utils");
7
- function addRemoteEntry(tree, { appName, routing, prefix, standalone }, appRoot) {
7
+ function addRemoteEntry(tree, options, appRoot) {
8
8
  const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
9
+ const { appName, routing, prefix, standalone, componentType, componentFileSuffix, nxWelcomeComponentInfo, entryModuleFileName, } = options;
9
10
  (0, devkit_1.generateFiles)(tree, standalone
10
11
  ? (0, devkit_1.joinPathFragments)(__dirname, '../files/standalone-entry-component-files')
11
12
  : (0, devkit_1.joinPathFragments)(__dirname, '../files/entry-module-files'), `${appRoot}/src/app/remote-entry`, {
@@ -13,14 +14,19 @@ function addRemoteEntry(tree, { appName, routing, prefix, standalone }, appRoot)
13
14
  appName,
14
15
  routing,
15
16
  prefix,
16
- // Angular v19 or higher defaults to true, while v18 or lower defaults to false
17
+ // Angular v19 or higher defaults to true, while lower versions default to false
17
18
  setStandaloneFalse: angularMajorVersion >= 19,
18
19
  setStandaloneTrue: angularMajorVersion < 19,
20
+ componentType,
21
+ componentFileSuffix,
22
+ entryModuleFileName,
23
+ nxWelcomeFileName: nxWelcomeComponentInfo.extensionlessFileName,
24
+ nxWelcomeSymbolName: nxWelcomeComponentInfo.symbolName,
19
25
  });
20
26
  if (standalone && routing) {
21
27
  (0, route_utils_1.addRoute)(tree, (0, devkit_1.joinPathFragments)(appRoot, 'src/app/app.routes.ts'), `{path: '', loadChildren: () => import('./remote-entry/entry.routes').then(m => m.remoteRoutes)}`);
22
28
  }
23
29
  else if (routing) {
24
- (0, route_utils_1.addRoute)(tree, (0, devkit_1.joinPathFragments)(appRoot, 'src/app/app.routes.ts'), `{ path: '', loadChildren: () => import('./remote-entry/entry.module').then(m => m.RemoteEntryModule) }`);
30
+ (0, route_utils_1.addRoute)(tree, (0, devkit_1.joinPathFragments)(appRoot, 'src/app/app.routes.ts'), `{ path: '', loadChildren: () => import('./remote-entry/${entryModuleFileName}').then(m => m.RemoteEntryModule) }`);
25
31
  }
26
32
  }
@@ -105,7 +105,17 @@ function addLazyLoadedRouteToHostAppModule(tree, options, hostFederationType) {
105
105
  path: '${options.appName}',
106
106
  loadChildren: () => ${routeToAdd}.then(m => m!.${exportedRemote})
107
107
  }`);
108
- const pathToAppComponentTemplate = (0, devkit_1.joinPathFragments)(hostAppConfig.sourceRoot, 'app/app.component.html');
108
+ let pathToAppComponentTemplate = (0, devkit_1.joinPathFragments)(hostAppConfig.sourceRoot, 'app/app.component.html');
109
+ const candidatePaths = [
110
+ pathToAppComponentTemplate,
111
+ (0, devkit_1.joinPathFragments)(hostAppConfig.sourceRoot, 'app/app.html'),
112
+ ];
113
+ for (const path of candidatePaths) {
114
+ if (tree.exists(path)) {
115
+ pathToAppComponentTemplate = path;
116
+ break;
117
+ }
118
+ }
109
119
  const appComponent = tree.read(pathToAppComponentTemplate, 'utf-8');
110
120
  if (appComponent.includes(`<ul class="remote-menu">`) &&
111
121
  appComponent.includes('</ul>')) {
@@ -1,3 +1,3 @@
1
1
  import { type Tree } from '@nx/devkit';
2
- import type { Schema } from '../schema';
3
- export declare function fixBootstrap(tree: Tree, appRoot: string, options: Schema): void;
2
+ import type { NormalizedOptions } from '../schema';
3
+ export declare function fixBootstrap(tree: Tree, appRoot: string, options: NormalizedOptions): void;
@@ -6,7 +6,7 @@ function fixBootstrap(tree, appRoot, options) {
6
6
  const mainFilePath = (0, devkit_1.joinPathFragments)(appRoot, 'src/main.ts');
7
7
  const bootstrapCode = tree.read(mainFilePath, 'utf-8');
8
8
  if (options.standalone && options.mfType === 'remote') {
9
- tree.write(`${appRoot}/src/bootstrap.ts`, standaloneBootstrapCode());
9
+ tree.write(`${appRoot}/src/bootstrap.ts`, standaloneBootstrapCode(options.componentType, options.componentFileSuffix));
10
10
  }
11
11
  else {
12
12
  tree.write((0, devkit_1.joinPathFragments)(appRoot, 'src/bootstrap.ts'), bootstrapCode);
@@ -30,11 +30,11 @@ fetch('${manifestPath}')
30
30
  tree.write(mainFilePath, fetchMFManifestCode);
31
31
  }
32
32
  }
33
- const standaloneBootstrapCode = () => `import { bootstrapApplication } from '@angular/platform-browser';
33
+ const standaloneBootstrapCode = (componentType, componentFileSuffix) => `import { bootstrapApplication } from '@angular/platform-browser';
34
34
  import { appConfig } from './app/app.config';
35
- import { RemoteEntryComponent } from './app/remote-entry/entry.component';
35
+ import { RemoteEntry${componentType} } from './app/remote-entry/entry${componentFileSuffix}';
36
36
 
37
- bootstrapApplication(RemoteEntryComponent, appConfig).catch((err) =>
37
+ bootstrapApplication(RemoteEntry${componentType}, appConfig).catch((err) =>
38
38
  console.error(err)
39
39
  );
40
40
  `;
@@ -1,6 +1,6 @@
1
1
  import type { Tree } from '@nx/devkit';
2
- import type { Schema } from '../schema';
3
- export declare function generateWebpackConfig(tree: Tree, options: Schema, appRoot: string, remotesWithPorts: {
2
+ import type { NormalizedOptions } from '../schema';
3
+ export declare function generateWebpackConfig(tree: Tree, options: NormalizedOptions, appRoot: string, remotesWithPorts: {
4
4
  remoteName: string;
5
5
  port: number;
6
6
  }[]): void;
@@ -23,6 +23,7 @@ function generateWebpackConfig(tree, options, appRoot, remotesWithPorts) {
23
23
  remotes: remotesWithPorts ?? [],
24
24
  projectRoot: appRoot,
25
25
  standalone: options.standalone,
26
+ entryModuleFileName: options.entryModuleFileName,
26
27
  });
27
28
  if (!options.setParserOptionsProject) {
28
29
  tree.delete((0, devkit_1.joinPathFragments)(appRoot, 'tsconfig.lint.json'));
@@ -1,3 +1,3 @@
1
- import type { Tree } from '@nx/devkit';
1
+ import { type Tree } from '@nx/devkit';
2
2
  import type { NormalizedOptions, Schema } from '../schema';
3
3
  export declare function normalizeOptions(tree: Tree, options: Schema): NormalizedOptions;
@@ -1,13 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.normalizeOptions = normalizeOptions;
4
+ const devkit_1 = require("@nx/devkit");
5
+ const app_components_info_1 = require("../../utils/app-components-info");
6
+ const artifact_types_1 = require("../../utils/artifact-types");
4
7
  const project_1 = require("../../utils/project");
5
8
  function normalizeOptions(tree, options) {
9
+ const componentType = (0, artifact_types_1.getComponentType)(tree);
10
+ const componentFileSuffix = componentType ? `.${componentType}` : '';
11
+ const moduleTypeSeparator = (0, artifact_types_1.getModuleTypeSeparator)(tree);
12
+ const entryModuleFileName = `entry${moduleTypeSeparator}module`;
13
+ const project = (0, devkit_1.readProjectConfiguration)(tree, options.appName);
6
14
  return {
7
15
  ...options,
8
16
  typescriptConfiguration: options.typescriptConfiguration ?? true,
9
17
  federationType: options.federationType ?? 'static',
10
18
  prefix: options.prefix ?? (0, project_1.getProjectPrefix)(tree, options.appName) ?? 'app',
11
19
  standalone: options.standalone ?? true,
20
+ componentType: componentType ? (0, devkit_1.names)(componentType).className : '',
21
+ componentFileSuffix,
22
+ entryModuleFileName,
23
+ appComponentInfo: (0, app_components_info_1.getAppComponentInfo)(tree, componentFileSuffix, project),
24
+ nxWelcomeComponentInfo: (0, app_components_info_1.getNxWelcomeComponentInfo)(tree, componentFileSuffix, project),
12
25
  };
13
26
  }
@@ -1,3 +1,3 @@
1
1
  import type { Tree } from '@nx/devkit';
2
- import { Schema } from '../schema';
3
- export declare function removeDeadCodeFromRemote(tree: Tree, options: Schema): void;
2
+ import type { NormalizedOptions } from '../schema';
3
+ export declare function removeDeadCodeFromRemote(tree: Tree, options: NormalizedOptions): void;
@@ -5,46 +5,50 @@ const devkit_1 = require("@nx/devkit");
5
5
  function removeDeadCodeFromRemote(tree, options) {
6
6
  const projectName = options.appName;
7
7
  const project = (0, devkit_1.readProjectConfiguration)(tree, projectName);
8
+ const { appComponentInfo, nxWelcomeComponentInfo, entryModuleFileName } = options;
8
9
  ['css', 'less', 'scss', 'sass'].forEach((style) => {
9
- const pathToComponentStyle = (0, devkit_1.joinPathFragments)(project.sourceRoot, `app/app.component.${style}`);
10
+ const pathToComponentStyle = (0, devkit_1.joinPathFragments)(project.sourceRoot, `app/${appComponentInfo.extensionlessFileName}.${style}`);
10
11
  if (tree.exists(pathToComponentStyle)) {
11
12
  tree.delete(pathToComponentStyle);
12
13
  }
13
14
  });
14
- tree.rename((0, devkit_1.joinPathFragments)(project.sourceRoot, 'app/nx-welcome.component.ts'), (0, devkit_1.joinPathFragments)(project.sourceRoot, 'app/remote-entry/nx-welcome.component.ts'));
15
- tree.delete((0, devkit_1.joinPathFragments)(project.sourceRoot, 'app/app.component.spec.ts'));
16
- tree.delete((0, devkit_1.joinPathFragments)(project.sourceRoot, 'app/app.component.html'));
17
- const pathToAppComponent = (0, devkit_1.joinPathFragments)(project.sourceRoot, 'app/app.component.ts');
15
+ tree.rename(nxWelcomeComponentInfo.path, (0, devkit_1.joinPathFragments)(project.sourceRoot, `app/remote-entry/${nxWelcomeComponentInfo.fileName}`));
16
+ tree.delete((0, devkit_1.joinPathFragments)(project.sourceRoot, `app/${appComponentInfo.extensionlessFileName}.spec.ts`));
17
+ tree.delete((0, devkit_1.joinPathFragments)(project.sourceRoot, `app/${appComponentInfo.extensionlessFileName}.html`));
18
18
  if (!options.standalone) {
19
- const componentContents = tree.read(pathToAppComponent, 'utf-8');
19
+ const componentContents = tree.read(appComponentInfo.path, 'utf-8');
20
20
  const isInlineTemplate = !componentContents.includes('templateUrl');
21
21
  const component = componentContents.split(isInlineTemplate ? 'template' : 'templateUrl')[0] +
22
22
  `template: '<router-outlet></router-outlet>'
23
23
 
24
24
  })
25
- export class AppComponent {}`;
26
- tree.write(pathToAppComponent, component);
27
- tree.write((0, devkit_1.joinPathFragments)(project.sourceRoot, 'app/app.module.ts'), `import { NgModule } from '@angular/core';
25
+ export class ${appComponentInfo.symbolName} {}`;
26
+ tree.write(appComponentInfo.path, component);
27
+ let modulePath = (0, devkit_1.joinPathFragments)(project.sourceRoot, 'app/app.module.ts');
28
+ if (!tree.exists(modulePath)) {
29
+ modulePath = (0, devkit_1.joinPathFragments)(project.sourceRoot, 'app/app-module.ts');
30
+ }
31
+ tree.write(modulePath, `import { NgModule } from '@angular/core';
28
32
  import { BrowserModule } from '@angular/platform-browser';
29
33
  import { RouterModule } from '@angular/router';
30
- import { AppComponent } from './app.component';
34
+ import { ${appComponentInfo.symbolName} } from './${appComponentInfo.extensionlessFileName}';
31
35
 
32
36
  @NgModule({
33
- declarations: [AppComponent],
37
+ declarations: [${appComponentInfo.symbolName}],
34
38
  imports: [
35
39
  BrowserModule,
36
40
  RouterModule.forRoot([{
37
41
  path: '',
38
- loadChildren: () => import('./remote-entry/entry.module').then(m => m.RemoteEntryModule)
42
+ loadChildren: () => import('./remote-entry/${entryModuleFileName}').then(m => m.RemoteEntryModule)
39
43
  }], { initialNavigation: 'enabledBlocking' }),
40
44
  ],
41
45
  providers: [],
42
- bootstrap: [AppComponent],
46
+ bootstrap: [${appComponentInfo.symbolName}],
43
47
  })
44
48
  export class AppModule {}`);
45
49
  }
46
50
  else {
47
- tree.delete(pathToAppComponent);
51
+ tree.delete(appComponentInfo.path);
48
52
  const pathToIndexHtml = project.targets.build.options.index;
49
53
  const indexContents = tree.read(pathToIndexHtml, 'utf-8');
50
54
  const rootSelectorRegex = new RegExp(`${options.prefix || 'app'}-root`, 'ig');
@@ -2,16 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.setupHostIfDynamic = setupHostIfDynamic;
4
4
  const devkit_1 = require("@nx/devkit");
5
- const version_utils_1 = require("../../utils/version-utils");
6
5
  function setupHostIfDynamic(tree, options) {
7
6
  if (options.federationType === 'static') {
8
7
  return;
9
8
  }
10
- const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
11
9
  const project = (0, devkit_1.readProjectConfiguration)(tree, options.appName);
12
- const pathToMFManifest = angularMajorVersion >= 18
13
- ? (0, devkit_1.joinPathFragments)(project.root, 'public/module-federation.manifest.json')
14
- : (0, devkit_1.joinPathFragments)(project.sourceRoot, 'assets/module-federation.manifest.json');
10
+ const pathToMFManifest = (0, devkit_1.joinPathFragments)(project.root, 'public/module-federation.manifest.json');
15
11
  if (!tree.exists(pathToMFManifest)) {
16
12
  tree.write(pathToMFManifest, '{}');
17
13
  }
@@ -1,3 +1,3 @@
1
1
  import type { Tree } from '@nx/devkit';
2
- import type { Schema } from '../schema';
3
- export declare function setupTspathForRemote(tree: Tree, options: Schema): void;
2
+ import type { NormalizedOptions } from '../schema';
3
+ export declare function setupTspathForRemote(tree: Tree, options: NormalizedOptions): void;
@@ -7,7 +7,7 @@ function setupTspathForRemote(tree, options) {
7
7
  const project = (0, devkit_1.readProjectConfiguration)(tree, options.appName);
8
8
  const exportPath = options.standalone
9
9
  ? `./src/app/remote-entry/entry.routes.ts`
10
- : `./src/app/remote-entry/entry.module.ts`;
10
+ : `./src/app/remote-entry/${options.entryModuleFileName}.ts`;
11
11
  const exportName = options.standalone ? 'Routes' : 'Module';
12
12
  (0, js_1.addTsConfigPath)(tree, `${options.appName.replace(/-/g, '_')}/${exportName}`, [
13
13
  (0, devkit_1.joinPathFragments)(project.root, exportPath),
@@ -1,3 +1,3 @@
1
1
  import { type Tree } from '@nx/devkit';
2
- import type { Schema } from '../schema';
3
- export declare function updateHostAppRoutes(tree: Tree, options: Schema): void;
2
+ import type { NormalizedOptions } from '../schema';
3
+ export declare function updateHostAppRoutes(tree: Tree, options: NormalizedOptions): void;
@@ -3,31 +3,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.updateHostAppRoutes = updateHostAppRoutes;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const route_utils_1 = require("../../../utils/nx-devkit/route-utils");
6
- const version_utils_1 = require("../../utils/version-utils");
7
6
  function updateHostAppRoutes(tree, options) {
8
7
  const { sourceRoot } = (0, devkit_1.readProjectConfiguration)(tree, options.appName);
9
- tree.write((0, devkit_1.joinPathFragments)(sourceRoot, 'app/app.component.html'), `<ul class="remote-menu">
8
+ const { appComponentInfo, nxWelcomeComponentInfo } = options;
9
+ tree.write((0, devkit_1.joinPathFragments)(sourceRoot, 'app', `${appComponentInfo.extensionlessFileName}.html`), `<ul class="remote-menu">
10
10
  <li><a routerLink="/">Home</a></li>
11
11
  </ul>
12
12
  <router-outlet></router-outlet>
13
13
  `);
14
14
  let pathToHostRootRoutingFile = (0, devkit_1.joinPathFragments)(sourceRoot, 'app/app.routes.ts');
15
- let hostRootRoutingFile = tree.read(pathToHostRootRoutingFile, 'utf-8');
16
- if (!hostRootRoutingFile) {
15
+ if (!tree.exists(pathToHostRootRoutingFile)) {
17
16
  pathToHostRootRoutingFile = (0, devkit_1.joinPathFragments)(sourceRoot, 'app/app-routing.module.ts');
18
- hostRootRoutingFile = tree.read(pathToHostRootRoutingFile, 'utf-8');
17
+ }
18
+ if (!tree.exists(pathToHostRootRoutingFile)) {
19
+ pathToHostRootRoutingFile = (0, devkit_1.joinPathFragments)(sourceRoot, 'app/app-routing-module.ts');
19
20
  }
20
21
  (0, route_utils_1.addRoute)(tree, pathToHostRootRoutingFile, `{
21
22
  path: '',
22
- component: NxWelcomeComponent
23
+ component: ${nxWelcomeComponentInfo.symbolName}
23
24
  }`);
24
- tree.write(pathToHostRootRoutingFile, `import { NxWelcomeComponent } from './nx-welcome.component';
25
+ tree.write(pathToHostRootRoutingFile, `import { ${nxWelcomeComponentInfo.symbolName} } from './${nxWelcomeComponentInfo.extensionlessFileName}';
25
26
  ${tree.read(pathToHostRootRoutingFile, 'utf-8')}`);
26
- const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
27
27
  (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, '../files/host-files'), (0, devkit_1.joinPathFragments)(sourceRoot, 'app'), {
28
28
  appName: options.appName,
29
29
  standalone: options.standalone,
30
- useRouterTestingModule: angularMajorVersion < 18,
30
+ appFileName: appComponentInfo.extensionlessFileName,
31
+ appSymbolName: appComponentInfo.symbolName,
32
+ nxWelcomeFileName: nxWelcomeComponentInfo.extensionlessFileName,
33
+ nxWelcomeSymbolName: nxWelcomeComponentInfo.symbolName,
31
34
  tmpl: '',
32
35
  });
33
36
  }
@@ -1,3 +1,3 @@
1
1
  import type { Tree } from '@nx/devkit';
2
- import type { Schema } from '../schema';
3
- export declare function updateTsConfig(tree: Tree, schema: Schema): void;
2
+ import type { NormalizedOptions } from '../schema';
3
+ export declare function updateTsConfig(tree: Tree, options: NormalizedOptions): void;
@@ -2,16 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.updateTsConfig = updateTsConfig;
4
4
  const devkit_1 = require("@nx/devkit");
5
- function updateTsConfig(tree, schema) {
6
- const { root } = (0, devkit_1.readProjectConfiguration)(tree, schema.appName);
5
+ function updateTsConfig(tree, options) {
6
+ const { root } = (0, devkit_1.readProjectConfiguration)(tree, options.appName);
7
7
  (0, devkit_1.updateJson)(tree, (0, devkit_1.joinPathFragments)(root, `tsconfig.app.json`), (json) => {
8
8
  json.compilerOptions ??= {};
9
9
  json.compilerOptions.target = 'ES2020';
10
- if (schema.mfType === 'remote') {
10
+ if (options.mfType === 'remote') {
11
11
  json.files ??= [];
12
- json.files.push(schema.standalone
12
+ json.files.push(options.standalone
13
13
  ? 'src/app/remote-entry/entry.routes.ts'
14
- : 'src/app/remote-entry/entry.module.ts');
14
+ : `src/app/remote-entry/${options.entryModuleFileName}.ts`);
15
15
  }
16
16
  return json;
17
17
  });
@@ -1,3 +1,5 @@
1
+ import type { ComponentMetadata } from '../utils/app-components-info';
2
+
1
3
  type FederationType = 'static' | 'dynamic';
2
4
 
3
5
  export interface Schema {
@@ -21,4 +23,9 @@ export interface Schema {
21
23
  export interface NormalizedOptions extends Schema {
22
24
  federationType: FederationType;
23
25
  prefix: string | undefined;
26
+ componentType: string;
27
+ componentFileSuffix: string;
28
+ entryModuleFileName: string;
29
+ appComponentInfo: ComponentMetadata;
30
+ nxWelcomeComponentInfo: ComponentMetadata;
24
31
  }
@@ -1,4 +1,4 @@
1
- import { type Tree } from '@nx/devkit';
1
+ import { type GeneratorCallback, type Tree } from '@nx/devkit';
2
2
  import type { Schema } from './schema';
3
- export declare function setupMf(tree: Tree, rawOptions: Schema): Promise<() => void>;
3
+ export declare function setupMf(tree: Tree, rawOptions: Schema): Promise<GeneratorCallback>;
4
4
  export default setupMf;
@@ -3,11 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.setupMf = setupMf;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const versions_1 = require("../../utils/versions");
6
+ const version_utils_1 = require("../utils/version-utils");
6
7
  const lib_1 = require("./lib");
7
8
  async function setupMf(tree, rawOptions) {
8
9
  const options = (0, lib_1.normalizeOptions)(tree, rawOptions);
9
10
  const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.appName);
10
- let installTask = () => { };
11
+ const tasks = [];
11
12
  if (options.mfType === 'remote') {
12
13
  (0, lib_1.addRemoteToHost)(tree, {
13
14
  appName: options.appName,
@@ -19,13 +20,13 @@ async function setupMf(tree, rawOptions) {
19
20
  (0, lib_1.removeDeadCodeFromRemote)(tree, options);
20
21
  (0, lib_1.setupTspathForRemote)(tree, options);
21
22
  if (!options.skipPackageJson) {
22
- installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {
23
+ tasks.push((0, devkit_1.addDependenciesToPackageJson)(tree, {
23
24
  '@module-federation/enhanced': versions_1.moduleFederationEnhancedVersion,
24
25
  }, {
25
26
  '@nx/web': versions_1.nxVersion,
26
27
  '@nx/webpack': versions_1.nxVersion,
27
28
  '@nx/module-federation': versions_1.nxVersion,
28
- });
29
+ }));
29
30
  }
30
31
  }
31
32
  const remotesWithPorts = (0, lib_1.getRemotesWithPorts)(tree, options);
@@ -45,11 +46,11 @@ async function setupMf(tree, rawOptions) {
45
46
  });
46
47
  }
47
48
  if (!options.skipPackageJson) {
48
- installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
49
+ tasks.push((0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
49
50
  '@nx/webpack': versions_1.nxVersion,
50
51
  '@module-federation/enhanced': versions_1.moduleFederationEnhancedVersion,
51
52
  '@nx/module-federation': versions_1.nxVersion,
52
- });
53
+ }));
53
54
  }
54
55
  }
55
56
  (0, lib_1.fixBootstrap)(tree, projectConfig.root, options);
@@ -64,10 +65,19 @@ async function setupMf(tree, rawOptions) {
64
65
  if (!options.skipE2E) {
65
66
  (0, lib_1.addCypressOnErrorWorkaround)(tree, options);
66
67
  }
68
+ if (!options.skipPackageJson) {
69
+ const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
70
+ if (angularMajorVersion >= 20) {
71
+ const angularDevkitVersion = (0, version_utils_1.getInstalledAngularDevkitVersion)(tree) ??
72
+ (0, version_utils_1.versions)(tree).angularDevkitVersion;
73
+ // the executors used by MF require @angular-devkit/build-angular
74
+ tasks.push((0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@angular-devkit/build-angular': angularDevkitVersion }, undefined, true));
75
+ }
76
+ }
67
77
  // format files
68
78
  if (!options.skipFormat) {
69
79
  await (0, devkit_1.formatFiles)(tree);
70
80
  }
71
- return installTask;
81
+ return (0, devkit_1.runTasksInSerial)(...tasks);
72
82
  }
73
83
  exports.default = setupMf;
@@ -0,0 +1 @@
1
+ export { <%= rootModuleClassName %> as default } from './app/<%= rootModuleFileName.slice(0, -3) %>';
@@ -0,0 +1,12 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { provideServerRendering, withRoutes } from '@angular/ssr';
3
+ import { <%= appSymbolName %> } from './<%= appFileName %>';
4
+ import { AppModule } from './app<%= moduleTypeSeparator %>module';
5
+ import { serverRoutes } from './app.routes.server';
6
+
7
+ @NgModule({
8
+ imports: [AppModule],
9
+ providers: [provideServerRendering(withRoutes(serverRoutes))],
10
+ bootstrap: [<%= appSymbolName %>],
11
+ })
12
+ export class <%= rootModuleClassName %> {}
@@ -0,0 +1,8 @@
1
+ import { RenderMode, ServerRoute } from '@angular/ssr';
2
+
3
+ export const serverRoutes: ServerRoute[] = [
4
+ {
5
+ path: '**',
6
+ renderMode: RenderMode.Prerender
7
+ }
8
+ ];
@@ -0,0 +1,66 @@
1
+ import {
2
+ AngularNodeAppEngine,
3
+ createNodeRequestHandler,
4
+ isMainModule,
5
+ writeResponseToNodeResponse,
6
+ } from '@angular/ssr/node';
7
+ import express from 'express';
8
+ import { dirname, resolve } from 'node:path';
9
+ import { fileURLToPath } from 'node:url';
10
+
11
+ const serverDistFolder = dirname(fileURLToPath(import.meta.url));
12
+ const browserDistFolder = resolve(serverDistFolder, '../<%= browserDistDirectory %>');
13
+
14
+ const app = express();
15
+ const angularApp = new AngularNodeAppEngine();
16
+
17
+ /**
18
+ * Example Express Rest API endpoints can be defined here.
19
+ * Uncomment and define endpoints as necessary.
20
+ *
21
+ * Example:
22
+ * ```ts
23
+ * app.get('/api/**', (req, res) => {
24
+ * // Handle API request
25
+ * });
26
+ * ```
27
+ */
28
+
29
+ /**
30
+ * Serve static files from /<%= browserDistDirectory %>
31
+ */
32
+ app.use(
33
+ express.static(browserDistFolder, {
34
+ maxAge: '1y',
35
+ index: false,
36
+ redirect: false,
37
+ })
38
+ );
39
+
40
+ /**
41
+ * Handle all other requests by rendering the Angular application.
42
+ */
43
+ app.use('/**', (req, res, next) => {
44
+ angularApp
45
+ .handle(req)
46
+ .then((response) =>
47
+ response ? writeResponseToNodeResponse(response, res) : next()
48
+ )
49
+ .catch(next);
50
+ });
51
+
52
+ /**
53
+ * Start the server if this module is the main entry point.
54
+ * The server listens on the port defined by the `PORT` environment variable, or defaults to <%= serverPort %>.
55
+ */
56
+ if (isMainModule(import.meta.url)) {
57
+ const port = process.env['PORT'] || <%= serverPort %>;
58
+ app.listen(port, () => {
59
+ console.log(`Node Express server listening on http://localhost:${port}`);
60
+ });
61
+ }
62
+
63
+ /**
64
+ * Request handler used by the Angular CLI (for dev-server and during build) or Firebase Cloud Functions.
65
+ */
66
+ export const reqHandler = createNodeRequestHandler(app);