@angular/cli 22.2.1 → 22.3.0-next.0

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 (377) hide show
  1. package/bin/ng.js +7 -10
  2. package/bin/version.js +98 -0
  3. package/index.d.ts +19 -0
  4. package/lib/chunk-5AASRQKS.js +85 -0
  5. package/lib/chunk-A2VIYA2E.js +165 -0
  6. package/lib/chunk-CAZUOCTC.js +225 -0
  7. package/lib/chunk-DHWVZMLH.js +206 -0
  8. package/lib/chunk-FZ5GFCWU.js +483 -0
  9. package/lib/chunk-G7TRU43D.js +42 -0
  10. package/lib/chunk-GHUUJYOY.js +40 -0
  11. package/lib/chunk-JBLF2TH3.js +267 -0
  12. package/lib/chunk-Q67GOPL7.js +380 -0
  13. package/lib/chunk-SN4KY4Z3.js +24 -0
  14. package/lib/chunk-XFL2J3CJ.js +24 -0
  15. package/lib/chunk-XG3HVNIL.js +59 -0
  16. package/lib/chunk-YM7ILCS5.js +2573 -0
  17. package/lib/cli/index.js +353 -105
  18. package/lib/cli-4CMZ6KMR.js +48 -0
  19. package/lib/cli-4Q7DGTBA.js +33 -0
  20. package/lib/cli-6AHY7ADW.js +96 -0
  21. package/lib/cli-A5UAJDO6.js +135 -0
  22. package/lib/cli-ACLGUIBI.js +2531 -0
  23. package/lib/cli-BQRFWIMG.js +35 -0
  24. package/lib/cli-CWICUPZW.js +42 -0
  25. package/lib/cli-DWQUM3M2.js +29 -0
  26. package/lib/cli-L4TM4JH3.js +88 -0
  27. package/lib/cli-LYBZEMDR.js +96 -0
  28. package/lib/cli-PDCEX7HQ.js +605 -0
  29. package/lib/cli-PJVTDBQM.js +51 -0
  30. package/lib/cli-PRIRL3WP.js +185 -0
  31. package/lib/cli-PU5VH7JB.js +189 -0
  32. package/lib/cli-QUH44NUB.js +68 -0
  33. package/lib/cli-VVITNTBC.js +50 -0
  34. package/lib/cli-XM4L4PP4.js +1651 -0
  35. package/lib/cli-Y2ECUR33.js +33 -0
  36. package/lib/cli-YDSMJOSO.js +182 -0
  37. package/lib/color-SJPGXZVA.js +8 -0
  38. package/lib/config/schema.json +204 -0
  39. package/lib/config-QXK7SSVG.js +22 -0
  40. package/lib/init.js +91 -180
  41. package/package.json +20 -15
  42. package/lib/cli/index.d.ts +0 -11
  43. package/lib/cli/index.js.map +0 -1
  44. package/lib/config/workspace-schema.d.ts +0 -1025
  45. package/lib/config/workspace-schema.js +0 -131
  46. package/lib/config/workspace-schema.js.map +0 -1
  47. package/lib/init.d.ts +0 -8
  48. package/lib/init.js.map +0 -1
  49. package/src/analytics/analytics-collector.d.ts +0 -35
  50. package/src/analytics/analytics-collector.js +0 -195
  51. package/src/analytics/analytics-collector.js.map +0 -1
  52. package/src/analytics/analytics-parameters.d.ts +0 -101
  53. package/src/analytics/analytics-parameters.js +0 -107
  54. package/src/analytics/analytics-parameters.js.map +0 -1
  55. package/src/analytics/analytics.d.ts +0 -27
  56. package/src/analytics/analytics.js +0 -183
  57. package/src/analytics/analytics.js.map +0 -1
  58. package/src/command-builder/architect-base-command-module.d.ts +0 -30
  59. package/src/command-builder/architect-base-command-module.js +0 -244
  60. package/src/command-builder/architect-base-command-module.js.map +0 -1
  61. package/src/command-builder/architect-command-module.d.ts +0 -28
  62. package/src/command-builder/architect-command-module.js +0 -218
  63. package/src/command-builder/architect-command-module.js.map +0 -1
  64. package/src/command-builder/command-module.d.ts +0 -73
  65. package/src/command-builder/command-module.js +0 -260
  66. package/src/command-builder/command-module.js.map +0 -1
  67. package/src/command-builder/command-runner.d.ts +0 -9
  68. package/src/command-builder/command-runner.js +0 -202
  69. package/src/command-builder/command-runner.js.map +0 -1
  70. package/src/command-builder/definitions.d.ts +0 -41
  71. package/src/command-builder/definitions.js +0 -20
  72. package/src/command-builder/definitions.js.map +0 -1
  73. package/src/command-builder/schematics-command-module.d.ts +0 -41
  74. package/src/command-builder/schematics-command-module.js +0 -408
  75. package/src/command-builder/schematics-command-module.js.map +0 -1
  76. package/src/command-builder/utilities/command.d.ts +0 -13
  77. package/src/command-builder/utilities/command.js +0 -39
  78. package/src/command-builder/utilities/command.js.map +0 -1
  79. package/src/command-builder/utilities/json-help.d.ts +0 -37
  80. package/src/command-builder/utilities/json-help.js +0 -92
  81. package/src/command-builder/utilities/json-help.js.map +0 -1
  82. package/src/command-builder/utilities/json-schema.d.ts +0 -64
  83. package/src/command-builder/utilities/json-schema.js +0 -349
  84. package/src/command-builder/utilities/json-schema.js.map +0 -1
  85. package/src/command-builder/utilities/normalize-options-middleware.d.ts +0 -18
  86. package/src/command-builder/utilities/normalize-options-middleware.js +0 -37
  87. package/src/command-builder/utilities/normalize-options-middleware.js.map +0 -1
  88. package/src/command-builder/utilities/schematic-engine-host.d.ts +0 -15
  89. package/src/command-builder/utilities/schematic-engine-host.js +0 -179
  90. package/src/command-builder/utilities/schematic-engine-host.js.map +0 -1
  91. package/src/command-builder/utilities/schematic-workflow.d.ts +0 -14
  92. package/src/command-builder/utilities/schematic-workflow.js +0 -70
  93. package/src/command-builder/utilities/schematic-workflow.js.map +0 -1
  94. package/src/commands/add/cli.d.ts +0 -41
  95. package/src/commands/add/cli.js +0 -705
  96. package/src/commands/add/cli.js.map +0 -1
  97. package/src/commands/add/long-description.md +0 -7
  98. package/src/commands/analytics/cli.d.ts +0 -16
  99. package/src/commands/analytics/cli.js +0 -34
  100. package/src/commands/analytics/cli.js.map +0 -1
  101. package/src/commands/analytics/info/cli.d.ts +0 -16
  102. package/src/commands/analytics/info/cli.js +0 -25
  103. package/src/commands/analytics/info/cli.js.map +0 -1
  104. package/src/commands/analytics/long-description.md +0 -20
  105. package/src/commands/analytics/settings/cli.d.ts +0 -35
  106. package/src/commands/analytics/settings/cli.js +0 -54
  107. package/src/commands/analytics/settings/cli.js.map +0 -1
  108. package/src/commands/build/cli.d.ts +0 -16
  109. package/src/commands/build/cli.js +0 -21
  110. package/src/commands/build/cli.js.map +0 -1
  111. package/src/commands/build/long-description.md +0 -18
  112. package/src/commands/cache/clean/cli.d.ts +0 -17
  113. package/src/commands/cache/clean/cli.js +0 -32
  114. package/src/commands/cache/clean/cli.js.map +0 -1
  115. package/src/commands/cache/cli.d.ts +0 -17
  116. package/src/commands/cache/cli.js +0 -36
  117. package/src/commands/cache/cli.js.map +0 -1
  118. package/src/commands/cache/info/cli.d.ts +0 -20
  119. package/src/commands/cache/info/cli.js +0 -139
  120. package/src/commands/cache/info/cli.js.map +0 -1
  121. package/src/commands/cache/long-description.md +0 -53
  122. package/src/commands/cache/settings/cli.d.ts +0 -27
  123. package/src/commands/cache/settings/cli.js +0 -41
  124. package/src/commands/cache/settings/cli.js.map +0 -1
  125. package/src/commands/cache/utilities.d.ts +0 -11
  126. package/src/commands/cache/utilities.js +0 -90
  127. package/src/commands/cache/utilities.js.map +0 -1
  128. package/src/commands/command-config.d.ts +0 -17
  129. package/src/commands/command-config.js +0 -116
  130. package/src/commands/command-config.js.map +0 -1
  131. package/src/commands/completion/cli.d.ts +0 -16
  132. package/src/commands/completion/cli.js +0 -61
  133. package/src/commands/completion/cli.js.map +0 -1
  134. package/src/commands/completion/long-description.md +0 -67
  135. package/src/commands/config/cli.d.ts +0 -24
  136. package/src/commands/config/cli.js +0 -150
  137. package/src/commands/config/cli.js.map +0 -1
  138. package/src/commands/config/long-description.md +0 -13
  139. package/src/commands/deploy/cli.d.ts +0 -17
  140. package/src/commands/deploy/cli.js +0 -38
  141. package/src/commands/deploy/cli.js.map +0 -1
  142. package/src/commands/deploy/long-description.md +0 -22
  143. package/src/commands/e2e/cli.d.ts +0 -18
  144. package/src/commands/e2e/cli.js +0 -42
  145. package/src/commands/e2e/cli.js.map +0 -1
  146. package/src/commands/extract-i18n/cli.d.ts +0 -17
  147. package/src/commands/extract-i18n/cli.js +0 -48
  148. package/src/commands/extract-i18n/cli.js.map +0 -1
  149. package/src/commands/generate/cli.d.ts +0 -47
  150. package/src/commands/generate/cli.js +0 -189
  151. package/src/commands/generate/cli.js.map +0 -1
  152. package/src/commands/lint/cli.d.ts +0 -17
  153. package/src/commands/lint/cli.js +0 -25
  154. package/src/commands/lint/cli.js.map +0 -1
  155. package/src/commands/lint/long-description.md +0 -20
  156. package/src/commands/make-this-awesome/cli.d.ts +0 -17
  157. package/src/commands/make-this-awesome/cli.js +0 -36
  158. package/src/commands/make-this-awesome/cli.js.map +0 -1
  159. package/src/commands/mcp/cli.d.ts +0 -21
  160. package/src/commands/mcp/cli.js +0 -74
  161. package/src/commands/mcp/cli.js.map +0 -1
  162. package/src/commands/mcp/constants.d.ts +0 -10
  163. package/src/commands/mcp/constants.js +0 -16
  164. package/src/commands/mcp/constants.js.map +0 -1
  165. package/src/commands/mcp/devserver.d.ts +0 -85
  166. package/src/commands/mcp/devserver.js +0 -109
  167. package/src/commands/mcp/devserver.js.map +0 -1
  168. package/src/commands/mcp/host.d.ts +0 -103
  169. package/src/commands/mcp/host.js +0 -270
  170. package/src/commands/mcp/host.js.map +0 -1
  171. package/src/commands/mcp/mcp-server.d.ts +0 -38
  172. package/src/commands/mcp/mcp-server.js +0 -176
  173. package/src/commands/mcp/mcp-server.js.map +0 -1
  174. package/src/commands/mcp/resources/ai-tutor.md +0 -822
  175. package/src/commands/mcp/resources/best-practices.md +0 -59
  176. package/src/commands/mcp/resources/instructions.d.ts +0 -9
  177. package/src/commands/mcp/resources/instructions.js +0 -26
  178. package/src/commands/mcp/resources/instructions.js.map +0 -1
  179. package/src/commands/mcp/shared-options.d.ts +0 -12
  180. package/src/commands/mcp/shared-options.js +0 -22
  181. package/src/commands/mcp/shared-options.js.map +0 -1
  182. package/src/commands/mcp/tools/ai-tutor.d.ts +0 -12
  183. package/src/commands/mcp/tools/ai-tutor.js +0 -59
  184. package/src/commands/mcp/tools/ai-tutor.js.map +0 -1
  185. package/src/commands/mcp/tools/best-practices.d.ts +0 -13
  186. package/src/commands/mcp/tools/best-practices.js +0 -196
  187. package/src/commands/mcp/tools/best-practices.js.map +0 -1
  188. package/src/commands/mcp/tools/devserver/devserver-start.d.ts +0 -32
  189. package/src/commands/mcp/tools/devserver/devserver-start.js +0 -110
  190. package/src/commands/mcp/tools/devserver/devserver-start.js.map +0 -1
  191. package/src/commands/mcp/tools/devserver/devserver-stop.d.ts +0 -31
  192. package/src/commands/mcp/tools/devserver/devserver-stop.js +0 -69
  193. package/src/commands/mcp/tools/devserver/devserver-stop.js.map +0 -1
  194. package/src/commands/mcp/tools/devserver/devserver-wait-for-build.d.ts +0 -41
  195. package/src/commands/mcp/tools/devserver/devserver-wait-for-build.js +0 -105
  196. package/src/commands/mcp/tools/devserver/devserver-wait-for-build.js.map +0 -1
  197. package/src/commands/mcp/tools/doc-search.d.ts +0 -21
  198. package/src/commands/mcp/tools/doc-search.js +0 -307
  199. package/src/commands/mcp/tools/doc-search.js.map +0 -1
  200. package/src/commands/mcp/tools/onpush-zoneless-migration/analyze-for-unsupported-zone-uses.d.ts +0 -17
  201. package/src/commands/mcp/tools/onpush-zoneless-migration/analyze-for-unsupported-zone-uses.js +0 -62
  202. package/src/commands/mcp/tools/onpush-zoneless-migration/analyze-for-unsupported-zone-uses.js.map +0 -1
  203. package/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file.d.ts +0 -12
  204. package/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file.js +0 -70
  205. package/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file.js.map +0 -1
  206. package/src/commands/mcp/tools/onpush-zoneless-migration/migrate-test-file.d.ts +0 -12
  207. package/src/commands/mcp/tools/onpush-zoneless-migration/migrate-test-file.js +0 -60
  208. package/src/commands/mcp/tools/onpush-zoneless-migration/migrate-test-file.js.map +0 -1
  209. package/src/commands/mcp/tools/onpush-zoneless-migration/prompts.d.ts +0 -15
  210. package/src/commands/mcp/tools/onpush-zoneless-migration/prompts.js +0 -238
  211. package/src/commands/mcp/tools/onpush-zoneless-migration/prompts.js.map +0 -1
  212. package/src/commands/mcp/tools/onpush-zoneless-migration/send-debug-message.d.ts +0 -9
  213. package/src/commands/mcp/tools/onpush-zoneless-migration/send-debug-message.js +0 -14
  214. package/src/commands/mcp/tools/onpush-zoneless-migration/send-debug-message.js.map +0 -1
  215. package/src/commands/mcp/tools/onpush-zoneless-migration/ts-utils.d.ts +0 -36
  216. package/src/commands/mcp/tools/onpush-zoneless-migration/ts-utils.js +0 -135
  217. package/src/commands/mcp/tools/onpush-zoneless-migration/ts-utils.js.map +0 -1
  218. package/src/commands/mcp/tools/onpush-zoneless-migration/types.d.ts +0 -13
  219. package/src/commands/mcp/tools/onpush-zoneless-migration/types.js +0 -10
  220. package/src/commands/mcp/tools/onpush-zoneless-migration/types.js.map +0 -1
  221. package/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.d.ts +0 -16
  222. package/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.js +0 -215
  223. package/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.js.map +0 -1
  224. package/src/commands/mcp/tools/projects.d.ts +0 -48
  225. package/src/commands/mcp/tools/projects.js +0 -541
  226. package/src/commands/mcp/tools/projects.js.map +0 -1
  227. package/src/commands/mcp/tools/run-target/build-target-strategy.d.ts +0 -14
  228. package/src/commands/mcp/tools/run-target/build-target-strategy.js +0 -53
  229. package/src/commands/mcp/tools/run-target/build-target-strategy.js.map +0 -1
  230. package/src/commands/mcp/tools/run-target/generic-target-strategy.d.ts +0 -14
  231. package/src/commands/mcp/tools/run-target/generic-target-strategy.js +0 -63
  232. package/src/commands/mcp/tools/run-target/generic-target-strategy.js.map +0 -1
  233. package/src/commands/mcp/tools/run-target/options-serializer.d.ts +0 -13
  234. package/src/commands/mcp/tools/run-target/options-serializer.js +0 -41
  235. package/src/commands/mcp/tools/run-target/options-serializer.js.map +0 -1
  236. package/src/commands/mcp/tools/run-target/run-target.d.ts +0 -34
  237. package/src/commands/mcp/tools/run-target/run-target.js +0 -69
  238. package/src/commands/mcp/tools/run-target/run-target.js.map +0 -1
  239. package/src/commands/mcp/tools/run-target/strategy.d.ts +0 -15
  240. package/src/commands/mcp/tools/run-target/strategy.js +0 -10
  241. package/src/commands/mcp/tools/run-target/strategy.js.map +0 -1
  242. package/src/commands/mcp/tools/run-target/types.d.ts +0 -39
  243. package/src/commands/mcp/tools/run-target/types.js +0 -41
  244. package/src/commands/mcp/tools/run-target/types.js.map +0 -1
  245. package/src/commands/mcp/tools/run-target/unit-test-strategy.d.ts +0 -14
  246. package/src/commands/mcp/tools/run-target/unit-test-strategy.js +0 -56
  247. package/src/commands/mcp/tools/run-target/unit-test-strategy.js.map +0 -1
  248. package/src/commands/mcp/tools/tool-registry.d.ts +0 -40
  249. package/src/commands/mcp/tools/tool-registry.js +0 -40
  250. package/src/commands/mcp/tools/tool-registry.js.map +0 -1
  251. package/src/commands/mcp/utils.d.ts +0 -25
  252. package/src/commands/mcp/utils.js +0 -44
  253. package/src/commands/mcp/utils.js.map +0 -1
  254. package/src/commands/mcp/workspace-utils.d.ts +0 -55
  255. package/src/commands/mcp/workspace-utils.js +0 -181
  256. package/src/commands/mcp/workspace-utils.js.map +0 -1
  257. package/src/commands/new/cli.d.ts +0 -27
  258. package/src/commands/new/cli.js +0 -76
  259. package/src/commands/new/cli.js.map +0 -1
  260. package/src/commands/new/long-description.md +0 -15
  261. package/src/commands/run/cli.d.ts +0 -25
  262. package/src/commands/run/cli.js +0 -89
  263. package/src/commands/run/cli.js.map +0 -1
  264. package/src/commands/run/long-description.md +0 -10
  265. package/src/commands/serve/cli.d.ts +0 -16
  266. package/src/commands/serve/cli.js +0 -20
  267. package/src/commands/serve/cli.js.map +0 -1
  268. package/src/commands/test/cli.d.ts +0 -16
  269. package/src/commands/test/cli.js +0 -21
  270. package/src/commands/test/cli.js.map +0 -1
  271. package/src/commands/test/long-description.md +0 -2
  272. package/src/commands/update/cli.d.ts +0 -50
  273. package/src/commands/update/cli.js +0 -586
  274. package/src/commands/update/cli.js.map +0 -1
  275. package/src/commands/update/long-description.md +0 -22
  276. package/src/commands/update/update-resolver.d.ts +0 -75
  277. package/src/commands/update/update-resolver.js +0 -918
  278. package/src/commands/update/update-resolver.js.map +0 -1
  279. package/src/commands/update/utilities/cli-version.d.ts +0 -48
  280. package/src/commands/update/utilities/cli-version.js +0 -196
  281. package/src/commands/update/utilities/cli-version.js.map +0 -1
  282. package/src/commands/update/utilities/constants.d.ts +0 -12
  283. package/src/commands/update/utilities/constants.js +0 -16
  284. package/src/commands/update/utilities/constants.js.map +0 -1
  285. package/src/commands/update/utilities/git.d.ts +0 -36
  286. package/src/commands/update/utilities/git.js +0 -148
  287. package/src/commands/update/utilities/git.js.map +0 -1
  288. package/src/commands/update/utilities/migration.d.ts +0 -32
  289. package/src/commands/update/utilities/migration.js +0 -271
  290. package/src/commands/update/utilities/migration.js.map +0 -1
  291. package/src/commands/version/cli.d.ts +0 -36
  292. package/src/commands/version/cli.js +0 -117
  293. package/src/commands/version/cli.js.map +0 -1
  294. package/src/commands/version/version-info.d.ts +0 -46
  295. package/src/commands/version/version-info.js +0 -101
  296. package/src/commands/version/version-info.js.map +0 -1
  297. package/src/package-managers/discovery.d.ts +0 -23
  298. package/src/package-managers/discovery.js +0 -104
  299. package/src/package-managers/discovery.js.map +0 -1
  300. package/src/package-managers/error.d.ts +0 -43
  301. package/src/package-managers/error.js +0 -41
  302. package/src/package-managers/error.js.map +0 -1
  303. package/src/package-managers/factory.d.ts +0 -30
  304. package/src/package-managers/factory.js +0 -137
  305. package/src/package-managers/factory.js.map +0 -1
  306. package/src/package-managers/host.d.ts +0 -86
  307. package/src/package-managers/host.js +0 -91
  308. package/src/package-managers/host.js.map +0 -1
  309. package/src/package-managers/index.d.ts +0 -13
  310. package/src/package-managers/index.js +0 -17
  311. package/src/package-managers/index.js.map +0 -1
  312. package/src/package-managers/logger.d.ts +0 -27
  313. package/src/package-managers/logger.js +0 -10
  314. package/src/package-managers/logger.js.map +0 -1
  315. package/src/package-managers/package-manager-descriptor.d.ts +0 -269
  316. package/src/package-managers/package-manager-descriptor.js +0 -210
  317. package/src/package-managers/package-manager-descriptor.js.map +0 -1
  318. package/src/package-managers/package-manager.d.ts +0 -200
  319. package/src/package-managers/package-manager.js +0 -720
  320. package/src/package-managers/package-manager.js.map +0 -1
  321. package/src/package-managers/package-metadata.d.ts +0 -91
  322. package/src/package-managers/package-metadata.js +0 -10
  323. package/src/package-managers/package-metadata.js.map +0 -1
  324. package/src/package-managers/package-tree.d.ts +0 -23
  325. package/src/package-managers/package-tree.js +0 -10
  326. package/src/package-managers/package-tree.js.map +0 -1
  327. package/src/package-managers/parsers.d.ts +0 -167
  328. package/src/package-managers/parsers.js +0 -674
  329. package/src/package-managers/parsers.js.map +0 -1
  330. package/src/utilities/color.d.ts +0 -23
  331. package/src/utilities/color.js +0 -41
  332. package/src/utilities/color.js.map +0 -1
  333. package/src/utilities/completion.d.ts +0 -30
  334. package/src/utilities/completion.js +0 -270
  335. package/src/utilities/completion.js.map +0 -1
  336. package/src/utilities/config.d.ts +0 -38
  337. package/src/utilities/config.js +0 -368
  338. package/src/utilities/config.js.map +0 -1
  339. package/src/utilities/environment-options.d.ts +0 -25
  340. package/src/utilities/environment-options.js +0 -60
  341. package/src/utilities/environment-options.js.map +0 -1
  342. package/src/utilities/eol.d.ts +0 -20
  343. package/src/utilities/eol.js +0 -35
  344. package/src/utilities/eol.js.map +0 -1
  345. package/src/utilities/error.d.ts +0 -18
  346. package/src/utilities/error.js +0 -41
  347. package/src/utilities/error.js.map +0 -1
  348. package/src/utilities/find-up.d.ts +0 -21
  349. package/src/utilities/find-up.js +0 -67
  350. package/src/utilities/find-up.js.map +0 -1
  351. package/src/utilities/json-file.d.ts +0 -24
  352. package/src/utilities/json-file.js +0 -179
  353. package/src/utilities/json-file.js.map +0 -1
  354. package/src/utilities/log-file.d.ts +0 -13
  355. package/src/utilities/log-file.js +0 -28
  356. package/src/utilities/log-file.js.map +0 -1
  357. package/src/utilities/memoize.d.ts +0 -15
  358. package/src/utilities/memoize.js +0 -64
  359. package/src/utilities/memoize.js.map +0 -1
  360. package/src/utilities/node-version.d.ts +0 -21
  361. package/src/utilities/node-version.js +0 -65
  362. package/src/utilities/node-version.js.map +0 -1
  363. package/src/utilities/prettier.d.ts +0 -19
  364. package/src/utilities/prettier.js +0 -105
  365. package/src/utilities/prettier.js.map +0 -1
  366. package/src/utilities/project.d.ts +0 -8
  367. package/src/utilities/project.js +0 -81
  368. package/src/utilities/project.js.map +0 -1
  369. package/src/utilities/prompt.d.ts +0 -17
  370. package/src/utilities/prompt.js +0 -90
  371. package/src/utilities/prompt.js.map +0 -1
  372. package/src/utilities/tty.d.ts +0 -16
  373. package/src/utilities/tty.js +0 -23
  374. package/src/utilities/tty.js.map +0 -1
  375. package/src/utilities/version.d.ts +0 -16
  376. package/src/utilities/version.js +0 -26
  377. package/src/utilities/version.js.map +0 -1
@@ -0,0 +1,1651 @@
1
+ import {
2
+ writeErrorToLogFile
3
+ } from "./chunk-SN4KY4Z3.js";
4
+ import {
5
+ SchematicEngineHost,
6
+ formatFiles,
7
+ subscribeToWorkflow
8
+ } from "./chunk-JBLF2TH3.js";
9
+ import {
10
+ CommandModule,
11
+ CommandModuleError,
12
+ CommandScope,
13
+ askChoices,
14
+ isTTY
15
+ } from "./chunk-YM7ILCS5.js";
16
+ import {
17
+ VERSION,
18
+ disableVersionCheck
19
+ } from "./chunk-XG3HVNIL.js";
20
+ import {
21
+ colors
22
+ } from "./chunk-GHUUJYOY.js";
23
+ import {
24
+ assertIsError
25
+ } from "./chunk-FZ5GFCWU.js";
26
+
27
+ // packages/angular/cli/src/commands/update/cli.js
28
+ import { NodeWorkflow } from "@angular-devkit/schematics/tools";
29
+ import { Listr } from "listr2";
30
+ import { existsSync as existsSync3, promises as fs3 } from "node:fs";
31
+ import { Module, createRequire as createRequire2 } from "node:module";
32
+ import * as path3 from "node:path";
33
+ import npa2 from "npm-package-arg";
34
+
35
+ // packages/angular/cli/src/commands/update/long-description.md
36
+ var long_description_default = "Perform a basic update to the current stable release of the core framework and CLI by running the following command.\n\n```\nng update @angular/cli @angular/core\n```\n\nTo update to the next beta or pre-release version, use the `--next` option.\n\nTo update from one major version to another, use the format\n\n```\nng update @angular/cli@^<major_version> @angular/core@^<major_version>\n```\n\nWe recommend that you always update to the latest patch version, as it contains fixes we released since the initial major release.\nFor example, use the following command to take the latest 21.x.x version and use that to update.\n\n```\nng update @angular/cli@^21 @angular/core@^21\n```\n\nFor detailed information and guidance on updating your application, see the interactive [Angular Update Guide](/update-guide).\n";
37
+
38
+ // packages/angular/cli/src/commands/update/update-resolver.js
39
+ import { logging } from "@angular-devkit/core";
40
+ import { existsSync, promises as fs, readFileSync, realpathSync } from "node:fs";
41
+ import { createRequire } from "node:module";
42
+ import * as path from "node:path";
43
+ import npa from "npm-package-arg";
44
+ import * as semver from "semver";
45
+ var RegistryClient = class {
46
+ packageManager;
47
+ logger;
48
+ minReleaseAge;
49
+ getRegistryName;
50
+ metadataCache = /* @__PURE__ */ new Map();
51
+ manifestCache = /* @__PURE__ */ new Map();
52
+ constructor(packageManager, logger, minReleaseAge = 0, getRegistryName) {
53
+ this.packageManager = packageManager;
54
+ this.logger = logger;
55
+ this.minReleaseAge = minReleaseAge;
56
+ this.getRegistryName = getRegistryName;
57
+ }
58
+ async getMetadata(packageName) {
59
+ const registryName = this.getRegistryName ? this.getRegistryName(packageName) : packageName;
60
+ let promise = this.metadataCache.get(registryName);
61
+ if (!promise) {
62
+ promise = this.packageManager.getRegistryMetadata(registryName).catch((e) => {
63
+ this.metadataCache.delete(registryName);
64
+ throw e;
65
+ });
66
+ this.metadataCache.set(registryName, promise);
67
+ }
68
+ const metadata = await promise;
69
+ if (metadata && registryName !== packageName) {
70
+ return { ...metadata, name: packageName };
71
+ }
72
+ return metadata;
73
+ }
74
+ async getManifest(packageName, version) {
75
+ const registryName = this.getRegistryName ? this.getRegistryName(packageName) : packageName;
76
+ const key = `${registryName}@${version}`;
77
+ let promise = this.manifestCache.get(key);
78
+ if (!promise) {
79
+ promise = this.packageManager.getRegistryManifest(registryName, version).catch((e) => {
80
+ this.manifestCache.delete(key);
81
+ throw e;
82
+ });
83
+ this.manifestCache.set(key, promise);
84
+ }
85
+ const manifest = await promise;
86
+ if (manifest && registryName !== packageName) {
87
+ return { ...manifest, name: packageName };
88
+ }
89
+ return manifest;
90
+ }
91
+ };
92
+ function isReleaseAgeSatisfied(registryClient, metadata, version) {
93
+ const minReleaseAge = registryClient.minReleaseAge;
94
+ if (!minReleaseAge || !metadata.time) {
95
+ return true;
96
+ }
97
+ const publishTimeStr = metadata.time[version];
98
+ if (!publishTimeStr) {
99
+ return true;
100
+ }
101
+ const publishTime = Date.parse(publishTimeStr);
102
+ if (isNaN(publishTime)) {
103
+ return true;
104
+ }
105
+ return Date.now() - publishTime >= minReleaseAge;
106
+ }
107
+ async function getSatisfyingVersion(registryClient, metadata, range, next) {
108
+ const options = { includePrerelease: next || void 0 };
109
+ let candidates = metadata.versions.filter((v) => semver.satisfies(v, range, options));
110
+ candidates = candidates.filter((version) => isReleaseAgeSatisfied(registryClient, metadata, version));
111
+ const sorted = semver.rsort(candidates);
112
+ for (const version of sorted) {
113
+ const manifest = await registryClient.getManifest(metadata.name, version);
114
+ if (manifest && !manifest.deprecated) {
115
+ return version;
116
+ }
117
+ }
118
+ for (const version of sorted) {
119
+ const manifest = await registryClient.getManifest(metadata.name, version);
120
+ if (manifest) {
121
+ return version;
122
+ }
123
+ }
124
+ return null;
125
+ }
126
+ function angularMajorCompatGuarantee(range) {
127
+ let newRange = semver.validRange(range);
128
+ if (!newRange) {
129
+ return range;
130
+ }
131
+ let major = 1;
132
+ while (!semver.gtr(major + ".0.0", newRange)) {
133
+ major++;
134
+ if (major >= 99) {
135
+ return newRange;
136
+ }
137
+ }
138
+ newRange = range;
139
+ for (let minor = 0; minor < 20; minor++) {
140
+ newRange += ` || ^${major}.${minor}.0-alpha.0 `;
141
+ }
142
+ return semver.validRange(newRange) || range;
143
+ }
144
+ var knownPeerCompatibleList = {
145
+ "@angular/core": angularMajorCompatGuarantee
146
+ };
147
+ function _updatePeerVersion(infoMap, name, range) {
148
+ const maybePackageInfo = infoMap.get(name);
149
+ if (!maybePackageInfo) {
150
+ return range;
151
+ }
152
+ if (maybePackageInfo.target) {
153
+ name = maybePackageInfo.target.updateMetadata.packageGroupName || name;
154
+ } else {
155
+ name = maybePackageInfo.installed.updateMetadata.packageGroupName || name;
156
+ }
157
+ const maybeTransform = knownPeerCompatibleList[name];
158
+ if (maybeTransform) {
159
+ if (typeof maybeTransform == "function") {
160
+ return maybeTransform(range);
161
+ } else {
162
+ return maybeTransform;
163
+ }
164
+ }
165
+ return range;
166
+ }
167
+ function _validateForwardPeerDependencies(name, infoMap, logger) {
168
+ let error = false;
169
+ const info = infoMap.get(name);
170
+ if (!info || !info.target) {
171
+ return error;
172
+ }
173
+ const peerDependencies = info.target.packageJson.peerDependencies || {};
174
+ const peerDependenciesMeta = info.target.packageJson.peerDependenciesMeta || {};
175
+ for (const [peer, range] of Object.entries(peerDependencies)) {
176
+ const peerInfo = infoMap.get(peer);
177
+ if (!peerInfo) {
178
+ continue;
179
+ }
180
+ const isOptional = !!peerDependenciesMeta[peer]?.optional;
181
+ const resolvedRange = _updatePeerVersion(infoMap, peer, range);
182
+ const resolvedVersion = peerInfo.target ? peerInfo.target.version : peerInfo.installed.version;
183
+ if (!semver.satisfies(resolvedVersion, resolvedRange, { includePrerelease: true })) {
184
+ logger.error(`Package ${JSON.stringify(name)} has an incompatible peer dependency to ${JSON.stringify(peer)} (requires ${JSON.stringify(range)}, would install ${JSON.stringify(resolvedVersion)}).`);
185
+ error = error || !isOptional;
186
+ }
187
+ }
188
+ return error;
189
+ }
190
+ function _validateReversePeerDependencies(name, version, infoMap, logger, next) {
191
+ let error = false;
192
+ for (const [installed, installedInfo] of infoMap.entries()) {
193
+ const installedLogger = logger.createChild(installed);
194
+ installedLogger.debug(`${installed}...`);
195
+ const peers = (installedInfo.target || installedInfo.installed).packageJson.peerDependencies;
196
+ const peersMeta = (installedInfo.target || installedInfo.installed).packageJson.peerDependenciesMeta;
197
+ for (const [peer, range] of Object.entries(peers || {})) {
198
+ if (peer !== name) {
199
+ continue;
200
+ }
201
+ const isOptional = !!peersMeta?.[peer]?.optional;
202
+ const resolvedRange = _updatePeerVersion(infoMap, name, range);
203
+ if (!semver.satisfies(version, resolvedRange, { includePrerelease: next || void 0 })) {
204
+ logger.error(`Package ${JSON.stringify(installed)} has an incompatible peer dependency to ${JSON.stringify(name)} (requires ${JSON.stringify(range)}, would install ${JSON.stringify(version)}).`);
205
+ error = error || !isOptional;
206
+ }
207
+ }
208
+ }
209
+ return error;
210
+ }
211
+ function _validateUpdatePackages(infoMap, force, next, logger) {
212
+ logger.debug("Validating peer dependencies...");
213
+ let error = false;
214
+ for (const name of infoMap.keys()) {
215
+ const info = infoMap.get(name);
216
+ if (!info || !info.target) {
217
+ continue;
218
+ }
219
+ logger.debug(`Checking ${name}...`);
220
+ error = _validateForwardPeerDependencies(name, infoMap, logger) || error;
221
+ error = _validateReversePeerDependencies(name, info.target.version, infoMap, logger, next) || error;
222
+ }
223
+ if (error && !force) {
224
+ throw new Error("Incompatible peer dependencies found. See above for details. You can bypass this check using the --force option.");
225
+ }
226
+ }
227
+ function _getUpdateMetadata(packageJson, logger) {
228
+ const metadata = packageJson["ng-update"];
229
+ const result = {
230
+ packageGroup: {},
231
+ requirements: {}
232
+ };
233
+ if (!metadata || typeof metadata != "object" || Array.isArray(metadata)) {
234
+ return result;
235
+ }
236
+ if (metadata["packageGroup"]) {
237
+ const packageGroup = metadata["packageGroup"];
238
+ if (Array.isArray(packageGroup) && packageGroup.every((x) => typeof x == "string")) {
239
+ result.packageGroup = packageGroup.reduce((group, name) => {
240
+ group[name] = packageJson.version;
241
+ return group;
242
+ }, {});
243
+ } else if (typeof packageGroup == "object" && packageGroup !== null) {
244
+ result.packageGroup = Object.entries(packageGroup).reduce((group, [name, version]) => {
245
+ if (typeof version == "string") {
246
+ group[name] = version;
247
+ }
248
+ return group;
249
+ }, {});
250
+ } else {
251
+ logger.warn(`PackageGroup metadata for ${packageJson.name} is malformed. Ignoring.`);
252
+ }
253
+ }
254
+ if (typeof metadata["packageGroupName"] == "string") {
255
+ result.packageGroupName = metadata["packageGroupName"];
256
+ }
257
+ if (typeof metadata["migrations"] == "string") {
258
+ result.migrations = metadata["migrations"];
259
+ }
260
+ return result;
261
+ }
262
+ function isPnpActive(workspaceRoot) {
263
+ return process.versions.pnp !== void 0 || existsSync(path.join(workspaceRoot, ".pnp.cjs")) || existsSync(path.join(workspaceRoot, ".pnp.js"));
264
+ }
265
+ function findPackageJson(workspaceDir, packageName) {
266
+ if (isPnpActive(workspaceDir)) {
267
+ try {
268
+ const workspaceRequire = createRequire(path.join(workspaceDir, "package.json"));
269
+ return workspaceRequire.resolve(`${packageName}/package.json`);
270
+ } catch {
271
+ return void 0;
272
+ }
273
+ }
274
+ let currentDir = workspaceDir;
275
+ while (true) {
276
+ const candidatePath = path.join(currentDir, "node_modules", packageName, "package.json");
277
+ if (existsSync(candidatePath)) {
278
+ return realpathSync(candidatePath);
279
+ }
280
+ const parentDir = path.dirname(currentDir);
281
+ if (parentDir === currentDir) {
282
+ break;
283
+ }
284
+ currentDir = parentDir;
285
+ }
286
+ return void 0;
287
+ }
288
+ function getInstalledPackageJson(packageName, workspaceRoot) {
289
+ try {
290
+ const manifestPath = findPackageJson(workspaceRoot, packageName);
291
+ if (manifestPath) {
292
+ const content = readFileSync(manifestPath, "utf8");
293
+ return JSON.parse(content);
294
+ }
295
+ } catch {
296
+ }
297
+ return null;
298
+ }
299
+ function getInstalledVersion(packageName, workspaceRoot) {
300
+ const pkgJson = getInstalledPackageJson(packageName, workspaceRoot);
301
+ return pkgJson?.version ?? null;
302
+ }
303
+ function _buildLocalPackageInfo(name, allDependencies, workspaceRoot) {
304
+ const packageJsonRange = allDependencies.get(name);
305
+ if (!packageJsonRange) {
306
+ throw new Error(`Package ${JSON.stringify(name)} was not found in package.json.`);
307
+ }
308
+ const localPkgJson = getInstalledPackageJson(name, workspaceRoot);
309
+ if (!localPkgJson) {
310
+ throw new Error(`Package ${name} is not installed.`);
311
+ }
312
+ const installedVersion = localPkgJson.version;
313
+ const npmPackageJson = {
314
+ name,
315
+ versions: [installedVersion],
316
+ "dist-tags": {}
317
+ };
318
+ const logger = new logging.NullLogger();
319
+ return {
320
+ name,
321
+ npmPackageJson,
322
+ installed: {
323
+ version: installedVersion,
324
+ packageJson: localPkgJson,
325
+ updateMetadata: _getUpdateMetadata(localPkgJson, logger)
326
+ },
327
+ packageJsonRange
328
+ };
329
+ }
330
+ async function _buildPackageInfo(packages, allDependencies, npmPackageJson, workspaceRoot, registryClient, logger) {
331
+ const name = npmPackageJson.name;
332
+ const packageJsonRange = allDependencies.get(name);
333
+ if (!packageJsonRange) {
334
+ throw new Error(`Package ${JSON.stringify(name)} was not found in package.json.`);
335
+ }
336
+ const localPkgJson = getInstalledPackageJson(name, workspaceRoot);
337
+ let installedVersion = localPkgJson?.version;
338
+ if (!installedVersion) {
339
+ installedVersion = await getSatisfyingVersion(registryClient, npmPackageJson, packageJsonRange);
340
+ }
341
+ if (!installedVersion) {
342
+ throw new Error(`An unexpected error happened; could not determine version for package ${name}.`);
343
+ }
344
+ const installedPackageJson = localPkgJson || await registryClient.getManifest(name, installedVersion);
345
+ if (!installedPackageJson) {
346
+ throw new Error(`An unexpected error happened; package ${name} has no version ${installedVersion}.`);
347
+ }
348
+ let targetVersion = packages.get(name);
349
+ if (targetVersion) {
350
+ const distTags = npmPackageJson["dist-tags"] ?? {};
351
+ let resolvedVersion = distTags[targetVersion] ?? (targetVersion === "next" ? distTags["latest"] : void 0);
352
+ if (resolvedVersion && !isReleaseAgeSatisfied(registryClient, npmPackageJson, resolvedVersion)) {
353
+ resolvedVersion = void 0;
354
+ }
355
+ if (resolvedVersion) {
356
+ targetVersion = resolvedVersion;
357
+ } else {
358
+ targetVersion = await getSatisfyingVersion(registryClient, npmPackageJson, distTags[targetVersion] || targetVersion === "next" ? "*" : targetVersion);
359
+ }
360
+ }
361
+ if (targetVersion && semver.lte(targetVersion, installedVersion)) {
362
+ logger.debug(`Package ${name} already satisfied by package.json (${packageJsonRange}).`);
363
+ targetVersion = void 0;
364
+ }
365
+ let target;
366
+ if (targetVersion) {
367
+ const targetPackageJson = await registryClient.getManifest(name, targetVersion);
368
+ if (targetPackageJson) {
369
+ target = {
370
+ version: targetVersion,
371
+ packageJson: targetPackageJson,
372
+ updateMetadata: _getUpdateMetadata(targetPackageJson, logger)
373
+ };
374
+ }
375
+ }
376
+ return {
377
+ name,
378
+ npmPackageJson,
379
+ installed: {
380
+ version: installedVersion,
381
+ packageJson: installedPackageJson,
382
+ updateMetadata: _getUpdateMetadata(installedPackageJson, logger)
383
+ },
384
+ target,
385
+ packageJsonRange
386
+ };
387
+ }
388
+ function splitPackageName(pkg) {
389
+ let name = pkg;
390
+ let version;
391
+ if (pkg.startsWith("@")) {
392
+ const parts = pkg.split("@");
393
+ name = "@" + parts[1];
394
+ version = parts[2];
395
+ } else if (pkg.includes("@")) {
396
+ const parts = pkg.split("@");
397
+ name = parts[0];
398
+ version = parts[1];
399
+ }
400
+ return { name, version };
401
+ }
402
+ function _buildPackageList(options, allDependencies, logger) {
403
+ const packages = /* @__PURE__ */ new Map();
404
+ const inputPackages = options.packages ?? [];
405
+ if (inputPackages.length === 0) {
406
+ return packages;
407
+ }
408
+ for (const pkg of inputPackages) {
409
+ const { name: pkgName, version: pkgVersion } = splitPackageName(pkg);
410
+ if (!allDependencies.has(pkgName)) {
411
+ throw new Error(`Package ${JSON.stringify(pkgName)} is not in package.json.`);
412
+ }
413
+ let targetVersion = pkgVersion;
414
+ if (options.migrateOnly && !targetVersion && options.from) {
415
+ targetVersion = options.from;
416
+ }
417
+ packages.set(pkgName, targetVersion || (options.next ? "next" : "latest"));
418
+ }
419
+ return packages;
420
+ }
421
+ async function resolvePackageVersion(registryClient, metadata, range, next = false) {
422
+ const distTags = metadata["dist-tags"] ?? {};
423
+ let resolvedVersion = distTags[range] ?? (range === "next" ? distTags["latest"] : void 0);
424
+ if (resolvedVersion && !isReleaseAgeSatisfied(registryClient, metadata, resolvedVersion)) {
425
+ resolvedVersion = void 0;
426
+ }
427
+ if (resolvedVersion) {
428
+ return resolvedVersion;
429
+ }
430
+ return getSatisfyingVersion(registryClient, metadata, distTags[range] || range === "next" ? "*" : range, next);
431
+ }
432
+ async function _addPackageGroup(packages, allDependencies, metadata, registryClient, logger) {
433
+ const maybePackage = packages.get(metadata.name);
434
+ if (!maybePackage) {
435
+ return;
436
+ }
437
+ const distTags = metadata["dist-tags"] ?? {};
438
+ let version = maybePackage;
439
+ let resolvedVersion = distTags[version] ?? (version === "next" ? distTags["latest"] : void 0);
440
+ if (resolvedVersion && !isReleaseAgeSatisfied(registryClient, metadata, resolvedVersion)) {
441
+ resolvedVersion = void 0;
442
+ }
443
+ if (resolvedVersion) {
444
+ version = resolvedVersion;
445
+ } else {
446
+ version = await getSatisfyingVersion(registryClient, metadata, distTags[version] || version === "next" ? "*" : version) ?? version;
447
+ }
448
+ const packageJson = await registryClient.getManifest(metadata.name, version);
449
+ if (!packageJson) {
450
+ return;
451
+ }
452
+ const ngUpdateMetadata = packageJson["ng-update"];
453
+ if (!ngUpdateMetadata) {
454
+ return;
455
+ }
456
+ const packageGroup = ngUpdateMetadata["packageGroup"];
457
+ if (!packageGroup) {
458
+ return;
459
+ }
460
+ let packageGroupNormalized;
461
+ if (Array.isArray(packageGroup) && !packageGroup.some((x) => typeof x != "string")) {
462
+ packageGroupNormalized = packageGroup.reduce((acc, curr) => {
463
+ acc[curr] = version;
464
+ return acc;
465
+ }, {});
466
+ } else if (typeof packageGroup === "object" && packageGroup !== null) {
467
+ packageGroupNormalized = Object.entries(packageGroup).reduce((acc, [name, v]) => {
468
+ if (typeof v === "string") {
469
+ acc[name] = v;
470
+ }
471
+ return acc;
472
+ }, {});
473
+ } else {
474
+ logger.warn(`PackageGroup metadata for ${metadata.name} is malformed. Ignoring.`);
475
+ return;
476
+ }
477
+ for (const [member, memberVersion] of Object.entries(packageGroupNormalized)) {
478
+ if (packages.has(member)) {
479
+ continue;
480
+ }
481
+ if (allDependencies.has(member)) {
482
+ packages.set(member, memberVersion);
483
+ }
484
+ }
485
+ }
486
+ async function _addPeerDependencies(packages, allDependencies, npmPackageJson, workspaceRoot, registryClient, logger) {
487
+ const maybePackage = packages.get(npmPackageJson.name);
488
+ if (!maybePackage) {
489
+ return;
490
+ }
491
+ const distTags = npmPackageJson["dist-tags"] ?? {};
492
+ const version = distTags[maybePackage] || maybePackage;
493
+ const packageJson = await registryClient.getManifest(npmPackageJson.name, version);
494
+ if (!packageJson) {
495
+ return;
496
+ }
497
+ for (const [peer, range] of Object.entries(packageJson.peerDependencies || {})) {
498
+ if (packages.has(peer)) {
499
+ continue;
500
+ }
501
+ const installedVersion = getInstalledVersion(peer, workspaceRoot);
502
+ if (installedVersion) {
503
+ if (semver.satisfies(installedVersion, range)) {
504
+ continue;
505
+ }
506
+ } else {
507
+ const packageJsonRange = allDependencies.get(peer);
508
+ if (packageJsonRange) {
509
+ const peerMetadata = await registryClient.getMetadata(peer);
510
+ if (peerMetadata) {
511
+ const resolvedInstalledVersion = await getSatisfyingVersion(registryClient, peerMetadata, packageJsonRange);
512
+ if (resolvedInstalledVersion && semver.satisfies(resolvedInstalledVersion, range)) {
513
+ continue;
514
+ }
515
+ }
516
+ }
517
+ }
518
+ packages.set(peer, range);
519
+ }
520
+ }
521
+ function _formatVersion(v) {
522
+ if (v === void 0) {
523
+ return v;
524
+ }
525
+ if (semver.valid(v)) {
526
+ return v;
527
+ }
528
+ const coerced = semver.coerce(v);
529
+ return coerced ? coerced.toString() : void 0;
530
+ }
531
+ function getRegistryNameAndRange(name, specifier) {
532
+ try {
533
+ const result = npa.resolve(name, specifier);
534
+ if (result.type === "alias" && result.subSpec) {
535
+ return {
536
+ name: result.subSpec.name ?? name,
537
+ range: result.subSpec.fetchSpec ?? specifier
538
+ };
539
+ }
540
+ } catch {
541
+ }
542
+ return { name, range: specifier };
543
+ }
544
+ function isPkgFromRegistry(name, specifier) {
545
+ const result = npa.resolve(name, specifier);
546
+ return !!result.registry;
547
+ }
548
+ async function checkCatalogUpdates(normalizedPackages, packageJsonContent, registryClient, workspaceRoot, options) {
549
+ const catalogUpdates = [];
550
+ for (const requestedPkg of normalizedPackages) {
551
+ const { name: pkgName } = splitPackageName(requestedPkg);
552
+ const specifier = packageJsonContent.dependencies?.[pkgName] || packageJsonContent.devDependencies?.[pkgName] || packageJsonContent.peerDependencies?.[pkgName];
553
+ if (specifier?.startsWith("catalog:")) {
554
+ const current = getInstalledVersion(pkgName, workspaceRoot) ?? "unknown";
555
+ let target = "latest";
556
+ try {
557
+ const metadata = await registryClient.getMetadata(pkgName);
558
+ if (metadata) {
559
+ const resolved = await resolvePackageVersion(registryClient, metadata, options.next ? "next" : "latest", !!options.next);
560
+ target = resolved ?? "latest";
561
+ }
562
+ } catch {
563
+ }
564
+ catalogUpdates.push({ name: pkgName, current, target, specifier });
565
+ }
566
+ }
567
+ if (catalogUpdates.length > 0) {
568
+ const packageManagerName = options.packageManager ?? "your package manager";
569
+ const installCmd = packageManagerName === "yarn" ? "yarn install" : "pnpm install";
570
+ const updatesList = catalogUpdates.map((pkg) => ` - ${pkg.name} (${pkg.specifier}) -> Target version: ${pkg.target}`).join("\n");
571
+ const migrationCommands = catalogUpdates.map((pkg) => {
572
+ const fromVer = pkg.current === "unknown" ? "<current-version>" : pkg.current;
573
+ return ` ng update ${pkg.name} --migrate-only --from ${fromVer}`;
574
+ }).join("\n");
575
+ throw new Error(`The following packages to update are configured to use \`catalog:\`:
576
+ ${updatesList}
577
+
578
+ Because catalogs are shared across the monorepo, 'ng update' cannot modify them directly.
579
+ Please perform the following steps to update:
580
+ 1. Manually update the versions for these packages in your catalog configuration file (e.g., pnpm-workspace.yaml or .yarnrc.yml).
581
+ 2. Run '${installCmd}' to install the updated versions.
582
+ 3. Run the following command(s) from the workspace root to execute the migration schematics:
583
+ ${migrationCommands}`);
584
+ }
585
+ }
586
+ async function resolveUserUpdatePlan(options, packageManager, logger) {
587
+ const workspaceRoot = options.workspaceRoot ?? process.cwd();
588
+ const packageJsonPath = path.join(workspaceRoot, "package.json");
589
+ if (!existsSync(packageJsonPath)) {
590
+ throw new Error("Could not find a package.json. Are you in a Node project?");
591
+ }
592
+ const rawJson = readFileSync(packageJsonPath, "utf8");
593
+ const packageJsonContent = JSON.parse(rawJson);
594
+ const getDependencies = (deps) => Object.entries(deps ?? {}).map(([name, range]) => [name, range]);
595
+ const allRawDeps = [
596
+ ...getDependencies(packageJsonContent.dependencies),
597
+ ...getDependencies(packageJsonContent.devDependencies),
598
+ ...getDependencies(packageJsonContent.peerDependencies)
599
+ ];
600
+ const npmDeps = new Map(allRawDeps.filter(([name, specifier]) => {
601
+ try {
602
+ return isPkgFromRegistry(name, specifier);
603
+ } catch {
604
+ logger.warn(`Package ${name} was not found on the registry. Skipping.`);
605
+ return false;
606
+ }
607
+ }));
608
+ const packagesOption = options.packages ?? [];
609
+ const normalizedPackages = packagesOption.reduce((acc, curr) => {
610
+ return acc.concat(curr.split(","));
611
+ }, []);
612
+ options.packages = normalizedPackages;
613
+ if (options.migrateOnly && options.from) {
614
+ if (options.packages.length !== 1) {
615
+ throw new Error("--from requires that only a single package be passed.");
616
+ }
617
+ }
618
+ options.from = _formatVersion(options.from);
619
+ options.to = _formatVersion(options.to);
620
+ const usingYarn = options.packageManager === "yarn";
621
+ const minReleaseAge = await packageManager.getMinimumReleaseAge();
622
+ const getRegistryName = (name) => {
623
+ const specifier = npmDeps.get(name);
624
+ if (specifier) {
625
+ return getRegistryNameAndRange(name, specifier).name;
626
+ }
627
+ return name;
628
+ };
629
+ const registryClient = new RegistryClient(packageManager, logger, minReleaseAge, getRegistryName);
630
+ await checkCatalogUpdates(normalizedPackages, packageJsonContent, registryClient, workspaceRoot, options);
631
+ const packages = _buildPackageList(options, npmDeps, logger);
632
+ const getOrFetchPackageMetadata = async (packageName) => {
633
+ return registryClient.getMetadata(packageName);
634
+ };
635
+ if (packages.size === 0) {
636
+ await Promise.all(Array.from(npmDeps.keys(), (depName) => getOrFetchPackageMetadata(depName)));
637
+ } else {
638
+ let lastPackagesSize;
639
+ do {
640
+ lastPackagesSize = packages.size;
641
+ let lastGroupSize;
642
+ do {
643
+ lastGroupSize = packages.size;
644
+ for (const name of Array.from(packages.keys())) {
645
+ const metadata = await getOrFetchPackageMetadata(name);
646
+ const spec = packages.get(name);
647
+ if (metadata && spec) {
648
+ const resolvedVersion = await resolvePackageVersion(registryClient, metadata, spec, !!options.next);
649
+ if (resolvedVersion) {
650
+ packages.set(name, resolvedVersion);
651
+ }
652
+ await _addPackageGroup(packages, npmDeps, metadata, registryClient, logger);
653
+ }
654
+ }
655
+ } while (packages.size > lastGroupSize);
656
+ for (const name of Array.from(packages.keys())) {
657
+ const metadata = await getOrFetchPackageMetadata(name);
658
+ const spec = packages.get(name);
659
+ if (metadata && spec) {
660
+ const resolvedVersion = await resolvePackageVersion(registryClient, metadata, spec, !!options.next);
661
+ if (resolvedVersion) {
662
+ packages.set(name, resolvedVersion);
663
+ }
664
+ await _addPeerDependencies(packages, npmDeps, metadata, workspaceRoot, registryClient, logger);
665
+ }
666
+ }
667
+ } while (packages.size > lastPackagesSize);
668
+ }
669
+ const isListingUpdates = packages.size === 0;
670
+ const packageInfoEntries = await Promise.all(Array.from(npmDeps.keys(), async (depName) => {
671
+ const isUpdating = packages.has(depName);
672
+ const localPkgJson = getInstalledPackageJson(depName, workspaceRoot);
673
+ if (isListingUpdates || isUpdating || !localPkgJson) {
674
+ const metadata = await getOrFetchPackageMetadata(depName);
675
+ if (metadata) {
676
+ const info = await _buildPackageInfo(packages, npmDeps, metadata, workspaceRoot, registryClient, logger);
677
+ return [depName, info];
678
+ }
679
+ }
680
+ return [depName, _buildLocalPackageInfo(depName, npmDeps, workspaceRoot)];
681
+ }));
682
+ const packageInfoMap = new Map(packageInfoEntries);
683
+ const packagesToUpdate = /* @__PURE__ */ new Map();
684
+ const migrationsToRun = [];
685
+ if (packages.size > 0) {
686
+ if (!(options.migrateOnly && options.from && options.packages)) {
687
+ const sublog = new logging.LevelCapLogger("validation", logger.createChild(""), "warn");
688
+ _validateUpdatePackages(packageInfoMap, !!options.force, !!options.next, sublog);
689
+ for (const [name, info] of packageInfoMap.entries()) {
690
+ if (!info.target || !info.installed) {
691
+ continue;
692
+ }
693
+ packagesToUpdate.set(name, info.target.version);
694
+ if (info.target.updateMetadata.migrations) {
695
+ migrationsToRun.push({
696
+ package: name,
697
+ collection: info.target.updateMetadata.migrations,
698
+ from: info.installed.version,
699
+ to: info.target.version
700
+ });
701
+ }
702
+ }
703
+ }
704
+ }
705
+ return {
706
+ packagesToUpdate,
707
+ migrationsToRun,
708
+ packageInfoMap,
709
+ registryClient
710
+ };
711
+ }
712
+ async function printUpdateUsageMessage(infoMap, registryClient, logger, next = false) {
713
+ const packageGroups = /* @__PURE__ */ new Map();
714
+ const mappedPackages = await Promise.all(Array.from(infoMap.entries(), async ([name, info]) => {
715
+ const distTags = info.npmPackageJson["dist-tags"] ?? {};
716
+ let tag = next ? distTags["next"] ? "next" : "latest" : "latest";
717
+ let version = distTags[tag] ?? info.installed.version;
718
+ const versions = info.npmPackageJson.versions ?? [];
719
+ const versionDiff = semver.diff(info.installed.version, version);
720
+ if (versionDiff !== "patch" && versionDiff !== "minor" && /^@(?:angular|nguniversal)\//.test(name)) {
721
+ const installedMajorVersion = semver.parse(info.installed.version)?.major;
722
+ const toInstallMajorVersion = semver.parse(version)?.major;
723
+ if (installedMajorVersion !== void 0 && toInstallMajorVersion !== void 0 && installedMajorVersion < toInstallMajorVersion - 1) {
724
+ const nextMajorVersion = `${installedMajorVersion + 1}.`;
725
+ const nextMajorVersions = versions.filter((v) => v.startsWith(nextMajorVersion)).sort((a, b) => a > b ? -1 : 1);
726
+ if (nextMajorVersions.length) {
727
+ version = nextMajorVersions[0];
728
+ tag = "";
729
+ }
730
+ }
731
+ }
732
+ const target = info.target?.packageJson || await registryClient.getManifest(name, version);
733
+ return {
734
+ name,
735
+ info,
736
+ version,
737
+ tag,
738
+ target
739
+ };
740
+ }));
741
+ const packagesToUpdate = mappedPackages.filter(({ info, version, target }) => target?.["ng-update"] && semver.compare(info.installed.version, version) < 0).map(({ name, info, version, tag, target }) => {
742
+ const ngUpdate = target?.["ng-update"];
743
+ const packageGroup = ngUpdate?.["packageGroup"];
744
+ if (packageGroup) {
745
+ const packageGroupNames = Array.isArray(packageGroup) ? packageGroup : Object.keys(packageGroup);
746
+ const packageGroupName = ngUpdate?.["packageGroupName"] || packageGroupNames.find((n) => infoMap.has(n));
747
+ if (packageGroupName) {
748
+ if (packageGroups.has(name)) {
749
+ return null;
750
+ }
751
+ for (const groupName of packageGroupNames) {
752
+ packageGroups.set(groupName, packageGroupName);
753
+ }
754
+ packageGroups.set(packageGroupName, packageGroupName);
755
+ name = packageGroupName;
756
+ }
757
+ }
758
+ let command = `ng update ${name}`;
759
+ if (!tag) {
760
+ command += `@${semver.parse(version)?.major || version}`;
761
+ } else if (tag == "next") {
762
+ command += " --next";
763
+ }
764
+ return [name, `${info.installed.version} -> ${version} `, command];
765
+ }).filter((x) => x !== null).sort((a, b) => a[0].localeCompare(b[0]));
766
+ if (packagesToUpdate.length == 0) {
767
+ logger.info("We analyzed your package.json and everything seems to be in order. Good work!");
768
+ return;
769
+ }
770
+ logger.info("We analyzed your package.json, there are some packages to update:\n");
771
+ let namePad = Math.max(...[...infoMap.keys()].map((x) => x.length)) + 2;
772
+ if (!Number.isFinite(namePad)) {
773
+ namePad = 30;
774
+ }
775
+ const pads = [namePad, 25, 0];
776
+ logger.info(" " + ["Name", "Version", "Command to update"].map((x, i) => x.padEnd(pads[i])).join(""));
777
+ const totalWidth = pads.reduce((sum, width) => sum + width, 20);
778
+ logger.info(` ${"-".repeat(totalWidth)}`);
779
+ packagesToUpdate.forEach((fields) => {
780
+ if (!fields) {
781
+ return;
782
+ }
783
+ logger.info(" " + fields.map((x, i) => x.padEnd(pads[i])).join(""));
784
+ });
785
+ logger.info(`
786
+ There might be additional packages which don't provide 'ng update' capabilities that are outdated.
787
+ You can update the additional packages by running the update command of your package manager.`);
788
+ }
789
+ async function applyUpdatePlan(workspaceRoot, plan, logger) {
790
+ const packageJsonPath = path.join(workspaceRoot, "package.json");
791
+ const packageJsonContent = await fs.readFile(packageJsonPath, "utf8");
792
+ const packageJson = JSON.parse(packageJsonContent);
793
+ const updateDependency = (deps, name, newVersion) => {
794
+ const oldVersion = deps[name];
795
+ const aliasPrefix = "npm:";
796
+ if (oldVersion.startsWith(aliasPrefix)) {
797
+ const specifier = oldVersion.slice(aliasPrefix.length);
798
+ const lastAtIndex = specifier.lastIndexOf("@");
799
+ if (lastAtIndex > 0) {
800
+ const registryName = specifier.slice(0, lastAtIndex);
801
+ const versionRange = specifier.slice(lastAtIndex + 1);
802
+ const execResult = /^[\^~]/.exec(versionRange);
803
+ deps[name] = `${aliasPrefix}${registryName}@${execResult ? execResult[0] : ""}${newVersion}`;
804
+ } else {
805
+ deps[name] = oldVersion;
806
+ }
807
+ } else {
808
+ const execResult = /^[\^~]/.exec(oldVersion);
809
+ deps[name] = `${execResult ? execResult[0] : ""}${newVersion}`;
810
+ }
811
+ };
812
+ for (const [name, targetVersion] of plan.packagesToUpdate.entries()) {
813
+ logger.info(`Updating package.json with dependency ${name} to version ${targetVersion}...`);
814
+ if (packageJson.dependencies && packageJson.dependencies[name]) {
815
+ updateDependency(packageJson.dependencies, name, targetVersion);
816
+ if (packageJson.devDependencies) {
817
+ delete packageJson.devDependencies[name];
818
+ }
819
+ if (packageJson.peerDependencies) {
820
+ delete packageJson.peerDependencies[name];
821
+ }
822
+ } else if (packageJson.devDependencies && packageJson.devDependencies[name]) {
823
+ updateDependency(packageJson.devDependencies, name, targetVersion);
824
+ if (packageJson.peerDependencies) {
825
+ delete packageJson.peerDependencies[name];
826
+ }
827
+ } else if (packageJson.peerDependencies && packageJson.peerDependencies[name]) {
828
+ updateDependency(packageJson.peerDependencies, name, targetVersion);
829
+ } else {
830
+ if (!packageJson.dependencies) {
831
+ packageJson.dependencies = {};
832
+ }
833
+ packageJson.dependencies[name] = `^${targetVersion}`;
834
+ }
835
+ }
836
+ const eofMatches = packageJsonContent.match(/\r?\n$/);
837
+ const eof = eofMatches?.[0] ?? "";
838
+ const newContent = JSON.stringify(packageJson, null, 2) + eof;
839
+ await fs.writeFile(packageJsonPath, newContent, "utf8");
840
+ }
841
+
842
+ // packages/angular/cli/src/commands/update/utilities/cli-version.js
843
+ import { spawnSync } from "node:child_process";
844
+ import { existsSync as existsSync2, promises as fs2 } from "node:fs";
845
+ import { join as join2, resolve } from "node:path";
846
+ import * as semver2 from "semver";
847
+
848
+ // packages/angular/cli/src/commands/update/utilities/constants.js
849
+ var ANGULAR_PACKAGES_REGEXP = /^@(?:angular|nguniversal)\//;
850
+
851
+ // packages/angular/cli/src/commands/update/utilities/cli-version.js
852
+ function coerceVersionNumber(version) {
853
+ if (!version) {
854
+ return void 0;
855
+ }
856
+ if (!/^\d{1,30}\.\d{1,30}\.\d{1,30}/.test(version)) {
857
+ const match = version.match(/^\d{1,30}(\.\d{1,30})*/);
858
+ if (!match) {
859
+ return void 0;
860
+ }
861
+ if (!match[1]) {
862
+ version = version.substring(0, match[0].length) + ".0.0" + version.substring(match[0].length);
863
+ } else if (!match[2]) {
864
+ version = version.substring(0, match[0].length) + ".0" + version.substring(match[0].length);
865
+ } else {
866
+ return void 0;
867
+ }
868
+ }
869
+ return semver2.valid(version) ?? void 0;
870
+ }
871
+ async function checkCLIVersion(packagesToUpdate, logger, packageManager, next = false) {
872
+ const runnerVersion = getCLIUpdateRunnerVersion(packagesToUpdate, next);
873
+ const manifest = await packageManager.getManifest(`@angular/cli@${runnerVersion}`);
874
+ if (!manifest) {
875
+ logger.warn(`Could not find @angular/cli version '${runnerVersion}'.`);
876
+ return null;
877
+ }
878
+ const version = manifest.version;
879
+ return VERSION.full === version ? null : String(runnerVersion);
880
+ }
881
+ function getCLIUpdateRunnerVersion(packagesToUpdate, next) {
882
+ if (next) {
883
+ return "next";
884
+ }
885
+ const updatingAngularPackage = packagesToUpdate?.find((r) => ANGULAR_PACKAGES_REGEXP.test(r));
886
+ if (updatingAngularPackage) {
887
+ const tempVersion = coerceVersionNumber(updatingAngularPackage.split("@")[2]);
888
+ return semver2.parse(tempVersion)?.major ?? "latest";
889
+ }
890
+ return VERSION.major;
891
+ }
892
+ async function runTempBinary(packageName, packageManager, args = []) {
893
+ const { workingDirectory, cleanup } = await packageManager.acquireTempPackage(packageName);
894
+ try {
895
+ const packageNameNoVersion = packageName.substring(0, packageName.lastIndexOf("@"));
896
+ const pkgLocation = join2(workingDirectory, "node_modules", packageNameNoVersion);
897
+ const packageJsonPath = join2(pkgLocation, "package.json");
898
+ let binPath;
899
+ if (existsSync2(packageJsonPath)) {
900
+ const content = await fs2.readFile(packageJsonPath, "utf-8");
901
+ if (content) {
902
+ const { bin = {} } = JSON.parse(content);
903
+ const binKeys = Object.keys(bin);
904
+ if (binKeys.length) {
905
+ binPath = resolve(pkgLocation, bin[binKeys[0]]);
906
+ }
907
+ }
908
+ }
909
+ if (!binPath) {
910
+ throw new Error(`Cannot locate bin for temporary package: ${packageNameNoVersion}.`);
911
+ }
912
+ const { status, error } = spawnSync(process.execPath, [binPath, ...args], {
913
+ stdio: "inherit",
914
+ env: {
915
+ ...process.env,
916
+ NG_DISABLE_VERSION_CHECK: "true",
917
+ NG_CLI_ANALYTICS: "false"
918
+ }
919
+ });
920
+ if (status === null && error) {
921
+ throw error;
922
+ }
923
+ return status ?? 0;
924
+ } finally {
925
+ await cleanup();
926
+ }
927
+ }
928
+ async function shouldForcePackageManager(packageManager, logger, verbose) {
929
+ if (packageManager.name === "npm") {
930
+ const version = await packageManager.getVersion();
931
+ if (semver2.gte(version, "7.0.0")) {
932
+ if (verbose) {
933
+ logger.info("NPM 7+ detected -- enabling force option for package installation");
934
+ }
935
+ return true;
936
+ }
937
+ }
938
+ return false;
939
+ }
940
+
941
+ // packages/angular/cli/src/commands/update/utilities/git.js
942
+ import { execFileSync } from "node:child_process";
943
+ import * as path2 from "node:path";
944
+ function execGit(args, input) {
945
+ return execFileSync("git", args, { encoding: "utf8", stdio: "pipe", input });
946
+ }
947
+ function checkCleanGit(root) {
948
+ try {
949
+ const topLevel = execGit(["rev-parse", "--show-toplevel"]);
950
+ const result = execGit(["status", "--porcelain", "-z"]);
951
+ if (result.length === 0) {
952
+ return true;
953
+ }
954
+ const entries = result.split("\0");
955
+ for (let i = 0; i < entries.length; i++) {
956
+ const line = entries[i];
957
+ if (!line) {
958
+ continue;
959
+ }
960
+ let filePath = line.slice(3);
961
+ const status = line.slice(0, 2);
962
+ if (status[0] === "R") {
963
+ if (isPathInsideRoot(filePath, root, topLevel.trim())) {
964
+ return false;
965
+ }
966
+ i++;
967
+ filePath = entries[i];
968
+ }
969
+ if (isPathInsideRoot(filePath, root, topLevel.trim())) {
970
+ return false;
971
+ }
972
+ }
973
+ } catch {
974
+ }
975
+ return true;
976
+ }
977
+ function isPathInsideRoot(filePath, root, topLevel) {
978
+ const relativeEntry = path2.relative(path2.resolve(root), path2.resolve(topLevel, filePath));
979
+ return !relativeEntry.startsWith("..") && !path2.isAbsolute(relativeEntry);
980
+ }
981
+ function hasChangesToCommit() {
982
+ try {
983
+ return execGit(["ls-files", "-m", "-d", "-o", "--exclude-standard"]).trim() !== "";
984
+ } catch {
985
+ return false;
986
+ }
987
+ }
988
+ function createCommit(message) {
989
+ execGit(["add", "-A"]);
990
+ execGit(["commit", "--no-verify", "-F", "-"], message);
991
+ }
992
+ function findCurrentGitSha() {
993
+ try {
994
+ return execGit(["rev-parse", "HEAD"]).trim();
995
+ } catch {
996
+ return null;
997
+ }
998
+ }
999
+ function getShortHash(commitHash) {
1000
+ return commitHash.slice(0, 9);
1001
+ }
1002
+
1003
+ // packages/angular/cli/src/commands/update/utilities/migration.js
1004
+ import { UnsuccessfulWorkflowExecution } from "@angular-devkit/schematics";
1005
+ import { figures } from "listr2";
1006
+ import * as semver3 from "semver";
1007
+ async function executeSchematic(workflow, logger, collection, schematic, options = {}) {
1008
+ const workflowSubscription = subscribeToWorkflow(workflow, logger);
1009
+ try {
1010
+ await workflow.execute({
1011
+ collection,
1012
+ schematic,
1013
+ options,
1014
+ logger
1015
+ }).toPromise();
1016
+ return { success: !workflowSubscription.error, files: workflowSubscription.files };
1017
+ } catch (e) {
1018
+ if (e instanceof UnsuccessfulWorkflowExecution) {
1019
+ logger.error(`${figures.cross} Migration failed. See above for further details.
1020
+ `);
1021
+ } else {
1022
+ assertIsError(e);
1023
+ const logPath = writeErrorToLogFile(e);
1024
+ logger.fatal(`${figures.cross} Migration failed: ${e.message}
1025
+ See "${logPath}" for further details.
1026
+ `);
1027
+ }
1028
+ return { success: false, files: workflowSubscription.files };
1029
+ } finally {
1030
+ workflowSubscription.unsubscribe();
1031
+ }
1032
+ }
1033
+ async function executeMigration(workflow, logger, packageName, collectionPath, migrationName, commit = false) {
1034
+ const collection = workflow.engine.createCollection(collectionPath);
1035
+ const name = collection.listSchematicNames().find((name2) => name2 === migrationName);
1036
+ if (!name) {
1037
+ logger.error(`Cannot find migration '${migrationName}' in '${packageName}'.`);
1038
+ return 1;
1039
+ }
1040
+ logger.info(colors.cyan(`** Executing '${migrationName}' of package '${packageName}' **
1041
+ `));
1042
+ const schematic = workflow.engine.createSchematic(name, collection);
1043
+ return executePackageMigrations(workflow, logger, [schematic.description], packageName, commit);
1044
+ }
1045
+ async function executeMigrations(workflow, logger, packageName, collectionPath, from, to, commit = false) {
1046
+ const collection = workflow.engine.createCollection(collectionPath);
1047
+ const migrationRange = new semver3.Range(">" + (semver3.prerelease(from) ? from.split("-")[0] + "-0" : from) + " <=" + to.split("-")[0]);
1048
+ const requiredMigrations = [];
1049
+ const optionalMigrations = [];
1050
+ for (const name of collection.listSchematicNames()) {
1051
+ const schematic = workflow.engine.createSchematic(name, collection);
1052
+ const description = schematic.description;
1053
+ description.version = coerceVersionNumber(description.version);
1054
+ if (!description.version) {
1055
+ continue;
1056
+ }
1057
+ if (semver3.satisfies(description.version, migrationRange, { includePrerelease: true })) {
1058
+ (description.optional ? optionalMigrations : requiredMigrations).push(description);
1059
+ }
1060
+ }
1061
+ if (requiredMigrations.length === 0 && optionalMigrations.length === 0) {
1062
+ return 0;
1063
+ }
1064
+ if (requiredMigrations.length) {
1065
+ logger.info(colors.cyan(`** Executing migrations of package '${packageName}' **
1066
+ `));
1067
+ requiredMigrations.sort(compareMigrations);
1068
+ const result = await executePackageMigrations(workflow, logger, requiredMigrations, packageName, commit);
1069
+ if (result === 1) {
1070
+ return 1;
1071
+ }
1072
+ }
1073
+ if (optionalMigrations.length) {
1074
+ logger.info(colors.magenta(`** Optional migrations of package '${packageName}' **
1075
+ `));
1076
+ optionalMigrations.sort(compareMigrations);
1077
+ const migrationsToRun = await getOptionalMigrationsToRun(logger, optionalMigrations, packageName);
1078
+ if (migrationsToRun?.length) {
1079
+ return executePackageMigrations(workflow, logger, migrationsToRun, packageName, commit);
1080
+ }
1081
+ }
1082
+ return 0;
1083
+ }
1084
+ async function executePackageMigrations(workflow, logger, migrations, packageName, commit = false) {
1085
+ for (const migration of migrations) {
1086
+ const { title, description } = getMigrationTitleAndDescription(migration);
1087
+ logger.info(colors.cyan(figures.pointer) + " " + colors.bold(title));
1088
+ if (description) {
1089
+ logger.info(" " + description);
1090
+ }
1091
+ const { success, files } = await executeSchematic(workflow, logger, migration.collection.name, migration.name);
1092
+ if (!success) {
1093
+ return 1;
1094
+ }
1095
+ let modifiedFilesText;
1096
+ switch (files.size) {
1097
+ case 0:
1098
+ modifiedFilesText = "No changes made";
1099
+ break;
1100
+ case 1:
1101
+ modifiedFilesText = "1 file modified";
1102
+ break;
1103
+ default:
1104
+ modifiedFilesText = `${files.size} files modified`;
1105
+ break;
1106
+ }
1107
+ if (files.size) {
1108
+ try {
1109
+ await formatFiles(process.cwd(), files);
1110
+ } catch (error) {
1111
+ assertIsError(error);
1112
+ logger.warn(`WARNING: Formatting of files failed with the following error: ${error.message}`);
1113
+ }
1114
+ }
1115
+ logger.info(` Migration completed (${modifiedFilesText}).`);
1116
+ if (commit) {
1117
+ const commitPrefix = `${packageName} migration - ${migration.name}`;
1118
+ const commitMessage = migration.description ? `${commitPrefix}
1119
+
1120
+ ${migration.description}` : commitPrefix;
1121
+ const committed = commitChanges(logger, commitMessage);
1122
+ if (!committed) {
1123
+ return 1;
1124
+ }
1125
+ }
1126
+ logger.info("");
1127
+ }
1128
+ return 0;
1129
+ }
1130
+ function commitChanges(logger, message) {
1131
+ let commitNeeded;
1132
+ try {
1133
+ commitNeeded = hasChangesToCommit();
1134
+ } catch (err) {
1135
+ logger.error(` Failed to read Git tree:
1136
+ ${err.stderr}`);
1137
+ return false;
1138
+ }
1139
+ if (!commitNeeded) {
1140
+ logger.info(" No changes to commit after migration.");
1141
+ return true;
1142
+ }
1143
+ try {
1144
+ createCommit(message);
1145
+ } catch (err) {
1146
+ logger.error(`Failed to commit update (${message}):
1147
+ ${err.stderr}`);
1148
+ return false;
1149
+ }
1150
+ const hash = findCurrentGitSha();
1151
+ const shortMessage = message.split("\n")[0];
1152
+ if (hash) {
1153
+ logger.info(` Committed migration step (${getShortHash(hash)}): ${shortMessage}.`);
1154
+ } else {
1155
+ logger.info(` Committed migration step: ${shortMessage}.`);
1156
+ logger.warn(" Failed to look up hash of most recent commit, continuing anyways.");
1157
+ }
1158
+ return true;
1159
+ }
1160
+ async function getOptionalMigrationsToRun(logger, optionalMigrations, packageName) {
1161
+ const numberOfMigrations = optionalMigrations.length;
1162
+ logger.info(`This package has ${numberOfMigrations} optional migration${numberOfMigrations > 1 ? "s" : ""} that can be executed.`);
1163
+ if (!isTTY()) {
1164
+ for (const migration of optionalMigrations) {
1165
+ const { title } = getMigrationTitleAndDescription(migration);
1166
+ logger.info(colors.cyan(figures.pointer) + " " + colors.bold(title));
1167
+ logger.info(colors.gray(` ng update ${packageName} --name ${migration.name}`));
1168
+ logger.info("");
1169
+ }
1170
+ return void 0;
1171
+ }
1172
+ logger.info("Optional migrations may be skipped and executed after the update process, if preferred.");
1173
+ logger.info("");
1174
+ const answer = await askChoices(`Select the migrations that you'd like to run`, optionalMigrations.map((migration) => {
1175
+ const { title, documentation } = getMigrationTitleAndDescription(migration);
1176
+ return {
1177
+ name: `[${colors.white(migration.name)}] ${title}${documentation ? ` (${documentation})` : ""}`,
1178
+ value: migration.name,
1179
+ checked: migration.recommended
1180
+ };
1181
+ }), null);
1182
+ logger.info("");
1183
+ return optionalMigrations.filter(({ name }) => answer?.includes(name));
1184
+ }
1185
+ function getMigrationTitleAndDescription(migration) {
1186
+ const [title, ...description] = migration.description.split(". ");
1187
+ return {
1188
+ title: title.endsWith(".") ? title : title + ".",
1189
+ description: description.join(".\n "),
1190
+ documentation: migration.documentation ? new URL(migration.documentation, "https://angular.dev").href : void 0
1191
+ };
1192
+ }
1193
+ function compareMigrations(a, b) {
1194
+ return semver3.compare(a.version, b.version);
1195
+ }
1196
+
1197
+ // packages/angular/cli/src/commands/update/cli.js
1198
+ var CommandError = class extends Error {
1199
+ };
1200
+ var UpdateCommandModule = class extends CommandModule {
1201
+ scope = CommandScope.In;
1202
+ shouldReportAnalytics = false;
1203
+ resolvePaths = [import.meta.dirname, this.context.root];
1204
+ command = "update [packages..]";
1205
+ describe = "Updates your workspace and its dependencies. See https://update.angular.dev/.";
1206
+ longDescription = long_description_default;
1207
+ builder(localYargs) {
1208
+ return localYargs.positional("packages", {
1209
+ description: "The names of package(s) to update.",
1210
+ type: "string",
1211
+ array: true
1212
+ }).option("force", {
1213
+ description: "Ignore peer dependency version mismatches.",
1214
+ type: "boolean",
1215
+ default: false
1216
+ }).option("next", {
1217
+ description: "Use the prerelease version, including beta and RCs.",
1218
+ type: "boolean",
1219
+ default: false
1220
+ }).option("migrate-only", {
1221
+ description: "Only perform a migration, do not update the installed version.",
1222
+ type: "boolean"
1223
+ }).option("name", {
1224
+ description: "The name of the migration to run. Only available when a single package is updated.",
1225
+ type: "string",
1226
+ conflicts: ["to", "from"]
1227
+ }).option("from", {
1228
+ description: `Version from which to migrate from. Only available when a single package is updated, and only with 'migrate-only'.`,
1229
+ type: "string",
1230
+ implies: ["migrate-only"],
1231
+ conflicts: ["name"]
1232
+ }).option("to", {
1233
+ describe: `Version up to which to apply migrations. Only available when a single package is updated, and only with 'migrate-only' option. Requires 'from' to be specified. Default to the installed version detected.`,
1234
+ type: "string",
1235
+ implies: ["from", "migrate-only"],
1236
+ conflicts: ["name"]
1237
+ }).option("allow-dirty", {
1238
+ describe: "Whether to allow updating when the repository contains modified or untracked files.",
1239
+ type: "boolean",
1240
+ default: false
1241
+ }).option("verbose", {
1242
+ describe: "Display additional details about internal operations during execution.",
1243
+ type: "boolean",
1244
+ default: false
1245
+ }).option("create-commits", {
1246
+ describe: "Create source control commits for updates and migrations.",
1247
+ type: "boolean",
1248
+ alias: ["C"],
1249
+ default: false
1250
+ }).middleware((argv) => {
1251
+ if (argv.name) {
1252
+ argv["migrate-only"] = true;
1253
+ }
1254
+ return argv;
1255
+ }).check(({ packages, "allow-dirty": allowDirty, "migrate-only": migrateOnly }) => {
1256
+ const { logger } = this.context;
1257
+ if (packages?.length && !checkCleanGit(this.context.root)) {
1258
+ if (allowDirty) {
1259
+ logger.warn("Repository is not clean. Update changes will be mixed with pre-existing changes.");
1260
+ } else {
1261
+ throw new CommandModuleError("Repository is not clean. Please commit or stash any changes before updating.");
1262
+ }
1263
+ }
1264
+ if (migrateOnly) {
1265
+ if (packages?.length !== 1) {
1266
+ throw new CommandModuleError(`A single package must be specified when using the 'migrate-only' option.`);
1267
+ }
1268
+ }
1269
+ return true;
1270
+ }).strict();
1271
+ }
1272
+ async run(options) {
1273
+ const { logger, packageManager } = this.context;
1274
+ if (!disableVersionCheck && options.packages?.length) {
1275
+ const cliVersionToInstall = await checkCLIVersion(options.packages, logger, packageManager, options.next);
1276
+ if (cliVersionToInstall) {
1277
+ logger.warn(`The installed Angular CLI version is outdated.
1278
+ Installing a temporary Angular CLI versioned ${cliVersionToInstall} to perform the update.`);
1279
+ return runTempBinary(`@angular/cli@${cliVersionToInstall}`, packageManager, process.argv.slice(2));
1280
+ }
1281
+ }
1282
+ const packages = [];
1283
+ for (const request of options.packages ?? []) {
1284
+ try {
1285
+ const packageIdentifier = npa2(request);
1286
+ if (!packageIdentifier.registry) {
1287
+ logger.error(`Package '${request}' is not a registry package identifer.`);
1288
+ return 1;
1289
+ }
1290
+ if (packages.some((v) => v.name === packageIdentifier.name)) {
1291
+ logger.error(`Duplicate package '${packageIdentifier.name}' specified.`);
1292
+ return 1;
1293
+ }
1294
+ if (options.migrateOnly && packageIdentifier.rawSpec !== "*") {
1295
+ logger.warn('Package specifier has no effect when using "migrate-only" option.');
1296
+ }
1297
+ if (packageIdentifier.rawSpec === "*") {
1298
+ packageIdentifier.fetchSpec = options.next ? "next" : "latest";
1299
+ packageIdentifier.type = "tag";
1300
+ }
1301
+ packages.push(packageIdentifier);
1302
+ } catch (e) {
1303
+ assertIsError(e);
1304
+ logger.error(e.message);
1305
+ return 1;
1306
+ }
1307
+ }
1308
+ logger.info(`Using package manager: ${colors.gray(packageManager.name)}`);
1309
+ logger.info("Collecting installed dependencies...");
1310
+ const rootDependencies = await packageManager.getProjectDependencies();
1311
+ logger.info(`Found ${rootDependencies.size} dependencies.`);
1312
+ const workflow = new NodeWorkflow(this.context.root, {
1313
+ packageManager: packageManager.name,
1314
+ packageManagerForce: await shouldForcePackageManager(packageManager, logger, options.verbose),
1315
+ // import.meta.dirname -> favor @schematics/update from this package
1316
+ // Otherwise, use packages from the active workspace (migrations)
1317
+ resolvePaths: this.resolvePaths,
1318
+ schemaValidation: true,
1319
+ engineHostCreator: (options2) => new SchematicEngineHost(options2.resolvePaths)
1320
+ });
1321
+ if (packages.length === 0) {
1322
+ try {
1323
+ const plan = await resolveUserUpdatePlan({
1324
+ force: options.force,
1325
+ next: options.next,
1326
+ verbose: options.verbose,
1327
+ packageManager: packageManager.name,
1328
+ packages: [],
1329
+ workspaceRoot: this.context.root
1330
+ }, packageManager, logger);
1331
+ await printUpdateUsageMessage(plan.packageInfoMap, plan.registryClient, logger, options.next);
1332
+ return 0;
1333
+ } catch (error) {
1334
+ assertIsError(error);
1335
+ logger.error(error.message);
1336
+ return 1;
1337
+ }
1338
+ }
1339
+ return options.migrateOnly ? this.migrateOnly(workflow, packages[0].name, rootDependencies, options, packageManager) : this.updatePackagesAndMigrate(workflow, rootDependencies, options, packages, packageManager);
1340
+ }
1341
+ async migrateOnly(workflow, packageName, rootDependencies, options, packageManager) {
1342
+ const { logger } = this.context;
1343
+ const packageDependency = rootDependencies.get(packageName);
1344
+ let packagePath = packageDependency?.path;
1345
+ let packageNode;
1346
+ if (!packageDependency) {
1347
+ const installed = await packageManager.getInstalledPackage(packageName);
1348
+ if (installed) {
1349
+ packagePath = installed.path;
1350
+ }
1351
+ }
1352
+ if (packagePath) {
1353
+ packageNode = await readPackageManifest(path3.join(packagePath, "package.json"));
1354
+ }
1355
+ if (!packageNode) {
1356
+ const jsonPath = findPackageJson(this.context.root, packageName);
1357
+ if (jsonPath) {
1358
+ packageNode = await readPackageManifest(jsonPath);
1359
+ if (!packagePath) {
1360
+ packagePath = path3.dirname(jsonPath);
1361
+ }
1362
+ }
1363
+ }
1364
+ if (!packageNode || !packagePath) {
1365
+ logger.error("Package is not installed.");
1366
+ return 1;
1367
+ }
1368
+ const updateMetadata = packageNode["ng-update"];
1369
+ let migrations = updateMetadata?.migrations;
1370
+ if (migrations === void 0) {
1371
+ logger.error("Package does not provide migrations.");
1372
+ return 1;
1373
+ } else if (typeof migrations !== "string") {
1374
+ logger.error("Package contains a malformed migrations field.");
1375
+ return 1;
1376
+ } else if (path3.posix.isAbsolute(migrations) || path3.win32.isAbsolute(migrations)) {
1377
+ logger.error("Package contains an invalid migrations field. Absolute paths are not permitted.");
1378
+ return 1;
1379
+ }
1380
+ migrations = migrations.replace(/\\/g, "/");
1381
+ if (migrations.startsWith("../")) {
1382
+ logger.error("Package contains an invalid migrations field. Paths outside the package root are not permitted.");
1383
+ return 1;
1384
+ }
1385
+ const localMigrations = path3.join(packagePath, migrations);
1386
+ if (existsSync3(localMigrations)) {
1387
+ migrations = localMigrations;
1388
+ } else {
1389
+ try {
1390
+ const packageRequire = createRequire2(packagePath + "/");
1391
+ migrations = packageRequire.resolve(migrations, { paths: this.resolvePaths });
1392
+ } catch (e) {
1393
+ assertIsError(e);
1394
+ if (e.code === "MODULE_NOT_FOUND") {
1395
+ logger.error("Migrations for package were not found.");
1396
+ } else {
1397
+ logger.error(`Unable to resolve migrations for package. [${e.message}]`);
1398
+ }
1399
+ return 1;
1400
+ }
1401
+ }
1402
+ if (options.name) {
1403
+ return executeMigration(workflow, logger, packageName, migrations, options.name, options.createCommits);
1404
+ }
1405
+ const from = coerceVersionNumber(options.from);
1406
+ if (!from) {
1407
+ logger.error(`"from" value [${options.from}] is not a valid version.`);
1408
+ return 1;
1409
+ }
1410
+ return executeMigrations(workflow, logger, packageName, migrations, from, options.to || packageNode.version, options.createCommits);
1411
+ }
1412
+ // eslint-disable-next-line max-lines-per-function
1413
+ async updatePackagesAndMigrate(workflow, rootDependencies, options, packages, packageManager) {
1414
+ const { logger } = this.context;
1415
+ const logVerbose = (message) => {
1416
+ if (options.verbose) {
1417
+ logger.info(message);
1418
+ }
1419
+ };
1420
+ const requests = [];
1421
+ for (const pkg of packages) {
1422
+ const node = rootDependencies.get(pkg.name);
1423
+ if (!node) {
1424
+ logger.error(`Package '${pkg.name}' is not a dependency.`);
1425
+ return 1;
1426
+ }
1427
+ if (pkg.type === "version" && node.version === pkg.fetchSpec) {
1428
+ logger.info(`Package '${pkg.name}' is already at '${pkg.fetchSpec}'.`);
1429
+ continue;
1430
+ }
1431
+ requests.push({ identifier: pkg, node });
1432
+ }
1433
+ if (requests.length === 0) {
1434
+ return 0;
1435
+ }
1436
+ logger.info("Fetching dependency metadata from registry...");
1437
+ const packagesToUpdate = [];
1438
+ for (const { identifier: requestIdentifier, node } of requests) {
1439
+ const packageName = requestIdentifier.name;
1440
+ let manifest;
1441
+ try {
1442
+ manifest = await packageManager.getManifest(requestIdentifier);
1443
+ } catch (e) {
1444
+ assertIsError(e);
1445
+ logger.error(`Error fetching manifest for '${packageName}': ` + e.message);
1446
+ return 1;
1447
+ }
1448
+ if (!manifest) {
1449
+ logger.error(`Package specified by '${requestIdentifier.raw}' does not exist within the registry.`);
1450
+ return 1;
1451
+ }
1452
+ if (manifest.version === node.version) {
1453
+ logger.info(`Package '${packageName}' is already up to date.`);
1454
+ continue;
1455
+ }
1456
+ if (ANGULAR_PACKAGES_REGEXP.test(node.name)) {
1457
+ const { name, version } = node;
1458
+ const toBeInstalledMajorVersion = +manifest.version.split(".")[0];
1459
+ const currentMajorVersion = +version.split(".")[0];
1460
+ if (toBeInstalledMajorVersion - currentMajorVersion > 1) {
1461
+ if (currentMajorVersion < 6) {
1462
+ logger.error(`Updating multiple major versions of '${name}' at once is not supported. Please migrate each major version individually.
1463
+ For more information about the update process, see https://update.angular.dev/.`);
1464
+ } else {
1465
+ const nextMajorVersionFromCurrent = currentMajorVersion + 1;
1466
+ logger.error(`Updating multiple major versions of '${name}' at once is not supported. Please migrate each major version individually.
1467
+ Run 'ng update ${name}@${nextMajorVersionFromCurrent}' in your workspace directory to update to latest '${nextMajorVersionFromCurrent}.x' version of '${name}'.
1468
+
1469
+ For more information about the update process, see https://update.angular.dev/?v=${currentMajorVersion}.0-${nextMajorVersionFromCurrent}.0`);
1470
+ }
1471
+ return 1;
1472
+ }
1473
+ }
1474
+ packagesToUpdate.push(requestIdentifier.toString());
1475
+ }
1476
+ if (packagesToUpdate.length === 0) {
1477
+ return 0;
1478
+ }
1479
+ let plan;
1480
+ try {
1481
+ plan = await resolveUserUpdatePlan({
1482
+ packages: packagesToUpdate,
1483
+ force: options.force,
1484
+ next: options.next,
1485
+ packageManager: packageManager.name,
1486
+ verbose: options.verbose,
1487
+ workspaceRoot: this.context.root
1488
+ }, packageManager, logger);
1489
+ } catch (error) {
1490
+ assertIsError(error);
1491
+ logger.error(error.message);
1492
+ return 1;
1493
+ }
1494
+ const packageJsonPath = path3.join(this.context.root, "package.json");
1495
+ let originalPackageJsonContent;
1496
+ try {
1497
+ originalPackageJsonContent = await fs3.readFile(packageJsonPath, "utf8");
1498
+ } catch {
1499
+ }
1500
+ try {
1501
+ await applyUpdatePlan(this.context.root, plan, logger);
1502
+ } catch (error) {
1503
+ assertIsError(error);
1504
+ logger.error(`Error updating package.json: ${error.message}`);
1505
+ return 1;
1506
+ }
1507
+ const { root: commandRoot } = this.context;
1508
+ const ignorePeerDependencies = await shouldForcePackageManager(packageManager, logger, options.verbose);
1509
+ const tasks = new Listr([
1510
+ {
1511
+ title: "Cleaning node modules directory",
1512
+ skip() {
1513
+ return packageManager.name !== "npm" ? "Cleaning not required for this package manager." : false;
1514
+ },
1515
+ async task(_, task) {
1516
+ try {
1517
+ await fs3.rm(path3.join(commandRoot, "node_modules"), {
1518
+ force: true,
1519
+ recursive: true,
1520
+ maxRetries: 3
1521
+ });
1522
+ } catch (e) {
1523
+ assertIsError(e);
1524
+ if (e.code === "ENOENT") {
1525
+ task.skip("Cleaning not required. Node modules directory not found.");
1526
+ }
1527
+ }
1528
+ }
1529
+ },
1530
+ {
1531
+ title: "Installing packages",
1532
+ async task() {
1533
+ try {
1534
+ await packageManager.install({
1535
+ ignorePeerDependencies
1536
+ });
1537
+ } catch (e) {
1538
+ throw new CommandError("Unable to install packages");
1539
+ }
1540
+ }
1541
+ }
1542
+ ]);
1543
+ try {
1544
+ await tasks.run();
1545
+ if ("_pathCache" in Module) {
1546
+ Module._pathCache = /* @__PURE__ */ Object.create(null);
1547
+ }
1548
+ } catch (e) {
1549
+ if (originalPackageJsonContent !== void 0) {
1550
+ try {
1551
+ await fs3.writeFile(packageJsonPath, originalPackageJsonContent, "utf8");
1552
+ logger.info("Restored package.json to its original state.");
1553
+ } catch (restoreError) {
1554
+ assertIsError(restoreError);
1555
+ logger.error(`Failed to restore package.json: ${restoreError.message}`);
1556
+ }
1557
+ }
1558
+ if (e instanceof CommandError) {
1559
+ return 1;
1560
+ }
1561
+ throw e;
1562
+ }
1563
+ if (options.createCommits) {
1564
+ if (!commitChanges(logger, `Angular CLI update for packages - ${packagesToUpdate.join(", ")}`)) {
1565
+ return 1;
1566
+ }
1567
+ }
1568
+ const migrations = await resolveFallbackMigrations(this.context.root, plan);
1569
+ if (migrations) {
1570
+ for (const migration of migrations) {
1571
+ const packageJsonPath2 = findPackageJson(this.context.root, migration.package);
1572
+ if (!packageJsonPath2) {
1573
+ logger.error(`Migrations for package (${migration.package}) were not found. The package could not be found in the workspace.`);
1574
+ return 1;
1575
+ }
1576
+ const packagePath = path3.dirname(packageJsonPath2);
1577
+ let migrations2;
1578
+ const localMigrations = path3.join(packagePath, migration.collection);
1579
+ if (existsSync3(localMigrations)) {
1580
+ migrations2 = localMigrations;
1581
+ } else {
1582
+ try {
1583
+ const packageRequire = createRequire2(packagePath + "/");
1584
+ migrations2 = packageRequire.resolve(migration.collection);
1585
+ } catch (e) {
1586
+ assertIsError(e);
1587
+ if (e.code === "MODULE_NOT_FOUND") {
1588
+ logger.error(`Migrations for package (${migration.package}) were not found.`);
1589
+ } else {
1590
+ logger.error(`Unable to resolve migrations for package (${migration.package}). [${e.message}]`);
1591
+ }
1592
+ return 1;
1593
+ }
1594
+ }
1595
+ const result = await executeMigrations(workflow, logger, migration.package, migrations2, migration.from, migration.to, options.createCommits);
1596
+ if (result !== 0) {
1597
+ return result;
1598
+ }
1599
+ }
1600
+ }
1601
+ return 0;
1602
+ }
1603
+ };
1604
+ async function readPackageManifest(manifestPath) {
1605
+ try {
1606
+ const content = await fs3.readFile(manifestPath, "utf8");
1607
+ return JSON.parse(content);
1608
+ } catch {
1609
+ return void 0;
1610
+ }
1611
+ }
1612
+ async function resolveFallbackMigrations(workspaceRoot, plan) {
1613
+ const migrations = [...plan.migrationsToRun];
1614
+ const existingMigrationPackages = new Set(migrations.map((m) => m.package));
1615
+ for (const [packageName, targetVersion] of plan.packagesToUpdate) {
1616
+ if (existingMigrationPackages.has(packageName)) {
1617
+ continue;
1618
+ }
1619
+ const packageJsonPath = findPackageJson(workspaceRoot, packageName);
1620
+ if (packageJsonPath) {
1621
+ try {
1622
+ const packageJson = JSON.parse(await fs3.readFile(packageJsonPath, "utf8"));
1623
+ const ngUpdate = packageJson?.["ng-update"];
1624
+ if (ngUpdate && typeof ngUpdate === "object" && typeof ngUpdate.migrations === "string") {
1625
+ const installedVersion = plan.packageInfoMap.get(packageName)?.installed.version;
1626
+ if (installedVersion) {
1627
+ migrations.push({
1628
+ package: packageName,
1629
+ collection: ngUpdate.migrations,
1630
+ from: installedVersion,
1631
+ to: targetVersion
1632
+ });
1633
+ }
1634
+ }
1635
+ } catch {
1636
+ }
1637
+ }
1638
+ }
1639
+ return migrations;
1640
+ }
1641
+ export {
1642
+ UpdateCommandModule as default,
1643
+ resolveFallbackMigrations
1644
+ };
1645
+ /**
1646
+ * @license
1647
+ * Copyright Google LLC All Rights Reserved.
1648
+ *
1649
+ * Use of this source code is governed by an MIT-style license that can be
1650
+ * found in the LICENSE file at https://angular.dev/license
1651
+ */