@nx/angular 22.2.4 → 22.3.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 (250) hide show
  1. package/executors.json +5 -0
  2. package/migrations.json +200 -291
  3. package/package.json +18 -18
  4. package/src/builders/dev-server/lib/normalize-options.d.ts.map +1 -1
  5. package/src/builders/dev-server/lib/normalize-options.js +1 -3
  6. package/src/builders/dev-server/lib/validate-options.d.ts.map +1 -1
  7. package/src/builders/dev-server/lib/validate-options.js +6 -5
  8. package/src/builders/dev-server/schema.d.ts +1 -0
  9. package/src/builders/dev-server/schema.json +9 -2
  10. package/src/executors/application/application.impl.js +1 -1
  11. package/src/executors/application/schema.json +11 -9
  12. package/src/executors/application/utils/normalize-options.d.ts.map +1 -1
  13. package/src/executors/application/utils/normalize-options.js +1 -27
  14. package/src/executors/application/utils/validate-options.d.ts.map +1 -1
  15. package/src/executors/application/utils/validate-options.js +0 -17
  16. package/src/executors/browser-esbuild/browser-esbuild.impl.js +1 -1
  17. package/src/executors/extract-i18n/extract-i18n.impl.js +1 -1
  18. package/src/executors/unit-test/schema.d.ts +7 -0
  19. package/src/executors/unit-test/schema.json +320 -0
  20. package/src/executors/unit-test/unit-test.impl.d.ts +5 -0
  21. package/src/executors/unit-test/unit-test.impl.d.ts.map +1 -0
  22. package/src/executors/unit-test/unit-test.impl.js +111 -0
  23. package/src/executors/utilities/ng-packagr/stylesheet-processor.d.ts.map +1 -0
  24. package/src/executors/utilities/ng-packagr/stylesheet-processor.di.d.ts.map +1 -1
  25. package/src/executors/utilities/ng-packagr/stylesheet-processor.di.js +2 -6
  26. package/src/executors/utilities/ng-packagr/{v19+/stylesheet-processor.js → stylesheet-processor.js} +2 -2
  27. package/src/generators/application/application.d.ts +1 -1
  28. package/src/generators/application/application.d.ts.map +1 -1
  29. package/src/generators/application/application.js +6 -1
  30. package/src/generators/application/files/base/tsconfig.app.json__tpl__ +2 -4
  31. package/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.spec.ts__tpl__ +2 -2
  32. package/src/generators/application/files/ng-module/src/app/app__componentFileSuffix__.ts__tpl__ +2 -2
  33. package/src/generators/application/files/ng-module/src/main.ts__tpl__ +1 -3
  34. package/src/generators/application/files/nx-welcome/claimed/ng-module/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ +2 -2
  35. package/src/generators/application/files/nx-welcome/claimed/standalone/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ +1 -2
  36. package/src/generators/application/files/nx-welcome/not-configured/ng-module/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ +2 -2
  37. package/src/generators/application/files/nx-welcome/not-configured/standalone/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ +1 -2
  38. package/src/generators/application/files/nx-welcome/unclaimed/ng-module/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ +2 -2
  39. package/src/generators/application/files/nx-welcome/unclaimed/standalone/src/app/nx-welcome__componentFileSuffix__.ts__tpl__ +1 -2
  40. package/src/generators/application/files/rspack-ssr/server.ts__tmpl__ +6 -0
  41. package/src/generators/application/files/standalone-components/src/app/app.config.ts__tpl__ +3 -3
  42. package/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.spec.ts__tpl__ +2 -2
  43. package/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.ts__tpl__ +1 -2
  44. package/src/generators/application/lib/add-unit-test-runner.d.ts +1 -1
  45. package/src/generators/application/lib/add-unit-test-runner.d.ts.map +1 -1
  46. package/src/generators/application/lib/add-unit-test-runner.js +13 -2
  47. package/src/generators/application/lib/create-files.d.ts.map +1 -1
  48. package/src/generators/application/lib/create-files.js +1 -3
  49. package/src/generators/application/lib/create-project.js +12 -10
  50. package/src/generators/application/lib/enable-strict-type-checking.js +1 -1
  51. package/src/generators/application/lib/index.d.ts +2 -1
  52. package/src/generators/application/lib/index.d.ts.map +1 -1
  53. package/src/generators/application/lib/index.js +2 -1
  54. package/src/generators/application/lib/normalize-options.d.ts.map +1 -1
  55. package/src/generators/application/lib/normalize-options.js +12 -2
  56. package/src/generators/application/lib/update-tsconfig-files.d.ts.map +1 -1
  57. package/src/generators/application/lib/update-tsconfig-files.js +6 -17
  58. package/src/generators/application/lib/validate-options.d.ts +4 -0
  59. package/src/generators/application/lib/validate-options.d.ts.map +1 -0
  60. package/src/generators/application/lib/validate-options.js +26 -0
  61. package/src/generators/application/schema.d.ts +1 -0
  62. package/src/generators/application/schema.json +7 -4
  63. package/src/generators/component/component.d.ts.map +1 -1
  64. package/src/generators/component/component.js +4 -3
  65. package/src/generators/component/files/__fileName__.spec.ts__tpl__ +1 -1
  66. package/src/generators/component/files/__fileName__.ts__tpl__ +1 -1
  67. package/src/generators/component-test/component-test.d.ts +3 -3
  68. package/src/generators/component-test/component-test.d.ts.map +1 -1
  69. package/src/generators/component-test/component-test.js +9 -0
  70. package/src/generators/component-test/schema.d.ts +1 -0
  71. package/src/generators/component-test/schema.json +6 -0
  72. package/src/generators/convert-to-rspack/convert-to-rspack.d.ts.map +1 -1
  73. package/src/generators/convert-to-rspack/convert-to-rspack.js +1 -4
  74. package/src/generators/cypress-component-configuration/cypress-component-configuration.d.ts.map +1 -1
  75. package/src/generators/cypress-component-configuration/cypress-component-configuration.js +50 -22
  76. package/src/generators/cypress-component-configuration/schema.d.ts +1 -0
  77. package/src/generators/cypress-component-configuration/schema.json +6 -0
  78. package/src/generators/directive/directive.d.ts.map +1 -1
  79. package/src/generators/directive/directive.js +0 -3
  80. package/src/generators/directive/files/__fileName__.ts__tpl__ +1 -1
  81. package/src/generators/federate-module/federate-module.d.ts +1 -1
  82. package/src/generators/federate-module/federate-module.d.ts.map +1 -1
  83. package/src/generators/federate-module/federate-module.js +8 -0
  84. package/src/generators/federate-module/lib/add-remote.js +1 -1
  85. package/src/generators/federate-module/schema.d.ts +2 -2
  86. package/src/generators/federate-module/schema.json +3 -4
  87. package/src/generators/host/files/common/src/main.server.ts__tmpl__ +8 -1
  88. package/src/generators/host/host.d.ts.map +1 -1
  89. package/src/generators/host/host.js +5 -1
  90. package/src/generators/host/lib/index.d.ts +1 -0
  91. package/src/generators/host/lib/index.d.ts.map +1 -1
  92. package/src/generators/host/lib/index.js +1 -0
  93. package/src/generators/host/lib/update-ssr-setup.d.ts.map +1 -1
  94. package/src/generators/host/lib/update-ssr-setup.js +6 -4
  95. package/src/generators/host/lib/validate-options.d.ts +4 -0
  96. package/src/generators/host/lib/validate-options.d.ts.map +1 -0
  97. package/src/generators/host/lib/validate-options.js +12 -0
  98. package/src/generators/host/schema.d.ts +2 -2
  99. package/src/generators/host/schema.json +5 -6
  100. package/src/generators/library/files/base/tsconfig.lib.json__tpl__ +3 -5
  101. package/src/generators/library/lib/normalize-options.d.ts.map +1 -1
  102. package/src/generators/library/lib/normalize-options.js +10 -3
  103. package/src/generators/library/lib/update-tsconfig-files.d.ts.map +1 -1
  104. package/src/generators/library/lib/update-tsconfig-files.js +15 -6
  105. package/src/generators/library/lib/validate-options.d.ts +4 -0
  106. package/src/generators/library/lib/validate-options.d.ts.map +1 -0
  107. package/src/generators/library/lib/validate-options.js +27 -0
  108. package/src/generators/library/library.d.ts.map +1 -1
  109. package/src/generators/library/library.js +20 -13
  110. package/src/generators/library/schema.json +3 -4
  111. package/src/generators/ng-add/migrators/builders/angular-build-unit-test.migrator.d.ts +16 -0
  112. package/src/generators/ng-add/migrators/builders/angular-build-unit-test.migrator.d.ts.map +1 -0
  113. package/src/generators/ng-add/migrators/builders/angular-build-unit-test.migrator.js +161 -0
  114. package/src/generators/ng-add/migrators/builders/index.d.ts +1 -0
  115. package/src/generators/ng-add/migrators/builders/index.d.ts.map +1 -1
  116. package/src/generators/ng-add/migrators/builders/index.js +1 -0
  117. package/src/generators/ng-add/migrators/projects/app.migrator.d.ts.map +1 -1
  118. package/src/generators/ng-add/migrators/projects/app.migrator.js +1 -0
  119. package/src/generators/ng-add/migrators/projects/lib.migrator.d.ts.map +1 -1
  120. package/src/generators/ng-add/migrators/projects/lib.migrator.js +1 -0
  121. package/src/generators/pipe/files/__fileName__.ts__tpl__ +1 -1
  122. package/src/generators/pipe/pipe.d.ts.map +1 -1
  123. package/src/generators/pipe/pipe.js +0 -5
  124. package/src/generators/remote/files/common/src/main.server.ts__tmpl__ +8 -1
  125. package/src/generators/remote/lib/index.d.ts +1 -0
  126. package/src/generators/remote/lib/index.d.ts.map +1 -1
  127. package/src/generators/remote/lib/index.js +1 -0
  128. package/src/generators/remote/lib/update-ssr-setup.d.ts +2 -1
  129. package/src/generators/remote/lib/update-ssr-setup.d.ts.map +1 -1
  130. package/src/generators/remote/lib/update-ssr-setup.js +7 -7
  131. package/src/generators/remote/lib/validate-options.d.ts +4 -0
  132. package/src/generators/remote/lib/validate-options.d.ts.map +1 -0
  133. package/src/generators/remote/lib/validate-options.js +12 -0
  134. package/src/generators/remote/remote.d.ts.map +1 -1
  135. package/src/generators/remote/remote.js +6 -1
  136. package/src/generators/remote/schema.d.ts +2 -2
  137. package/src/generators/remote/schema.json +5 -6
  138. package/src/generators/scam-to-standalone/lib/convert-scam-to-standalone.js +1 -1
  139. package/src/generators/setup-mf/files/entry-module-files/entry__componentFileSuffix__.ts__tmpl__ +2 -2
  140. package/src/generators/setup-mf/files/host-files/__appFileName__.spec.ts__tmpl__ +5 -6
  141. package/src/generators/setup-mf/files/standalone-entry-component-files/entry__componentFileSuffix__.ts__tmpl__ +1 -2
  142. package/src/generators/setup-mf/lib/add-remote-entry.d.ts.map +1 -1
  143. package/src/generators/setup-mf/lib/add-remote-entry.js +0 -5
  144. package/src/generators/setup-mf/lib/update-host-app-routes.d.ts.map +1 -1
  145. package/src/generators/setup-mf/lib/update-host-app-routes.js +9 -6
  146. package/src/generators/setup-ssr/files/v20+/application-builder/server/__serverFileName__ +2 -2
  147. package/src/generators/setup-ssr/files/v20+/server-builder/server/__serverFileName__ +6 -0
  148. package/src/generators/setup-ssr/lib/add-hydration.d.ts.map +1 -1
  149. package/src/generators/setup-ssr/lib/add-hydration.js +2 -8
  150. package/src/generators/setup-ssr/lib/add-server-file.d.ts.map +1 -1
  151. package/src/generators/setup-ssr/lib/add-server-file.js +7 -7
  152. package/src/generators/setup-ssr/lib/generate-files.d.ts.map +1 -1
  153. package/src/generators/setup-ssr/lib/generate-files.js +2 -7
  154. package/src/generators/setup-ssr/lib/generate-server-ts-config.d.ts.map +1 -1
  155. package/src/generators/setup-ssr/lib/generate-server-ts-config.js +26 -12
  156. package/src/generators/setup-ssr/lib/normalize-options.d.ts.map +1 -1
  157. package/src/generators/setup-ssr/lib/normalize-options.js +1 -5
  158. package/src/generators/setup-ssr/lib/update-project-config.d.ts.map +1 -1
  159. package/src/generators/setup-ssr/lib/update-project-config.js +6 -17
  160. package/src/generators/setup-ssr/lib/validate-options.d.ts.map +1 -1
  161. package/src/generators/setup-ssr/lib/validate-options.js +9 -0
  162. package/src/generators/utils/add-jest.d.ts +2 -0
  163. package/src/generators/utils/add-jest.d.ts.map +1 -1
  164. package/src/generators/utils/add-jest.js +41 -11
  165. package/src/generators/utils/add-vitest.d.ts +11 -2
  166. package/src/generators/utils/add-vitest.d.ts.map +1 -1
  167. package/src/generators/utils/add-vitest.js +173 -6
  168. package/src/generators/utils/assert-mf-utils.d.ts +1 -1
  169. package/src/generators/utils/assert-mf-utils.d.ts.map +1 -1
  170. package/src/generators/utils/assert-mf-utils.js +1 -4
  171. package/src/generators/utils/ensure-angular-dependencies.d.ts +1 -1
  172. package/src/generators/utils/ensure-angular-dependencies.d.ts.map +1 -1
  173. package/src/generators/utils/ensure-angular-dependencies.js +6 -4
  174. package/src/generators/utils/storybook-ast/component-info.js +2 -10
  175. package/src/generators/utils/tsconfig-utils.d.ts +13 -0
  176. package/src/generators/utils/tsconfig-utils.d.ts.map +1 -0
  177. package/src/generators/utils/tsconfig-utils.js +29 -0
  178. package/src/generators/utils/version-utils.d.ts +13 -3
  179. package/src/generators/utils/version-utils.d.ts.map +1 -1
  180. package/src/generators/utils/version-utils.js +11 -18
  181. package/src/migrations/update-22-3-0/update-angular-cli.d.ts +4 -0
  182. package/src/migrations/update-22-3-0/update-angular-cli.d.ts.map +1 -0
  183. package/src/migrations/{update-16-4-0 → update-22-3-0}/update-angular-cli.js +1 -1
  184. package/src/migrations/update-22-3-0/update-module-resolution.d.ts +3 -0
  185. package/src/migrations/update-22-3-0/update-module-resolution.d.ts.map +1 -0
  186. package/src/migrations/update-22-3-0/update-module-resolution.js +61 -0
  187. package/src/migrations/update-22-3-0/update-ssr-webpack-config.d.ts +3 -0
  188. package/src/migrations/update-22-3-0/update-ssr-webpack-config.d.ts.map +1 -0
  189. package/src/migrations/update-22-3-0/update-ssr-webpack-config.js +111 -0
  190. package/src/migrations/update-22-3-0/update-typescript-lib.d.ts +3 -0
  191. package/src/migrations/update-22-3-0/update-typescript-lib.d.ts.map +1 -0
  192. package/src/migrations/update-22-3-0/update-typescript-lib.js +98 -0
  193. package/src/migrations/update-22-3-0/update-unit-test-runner-option.d.ts +3 -0
  194. package/src/migrations/update-22-3-0/update-unit-test-runner-option.d.ts.map +1 -0
  195. package/src/migrations/update-22-3-0/update-unit-test-runner-option.js +44 -0
  196. package/src/plugins/plugin.d.ts.map +1 -1
  197. package/src/plugins/plugin.js +40 -24
  198. package/src/utils/backward-compatible-versions.d.ts +7 -9
  199. package/src/utils/backward-compatible-versions.d.ts.map +1 -1
  200. package/src/utils/backward-compatible-versions.js +20 -14
  201. package/src/utils/nx-devkit/ast-utils.d.ts.map +1 -1
  202. package/src/utils/nx-devkit/ast-utils.js +2 -13
  203. package/src/utils/targets.d.ts +6 -1
  204. package/src/utils/targets.d.ts.map +1 -1
  205. package/src/utils/targets.js +20 -3
  206. package/src/utils/test-runners.d.ts +2 -1
  207. package/src/utils/test-runners.d.ts.map +1 -1
  208. package/src/utils/test-runners.js +2 -1
  209. package/src/utils/version-utils.d.ts +2 -2
  210. package/src/utils/version-utils.d.ts.map +1 -1
  211. package/src/utils/version-utils.js +3 -2
  212. package/src/utils/versions.d.ts +7 -6
  213. package/src/utils/versions.d.ts.map +1 -1
  214. package/src/utils/versions.js +8 -7
  215. package/src/utils/zoneless.d.ts +3 -0
  216. package/src/utils/zoneless.d.ts.map +1 -0
  217. package/src/utils/zoneless.js +28 -0
  218. package/{mf/index.d.ts → types/nx-angular-mf.d.ts} +1 -1
  219. package/types/nx-angular-mf.d.ts.map +1 -0
  220. package/types/nx-angular.d.ts +3 -0
  221. package/types/nx-angular.d.ts.map +1 -0
  222. package/index.d.ts +0 -3
  223. package/index.d.ts.map +0 -1
  224. package/mf/index.d.ts.map +0 -1
  225. package/src/executors/utilities/ng-packagr/pre-v19/stylesheet-processor.d.ts +0 -28
  226. package/src/executors/utilities/ng-packagr/pre-v19/stylesheet-processor.d.ts.map +0 -1
  227. package/src/executors/utilities/ng-packagr/pre-v19/stylesheet-processor.js +0 -159
  228. package/src/executors/utilities/ng-packagr/v19+/stylesheet-processor.d.ts.map +0 -1
  229. package/src/generators/setup-ssr/files/pre-v19/ngmodule-src/__main__ +0 -1
  230. package/src/generators/setup-ssr/files/pre-v19/ngmodule-src/app/__rootModuleFileName__ +0 -14
  231. package/src/generators/setup-ssr/files/pre-v19/root/tsconfig.server.json__tpl__ +0 -15
  232. package/src/generators/setup-ssr/files/pre-v19/server/application-builder/__serverFileName__ +0 -57
  233. package/src/generators/setup-ssr/files/pre-v19/server/server-builder/__serverFileName__ +0 -72
  234. package/src/generators/setup-ssr/files/pre-v19/standalone-src/__main__ +0 -12
  235. package/src/generators/setup-ssr/files/pre-v19/standalone-src/app/app.config.server.ts__tpl__ +0 -11
  236. package/src/migrations/update-16-2-0/switch-data-persistence-operators-imports-to-ngrx-router-store.d.ts +0 -3
  237. package/src/migrations/update-16-2-0/switch-data-persistence-operators-imports-to-ngrx-router-store.d.ts.map +0 -1
  238. package/src/migrations/update-16-2-0/switch-data-persistence-operators-imports-to-ngrx-router-store.js +0 -122
  239. package/src/migrations/update-16-4-0/rename-angular-eslint-accesibility-rules.d.ts +0 -3
  240. package/src/migrations/update-16-4-0/rename-angular-eslint-accesibility-rules.d.ts.map +0 -1
  241. package/src/migrations/update-16-4-0/rename-angular-eslint-accesibility-rules.js +0 -34
  242. package/src/migrations/update-16-4-0/update-angular-cli.d.ts +0 -4
  243. package/src/migrations/update-16-4-0/update-angular-cli.d.ts.map +0 -1
  244. package/src/migrations/update-16-6-0/explicitly-set-projects-to-update-buildable-deps.d.ts +0 -3
  245. package/src/migrations/update-16-6-0/explicitly-set-projects-to-update-buildable-deps.d.ts.map +0 -1
  246. package/src/migrations/update-16-6-0/explicitly-set-projects-to-update-buildable-deps.js +0 -34
  247. package/src/migrations/update-16-7-0/update-angular-cli.d.ts +0 -4
  248. package/src/migrations/update-16-7-0/update-angular-cli.d.ts.map +0 -1
  249. package/src/migrations/update-16-7-0/update-angular-cli.js +0 -14
  250. /package/src/executors/utilities/ng-packagr/{v19+/stylesheet-processor.d.ts → stylesheet-processor.d.ts} +0 -0
@@ -4,8 +4,8 @@ exports.updateTsconfigFiles = updateTsconfigFiles;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const js_1 = require("@nx/js");
6
6
  const configuration_1 = require("@nx/js/src/utils/typescript/configuration");
7
- const ensure_typescript_1 = require("@nx/js/src/utils/typescript/ensure-typescript");
8
7
  const semver_1 = require("semver");
8
+ const tsconfig_utils_1 = require("../../utils/tsconfig-utils");
9
9
  const update_app_editor_tsconfig_excluded_files_1 = require("../../utils/update-app-editor-tsconfig-excluded-files");
10
10
  const version_utils_1 = require("../../utils/version-utils");
11
11
  const enable_strict_type_checking_1 = require("./enable-strict-type-checking");
@@ -16,24 +16,22 @@ function updateTsconfigFiles(tree, options) {
16
16
  skipLibCheck: true,
17
17
  experimentalDecorators: true,
18
18
  importHelpers: true,
19
+ isolatedModules: true,
19
20
  target: 'es2022',
20
21
  moduleResolution: 'bundler',
21
22
  };
22
23
  const rootTsConfigPath = (0, js_1.getRootTsConfigFileName)(tree);
23
24
  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
25
  if ((0, semver_1.gte)(angularVersion, '19.1.0')) {
31
26
  // Angular started warning about emitDecoratorMetadata and isolatedModules
32
27
  // in v19.1.0. If enabled in the root tsconfig, we need to disable it.
33
- if (shouldDisableEmitDecoratorMetadata(tree, rootTsConfigPath)) {
28
+ if ((0, tsconfig_utils_1.getDefinedCompilerOption)(tree, rootTsConfigPath, 'emitDecoratorMetadata') === true) {
34
29
  compilerOptions.emitDecoratorMetadata = false;
35
30
  }
36
31
  }
32
+ if (angularMajorVersion >= 21) {
33
+ compilerOptions.moduleResolution = 'bundler';
34
+ }
37
35
  if (angularMajorVersion >= 20) {
38
36
  compilerOptions.module = 'preserve';
39
37
  }
@@ -82,12 +80,3 @@ function updateEditorTsConfig(tree, options) {
82
80
  const project = (0, devkit_1.readProjectConfiguration)(tree, options.name);
83
81
  (0, update_app_editor_tsconfig_excluded_files_1.updateAppEditorTsConfigExcludedFiles)(tree, project);
84
82
  }
85
- function shouldDisableEmitDecoratorMetadata(tree, tsConfigPath) {
86
- const ts = (0, ensure_typescript_1.ensureTypescript)();
87
- const tsSysFromTree = {
88
- ...ts.sys,
89
- readFile: (path) => tree.read(path, 'utf-8'),
90
- };
91
- const parsed = ts.parseJsonConfigFileContent(ts.readConfigFile(tsConfigPath, tsSysFromTree.readFile).config, tsSysFromTree, tree.root);
92
- return parsed.options.emitDecoratorMetadata === true;
93
- }
@@ -0,0 +1,4 @@
1
+ import type { Tree } from '@nx/devkit';
2
+ import type { Schema } from '../schema';
3
+ export declare function validateOptions(tree: Tree, options: Schema): void;
4
+ //# sourceMappingURL=validate-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-options.d.ts","sourceRoot":"","sources":["../../../../../../../packages/angular/src/generators/application/lib/validate-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,QA6B1D"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateOptions = validateOptions;
4
+ const test_runners_1 = require("../../../utils/test-runners");
5
+ const version_utils_1 = require("../../utils/version-utils");
6
+ function validateOptions(tree, options) {
7
+ const { major: angularMajorVersion, version: angularVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
8
+ if (angularMajorVersion < 21) {
9
+ if (options.zoneless) {
10
+ throw new Error(`The "zoneless" option is only supported for Angular versions >= 21.0.0. You are using Angular ${angularVersion}.`);
11
+ }
12
+ }
13
+ if (options.unitTestRunner === test_runners_1.UnitTestRunner.VitestAngular) {
14
+ if (angularMajorVersion < 21) {
15
+ throw new Error(`The "vitest-angular" unit test runner requires Angular v21 or higher. ` +
16
+ `Detected Angular v${angularVersion}. Use "vitest-analog" or "jest" instead.`);
17
+ }
18
+ // Only fail if bundler is explicitly set to a non-esbuild value.
19
+ // If bundler is undefined, it will default to 'esbuild' for Angular v21+.
20
+ if (options.bundler && options.bundler !== 'esbuild') {
21
+ throw new Error(`The "vitest-angular" unit test runner requires the "esbuild" bundler ` +
22
+ `which uses the "@angular/build:application" executor. ` +
23
+ `Use "vitest-analog" or "jest" instead. Or use the "esbuild" bundler.`);
24
+ }
25
+ }
26
+ }
@@ -31,4 +31,5 @@ export interface Schema {
31
31
  serverRouting?: boolean;
32
32
  nxCloudToken?: string;
33
33
  addPlugin?: boolean;
34
+ zoneless?: boolean;
34
35
  }
@@ -99,10 +99,9 @@
99
99
  },
100
100
  "unitTestRunner": {
101
101
  "type": "string",
102
- "enum": ["jest", "vitest", "none"],
103
- "description": "Test runner to use for unit tests.",
104
- "x-prompt": "Which unit test runner would you like to use?",
105
- "default": "jest"
102
+ "enum": ["vitest-angular", "vitest-analog", "jest", "none"],
103
+ "description": "Test runner to use for unit tests. `vitest-angular` uses the `@angular/build:unit-test` executor (requires Angular v21+ and the `esbuild` bundler). `vitest-analog` uses AnalogJS-based setup with `@nx/vitest`. It defaults to `vitest-angular` when using the `esbuild` bundler for Angular versions >= 21.0.0, `vitest-analog` when using other bundlers on Angular >= 21.0.0, otherwise `jest`.",
104
+ "x-prompt": "Which unit test runner would you like to use?"
106
105
  },
107
106
  "e2eTestRunner": {
108
107
  "type": "string",
@@ -179,6 +178,10 @@
179
178
  "serverRouting": {
180
179
  "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
180
  "type": "boolean"
181
+ },
182
+ "zoneless": {
183
+ "description": "Generate an application that does not use `zone.js`. It defaults to `true`. _Note: this is only supported in Angular versions >= 21.0.0_",
184
+ "type": "boolean"
182
185
  }
183
186
  },
184
187
  "additionalProperties": false,
@@ -1 +1 @@
1
- {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/component/component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAUvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,iBA6FtE;AAED,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/component/component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAgBvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,iBA6FtE;AAED,eAAe,kBAAkB,CAAC"}
@@ -2,12 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.componentGenerator = componentGenerator;
4
4
  const devkit_1 = require("@nx/devkit");
5
+ const zoneless_1 = require("../../utils/zoneless");
5
6
  const utils_1 = require("../utils");
6
7
  const version_utils_1 = require("../utils/version-utils");
7
8
  const lib_1 = require("./lib");
8
9
  async function componentGenerator(tree, rawOptions) {
9
10
  const options = await (0, lib_1.normalizeOptions)(tree, rawOptions);
10
11
  const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
12
+ const project = (0, devkit_1.readProjectConfiguration)(tree, options.projectName);
13
+ const zoneless = (0, zoneless_1.isZonelessApp)(project);
11
14
  (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files'), options.directory, {
12
15
  name: options.name,
13
16
  fileName: options.fileName,
@@ -22,11 +25,9 @@ async function componentGenerator(tree, rawOptions) {
22
25
  viewEncapsulation: options.viewEncapsulation,
23
26
  displayBlock: options.displayBlock,
24
27
  selector: options.selector,
25
- // Angular v19 or higher defaults to true, while lower versions default to false
26
- setStandalone: (angularMajorVersion >= 19 && !options.standalone) ||
27
- (angularMajorVersion < 19 && options.standalone),
28
28
  angularMajorVersion,
29
29
  ngext: options.ngHtml ? '.ng' : '',
30
+ zoneless,
30
31
  tpl: '',
31
32
  });
32
33
  if (options.skipTests) {
@@ -12,7 +12,7 @@ describe('<%= symbolName %>', () => {
12
12
 
13
13
  fixture = TestBed.createComponent(<%= symbolName %>);
14
14
  component = fixture.componentInstance;
15
- fixture.detectChanges();
15
+ <%= zoneless ? 'await fixture.whenStable();' : 'fixture.detectChanges();' %>
16
16
  });
17
17
 
18
18
  it('should create', () => {
@@ -1,7 +1,7 @@
1
1
  import { <% if(changeDetection !== 'Default') { %>ChangeDetectionStrategy, <% }%>Component<% if(!!viewEncapsulation) { %>, ViewEncapsulation<% }%> } from '@angular/core';
2
2
 
3
3
  @Component({<% if(!skipSelector) {%>
4
- selector: '<%= selector %>',<%}%><% if (setStandalone) { %>
4
+ selector: '<%= selector %>',<%}%><% if (!standalone) { %>
5
5
  standalone: <%= standalone %>,<% } %>
6
6
  imports: [],<% if(inlineTemplate) { %>
7
7
  template: `<p><%= name %> works!</p>`<% } else { %>
@@ -1,5 +1,5 @@
1
- import { Tree } from '@nx/devkit';
2
- import { ComponentTestSchema } from './schema';
3
- export declare function componentTestGenerator(tree: Tree, options: ComponentTestSchema): Promise<void>;
1
+ import { type GeneratorCallback, type Tree } from '@nx/devkit';
2
+ import type { ComponentTestSchema } from './schema';
3
+ export declare function componentTestGenerator(tree: Tree, options: ComponentTestSchema): Promise<GeneratorCallback>;
4
4
  export default componentTestGenerator;
5
5
  //# sourceMappingURL=component-test.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"component-test.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/component-test/component-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,IAAI,EACL,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/C,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,mBAAmB,iBAuC7B;AAED,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"component-test.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/component-test/component-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,iBAAiB,EACtB,KAAK,IAAI,EACV,MAAM,YAAY,CAAC;AAOpB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,mBAAmB,8BAyD7B;AAED,eAAe,sBAAsB,CAAC"}
@@ -4,6 +4,7 @@ exports.componentTestGenerator = componentTestGenerator;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const versions_1 = require("../../utils/versions");
6
6
  const storybook_inputs_1 = require("../utils/storybook-ast/storybook-inputs");
7
+ const version_utils_1 = require("../utils/version-utils");
7
8
  async function componentTestGenerator(tree, options) {
8
9
  (0, devkit_1.ensurePackage)('@nx/cypress', versions_1.nxVersion);
9
10
  const { root } = (0, devkit_1.readProjectConfiguration)(tree, options.project);
@@ -21,8 +22,16 @@ async function componentTestGenerator(tree, options) {
21
22
  tpl: '',
22
23
  });
23
24
  }
25
+ const tasks = [];
26
+ if (!options.skipPackageJson) {
27
+ // Cypress CT still requires @angular/platform-browser-dynamic
28
+ tasks.push((0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
29
+ '@angular/platform-browser-dynamic': (0, version_utils_1.versions)(tree).angularVersion,
30
+ }, undefined, true));
31
+ }
24
32
  if (!options.skipFormat) {
25
33
  await (0, devkit_1.formatFiles)(tree);
26
34
  }
35
+ return (0, devkit_1.runTasksInSerial)(...tasks);
27
36
  }
28
37
  exports.default = componentTestGenerator;
@@ -9,4 +9,5 @@ export interface ComponentTestSchema {
9
9
  // something.component
10
10
  componentFileName: string;
11
11
  skipFormat?: boolean;
12
+ skipPackageJson?: boolean;
12
13
  }
@@ -41,6 +41,12 @@
41
41
  "type": "boolean",
42
42
  "default": false,
43
43
  "x-priority": "internal"
44
+ },
45
+ "skipPackageJson": {
46
+ "type": "boolean",
47
+ "default": false,
48
+ "description": "Do not add dependencies to `package.json`.",
49
+ "x-priority": "internal"
44
50
  }
45
51
  },
46
52
  "additionalProperties": false,
@@ -1 +1 @@
1
- {"version":3,"file":"convert-to-rspack.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/convert-to-rspack/convert-to-rspack.ts"],"names":[],"mappings":"AAAA,OAAO,EAcL,KAAK,iBAAiB,EAEtB,KAAK,IAAI,EACV,MAAM,YAAY,CAAC;AAapB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AA6StD,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,qBAAqB,8BAuZ9B;AAED,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"convert-to-rspack.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/convert-to-rspack/convert-to-rspack.ts"],"names":[],"mappings":"AAAA,OAAO,EAcL,KAAK,iBAAiB,EAEtB,KAAK,IAAI,EACV,MAAM,YAAY,CAAC;AAapB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AA6StD,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,qBAAqB,8BAiZ9B;AAED,eAAe,eAAe,CAAC"}
@@ -250,10 +250,6 @@ async function convertToRspack(tree, schema) {
250
250
  const targetsToRemove = [];
251
251
  let customWebpackConfigPath;
252
252
  (0, validate_supported_executor_1.validateSupportedBuildExecutor)(Object.values(project.targets));
253
- const angularRspackVersion = (0, version_utils_1.getAngularRspackVersion)(tree);
254
- if (!angularRspackVersion) {
255
- throw new Error('Angular Rspack requires Angular 19 or higher. Please upgrade your Angular version before converting to Rspack.');
256
- }
257
253
  let projectServePort = DEFAULT_PORT;
258
254
  const projectServeConfigurationOptions = {};
259
255
  for (const [targetName, target] of Object.entries(project.targets)) {
@@ -508,6 +504,7 @@ async function convertToRspack(tree, schema) {
508
504
  }
509
505
  if (!schema.skipInstall) {
510
506
  const { webpackMergeVersion, tsNodeVersion } = (0, version_utils_1.versions)(tree);
507
+ const angularRspackVersion = (0, version_utils_1.getAngularRspackVersion)(tree);
511
508
  const installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
512
509
  '@nx/angular-rspack': angularRspackVersion,
513
510
  'webpack-merge': webpackMergeVersion,
@@ -1 +1 @@
1
- {"version":3,"file":"cypress-component-configuration.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/cypress-component-configuration/cypress-component-configuration.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,iBAAiB,EAIjB,IAAI,EAEL,MAAM,YAAY,CAAC;AAWpB,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAgBxD;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,iBAAiB,CAAC,CAwB5B;AA0ID,eAAe,6BAA6B,CAAC"}
1
+ {"version":3,"file":"cypress-component-configuration.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/cypress-component-configuration/cypress-component-configuration.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,iBAAiB,EAMjB,IAAI,EAEL,MAAM,YAAY,CAAC;AAYpB,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAgBxD;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,iBAAiB,CAAC,CA+C5B;AAmJD,eAAe,6BAA6B,CAAC"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.cypressComponentConfiguration = cypressComponentConfiguration;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const path_1 = require("path");
6
+ const zoneless_1 = require("../../utils/zoneless");
6
7
  const versions_1 = require("../../utils/versions");
7
8
  const component_test_1 = require("../component-test/component-test");
8
9
  const component_info_1 = require("../utils/storybook-ast/component-info");
@@ -27,49 +28,76 @@ const esbuildExecutors = new Set([
27
28
  */
28
29
  async function cypressComponentConfiguration(tree, options) {
29
30
  const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.project);
31
+ // Cypress Component Testing requires Zone.js
32
+ let isZoneless;
33
+ if (projectConfig.projectType === 'application') {
34
+ // For applications, check the polyfills in the build target
35
+ isZoneless = (0, zoneless_1.isZonelessApp)(projectConfig);
36
+ }
37
+ else {
38
+ // For libraries, check if zone.js is installed in the workspace
39
+ isZoneless = (0, devkit_1.getDependencyVersionFromPackageJson)(tree, 'zone.js') === null;
40
+ }
41
+ if (isZoneless) {
42
+ throw new Error(`Cypress Component Testing doesn't support Zoneless Angular projects yet. ` +
43
+ `The project "${options.project}" is configured without Zone.js. ` +
44
+ `See https://github.com/cypress-io/cypress/issues/31504.`);
45
+ }
30
46
  const { componentConfigurationGenerator: baseCyCTConfig } = (0, devkit_1.ensurePackage)('@nx/cypress', versions_1.nxVersion);
31
- const installTask = await baseCyCTConfig(tree, {
47
+ const tasks = [];
48
+ tasks.push(await baseCyCTConfig(tree, {
32
49
  project: options.project,
33
50
  skipFormat: true,
34
51
  addPlugin: false,
35
52
  addExplicitTargets: true,
36
- });
53
+ skipPackageJson: options.skipPackageJson,
54
+ }));
37
55
  await configureCypressCT(tree, options);
38
- await addFiles(tree, projectConfig, options);
56
+ tasks.push(await addFiles(tree, projectConfig, options));
39
57
  if (projectConfig.projectType === 'application') {
40
58
  (0, update_app_editor_tsconfig_excluded_files_1.updateAppEditorTsConfigExcludedFiles)(tree, projectConfig);
41
59
  }
42
60
  if (!options.skipFormat) {
43
61
  await (0, devkit_1.formatFiles)(tree);
44
62
  }
45
- return installTask;
63
+ return (0, devkit_1.runTasksInSerial)(...tasks);
46
64
  }
47
65
  async function addFiles(tree, projectConfig, options) {
48
66
  const componentFile = (0, devkit_1.joinPathFragments)(projectConfig.root, 'cypress', 'support', 'component.ts');
49
67
  const { addMountDefinition } = require('@nx/cypress/src/utils/config');
50
68
  const updatedCmpContents = await addMountDefinition(tree.read(componentFile, 'utf-8'));
51
69
  tree.write(componentFile, `import { mount } from 'cypress/angular';\n${updatedCmpContents}`);
52
- if (options.generateTests) {
53
- const entryPoints = (0, entry_point_1.getProjectEntryPoints)(tree, options.project);
54
- const componentInfo = [];
55
- for (const entryPoint of entryPoints) {
56
- const moduleFilePaths = (0, module_info_1.getModuleFilePaths)(tree, entryPoint);
57
- componentInfo.push(...(0, component_info_1.getComponentsInfo)(tree, entryPoint, moduleFilePaths, options.project), ...(0, component_info_1.getStandaloneComponentsInfo)(tree, entryPoint));
70
+ if (!options.generateTests) {
71
+ return () => { };
72
+ }
73
+ const entryPoints = (0, entry_point_1.getProjectEntryPoints)(tree, options.project);
74
+ const componentInfo = [];
75
+ for (const entryPoint of entryPoints) {
76
+ const moduleFilePaths = (0, module_info_1.getModuleFilePaths)(tree, entryPoint);
77
+ componentInfo.push(...(0, component_info_1.getComponentsInfo)(tree, entryPoint, moduleFilePaths, options.project), ...(0, component_info_1.getStandaloneComponentsInfo)(tree, entryPoint));
78
+ }
79
+ let ctTask;
80
+ for (const info of componentInfo) {
81
+ if (info === undefined) {
82
+ continue;
58
83
  }
59
- for (const info of componentInfo) {
60
- if (info === undefined) {
61
- continue;
62
- }
63
- const componentDirFromProjectRoot = (0, path_1.relative)(projectConfig.root, (0, devkit_1.joinPathFragments)(info.moduleFolderPath, info.path));
64
- await (0, component_test_1.componentTestGenerator)(tree, {
65
- project: options.project,
66
- componentName: info.name,
67
- componentDir: componentDirFromProjectRoot,
68
- componentFileName: info.componentFileName,
69
- skipFormat: true,
70
- });
84
+ const componentDirFromProjectRoot = (0, path_1.relative)(projectConfig.root, (0, devkit_1.joinPathFragments)(info.moduleFolderPath, info.path));
85
+ const task = await (0, component_test_1.componentTestGenerator)(tree, {
86
+ project: options.project,
87
+ componentName: info.name,
88
+ componentDir: componentDirFromProjectRoot,
89
+ componentFileName: info.componentFileName,
90
+ skipFormat: true,
91
+ skipPackageJson: options.skipPackageJson,
92
+ });
93
+ // the ct generator only installs one dependency, which will only be installed
94
+ // if !skipPackageJson and not already installed, so only the first run can
95
+ // result in a generator callback that would actually install the dependency
96
+ if (!ctTask) {
97
+ ctTask = task;
71
98
  }
72
99
  }
100
+ return ctTask ?? (() => { });
73
101
  }
74
102
  async function configureCypressCT(tree, options) {
75
103
  let found = { target: options.buildTarget, config: undefined };
@@ -3,4 +3,5 @@ export interface CypressComponentConfigSchema {
3
3
  generateTests: boolean;
4
4
  skipFormat?: boolean;
5
5
  buildTarget?: string;
6
+ skipPackageJson?: boolean;
6
7
  }
@@ -33,6 +33,12 @@
33
33
  "description": "Skip formatting files",
34
34
  "default": false,
35
35
  "x-priority": "internal"
36
+ },
37
+ "skipPackageJson": {
38
+ "type": "boolean",
39
+ "default": false,
40
+ "description": "Do not add dependencies to `package.json`.",
41
+ "x-priority": "internal"
36
42
  }
37
43
  },
38
44
  "required": ["project"],
@@ -1 +1 @@
1
- {"version":3,"file":"directive.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/directive/directive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAKvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAiDlE;AAED,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"directive.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/directive/directive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAKvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBA6ClE;AAED,eAAe,kBAAkB,CAAC"}
@@ -13,9 +13,6 @@ async function directiveGenerator(tree, schema) {
13
13
  symbolName: options.symbolName,
14
14
  fileName: options.fileName,
15
15
  standalone: options.standalone,
16
- // Angular v19 or higher defaults to true, while lower versions default to false
17
- setStandalone: (angularMajorVersion >= 19 && !options.standalone) ||
18
- (angularMajorVersion < 19 && options.standalone),
19
16
  tpl: '',
20
17
  });
21
18
  if (options.skipTests) {
@@ -1,7 +1,7 @@
1
1
  import { Directive } from '@angular/core';
2
2
 
3
3
  @Directive({
4
- selector: '[<%= selector %>]'<% if (setStandalone) { %>,
4
+ selector: '[<%= selector %>]'<% if (!standalone) { %>,
5
5
  standalone: <%= standalone %><% } %>
6
6
  })
7
7
  export class <%= symbolName %> {
@@ -1,5 +1,5 @@
1
1
  import { type Tree } from '@nx/devkit';
2
- import { type Schema } from './schema';
2
+ import type { Schema } from './schema';
3
3
  export declare function federateModuleGenerator(tree: Tree, schema: Schema): Promise<import("@nx/devkit").GeneratorCallback>;
4
4
  export default federateModuleGenerator;
5
5
  //# sourceMappingURL=federate-module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"federate-module.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/federate-module/federate-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,IAAI,EACV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAQvC,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,mDAyCvE;AAED,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"federate-module.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/federate-module/federate-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,IAAI,EACV,MAAM,YAAY,CAAC;AASpB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,mDAgDvE;AAED,eAAe,uBAAuB,CAAC"}
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.federateModuleGenerator = federateModuleGenerator;
4
4
  const devkit_1 = require("@nx/devkit");
5
+ const test_runners_1 = require("../../utils/test-runners");
6
+ const version_utils_1 = require("../utils/version-utils");
5
7
  const lib_1 = require("./lib");
6
8
  async function federateModuleGenerator(tree, schema) {
7
9
  if (!tree.exists(schema.path)) {
@@ -10,6 +12,12 @@ async function federateModuleGenerator(tree, schema) {
10
12
  Path: ${schema.path}`);
11
13
  }
12
14
  schema.standalone = schema.standalone ?? true;
15
+ const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
16
+ // federate-module uses webpack/rspack bundlers, so vitest-angular is not available
17
+ schema.unitTestRunner ??=
18
+ angularMajorVersion >= 21
19
+ ? test_runners_1.UnitTestRunner.VitestAnalog
20
+ : test_runners_1.UnitTestRunner.Jest;
13
21
  const { tasks, projectRoot, remoteName } = await (0, lib_1.addRemote)(tree, schema);
14
22
  (0, lib_1.addFileToRemoteTsconfig)(tree, remoteName, schema.path);
15
23
  (0, lib_1.addPathToExposes)(tree, {
@@ -16,7 +16,7 @@ async function addRemote(tree, schema) {
16
16
  directory: schema.remoteDirectory,
17
17
  host: schema.host,
18
18
  standalone: schema.standalone,
19
- unitTestRunner: schema.unitTestRunner ?? test_runners_1.UnitTestRunner.Jest,
19
+ unitTestRunner: schema.unitTestRunner,
20
20
  e2eTestRunner: schema.e2eTestRunner ?? test_runners_1.E2eTestRunner.Cypress,
21
21
  skipFormat: true,
22
22
  });
@@ -1,4 +1,4 @@
1
- import { UnitTestRunner, E2eTestRunner } from '../utils/testing';
1
+ import type { E2eTestRunner, UnitTestRunner } from '../../utils/test-runners';
2
2
 
3
3
  export interface Schema {
4
4
  name: string;
@@ -6,7 +6,7 @@ export interface Schema {
6
6
  remote: string;
7
7
  remoteDirectory?: string;
8
8
  host?: string;
9
- unitTestRunner?: UnitTestRunner;
9
+ unitTestRunner?: Exclude<UnitTestRunner, UnitTestRunner.VitestAngular>;
10
10
  e2eTestRunner?: E2eTestRunner;
11
11
  standalone?: boolean;
12
12
  skipFormat?: boolean;
@@ -57,10 +57,9 @@
57
57
  },
58
58
  "unitTestRunner": {
59
59
  "type": "string",
60
- "enum": ["jest", "vitest", "none"],
61
- "description": "Test runner to use for unit tests of the Producer (remote) if it needs to be created.",
62
- "x-prompt": "Which unit test runner would you like to use?",
63
- "default": "jest"
60
+ "enum": ["vitest-analog", "jest", "none"],
61
+ "description": "Test runner to use for unit tests of the Producer (remote) if it needs to be created. `vitest-analog` uses AnalogJS-based setup with `@nx/vitest`. It defaults to `vitest-analog` for Angular versions >= 21.0.0, otherwise `jest`.",
62
+ "x-prompt": "Which unit test runner would you like to use?"
64
63
  },
65
64
  "e2eTestRunner": {
66
65
  "type": "string",
@@ -1,9 +1,16 @@
1
+ <%_ if (!zoneless && angularMajorVersion < 21) { _%>
1
2
  import 'zone.js/node';
2
3
 
4
+ <%_ } _%>
3
5
  import { APP_BASE_HREF } from '@angular/common';
4
- import { CommonEngine } from '<%= commonEngineEntryPoint %>';
6
+ import { CommonEngine } from '@angular/ssr/node';
7
+ <%_ if (useDefaultImport) { _%>
8
+ import express from 'express';
9
+ import cors from 'cors';
10
+ <%_ } else { _%>
5
11
  import * as express from 'express';
6
12
  import * as cors from 'cors';
13
+ <%_ } _%>
7
14
  import { existsSync } from 'node:fs';
8
15
  import { join } from 'node:path';
9
16
  import<% if(standalone) { %> bootstrap <% } else { %> { AppServerModule } <% } %>from './bootstrap.server';
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/host/host.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,IAAI,EAEL,MAAM,YAAY,CAAC;AAepB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,mDAiIpD;AAED,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../../../../../packages/angular/src/generators/host/host.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,IAAI,EAEL,MAAM,YAAY,CAAC;AAgBpB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,mDAgIpD;AAED,eAAe,IAAI,CAAC"}
@@ -13,13 +13,17 @@ const setup_mf_1 = require("../setup-mf/setup-mf");
13
13
  const add_mf_env_to_inputs_1 = require("../utils/add-mf-env-to-inputs");
14
14
  const assert_mf_utils_1 = require("../utils/assert-mf-utils");
15
15
  const validations_1 = require("../utils/validations");
16
+ const version_utils_1 = require("../utils/version-utils");
16
17
  const lib_1 = require("./lib");
17
18
  async function host(tree, schema) {
18
19
  (0, validations_1.assertNotUsingTsSolutionSetup)(tree, 'host');
20
+ (0, lib_1.validateOptions)(tree, schema);
19
21
  // TODO: Replace with Rspack when confidence is high enough
20
22
  schema.bundler ??= 'webpack';
21
23
  const isRspack = schema.bundler === 'rspack';
22
- (0, assert_mf_utils_1.assertRspackIsCSR)(schema.bundler, schema.ssr ?? false, schema.serverRouting ?? false);
24
+ (0, assert_mf_utils_1.assertRspackIsCSR)(schema.bundler, schema.ssr ?? false);
25
+ const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
26
+ schema.zoneless ??= angularMajorVersion >= 21 ? true : false;
23
27
  const { typescriptConfiguration = true, ...options } = schema;
24
28
  options.standalone = options.standalone ?? true;
25
29
  const projects = (0, devkit_1.getProjects)(tree);
@@ -1,2 +1,3 @@
1
1
  export * from './update-ssr-setup';
2
+ export * from './validate-options';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../packages/angular/src/generators/host/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../packages/angular/src/generators/host/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC"}
@@ -2,3 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./update-ssr-setup"), exports);
5
+ tslib_1.__exportStar(require("./validate-options"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"update-ssr-setup.d.ts","sourceRoot":"","sources":["../../../../../../../packages/angular/src/generators/host/lib/update-ssr-setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAgBvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,uBAAuB,EAAE,OAAO,mDA8EjC"}
1
+ {"version":3,"file":"update-ssr-setup.d.ts","sourceRoot":"","sources":["../../../../../../../packages/angular/src/generators/host/lib/update-ssr-setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAevC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,uBAAuB,EAAE,OAAO,mDAyEjC"}
@@ -7,17 +7,19 @@ const path_1 = require("path");
7
7
  const versions_1 = require("../../../utils/versions");
8
8
  const version_utils_1 = require("../../utils/version-utils");
9
9
  async function updateSsrSetup(tree, options, appName, typescriptConfiguration) {
10
- const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
11
10
  let project = (0, devkit_1.readProjectConfiguration)(tree, appName);
12
11
  const sourceRoot = (0, ts_solution_setup_1.getProjectSourceRoot)(project, tree);
13
12
  tree.rename((0, devkit_1.joinPathFragments)(sourceRoot, 'main.server.ts'), (0, devkit_1.joinPathFragments)(sourceRoot, 'bootstrap.server.ts'));
14
- const pathToServerEntry = (0, devkit_1.joinPathFragments)(angularMajorVersion >= 19 ? sourceRoot : project.root, 'server.ts');
15
- tree.write(pathToServerEntry, `import('./${angularMajorVersion >= 19 ? '' : 'src/'}main.server');`);
13
+ const pathToServerEntry = (0, devkit_1.joinPathFragments)(sourceRoot, 'server.ts');
14
+ tree.write(pathToServerEntry, `import('./main.server');`);
15
+ const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
16
16
  (0, devkit_1.generateFiles)(tree, (0, path_1.join)(__dirname, '../files/common'), project.root, {
17
17
  appName,
18
18
  browserBundleOutput: project.targets.build.options.outputPath,
19
19
  standalone: options.standalone,
20
- commonEngineEntryPoint: angularMajorVersion >= 19 ? '@angular/ssr/node' : '@angular/ssr',
20
+ zoneless: options.zoneless,
21
+ useDefaultImport: angularMajorVersion >= 21,
22
+ angularMajorVersion,
21
23
  tmpl: '',
22
24
  });
23
25
  const pathToTemplateFiles = typescriptConfiguration ? 'ts' : 'js';
@@ -0,0 +1,4 @@
1
+ import type { Tree } from '@nx/devkit';
2
+ import type { Schema } from '../schema';
3
+ export declare function validateOptions(tree: Tree, options: Schema): void;
4
+ //# sourceMappingURL=validate-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-options.d.ts","sourceRoot":"","sources":["../../../../../../../packages/angular/src/generators/host/lib/validate-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,QAW1D"}