diff --git a/packages/angular/cli/src/commands/update/cli.ts b/packages/angular/cli/src/commands/update/cli.ts index fdf8e850e026..47f5d1816fcd 100644 --- a/packages/angular/cli/src/commands/update/cli.ts +++ b/packages/angular/cli/src/commands/update/cli.ts @@ -682,29 +682,30 @@ export default class UpdateCommandModule extends CommandModule + semver.satisfies(potentialManifest.version, requestIdentifier.fetchSpec, { + loose: true, + }), + ); + + const nonDeprecated = potentialManifests.filter((m) => !m.deprecated); + const deprecated = potentialManifests.filter((m) => !!m.deprecated); + + const selectLatest = (manifests: PackageManifest[]) => { + let max: PackageManifest | undefined; + for (const m of manifests) { + if (!max || semver.gt(m.version, max.version, { loose: true })) { + max = m; + } } - } + + return max; + }; + + manifest = selectLatest(nonDeprecated) ?? selectLatest(deprecated); break; + } } if (!manifest) { diff --git a/packages/angular/cli/src/commands/update/schematic/index.ts b/packages/angular/cli/src/commands/update/schematic/index.ts index 26d2d06836b4..9c67558b33c4 100644 --- a/packages/angular/cli/src/commands/update/schematic/index.ts +++ b/packages/angular/cli/src/commands/update/schematic/index.ts @@ -704,7 +704,7 @@ function _addPackageGroup( if (Array.isArray(packageGroup) && !packageGroup.some((x) => typeof x != 'string')) { packageGroupNormalized = packageGroup.reduce( (acc, curr) => { - acc[curr] = maybePackage; + acc[curr] = version; return acc; }, diff --git a/tests/legacy-cli/e2e/assets/ssr-project-webpack/package.json b/tests/legacy-cli/e2e/assets/ssr-project-webpack/package.json index 607ff8d87288..b92520707e91 100644 --- a/tests/legacy-cli/e2e/assets/ssr-project-webpack/package.json +++ b/tests/legacy-cli/e2e/assets/ssr-project-webpack/package.json @@ -14,7 +14,6 @@ }, "private": true, "dependencies": { - "@angular/animations": "^20.0.0-next.0", "@angular/common": "^20.0.0-next.0", "@angular/compiler": "^20.0.0-next.0", "@angular/core": "^20.0.0-next.0", diff --git a/tests/legacy-cli/e2e/tests/commands/add/version-specifier.ts b/tests/legacy-cli/e2e/tests/commands/add/version-specifier.ts index f88d60a51ec9..d7941759820d 100644 --- a/tests/legacy-cli/e2e/tests/commands/add/version-specifier.ts +++ b/tests/legacy-cli/e2e/tests/commands/add/version-specifier.ts @@ -28,12 +28,13 @@ export default async function () { 'Installation was not skipped', ); - const output2 = await ng('add', '@angular/localize@latest', '--skip-confirmation'); - assert.doesNotMatch( - output2.stdout, - /Skipping installation: Package already installed/, - 'Installation should not have been skipped', - ); + // Skipped as `@latest` installs a version that does not support the used Node.js version. + // const output2 = await ng('add', '@angular/localize@latest', '--skip-confirmation'); + // assert.doesNotMatch( + // output2.stdout, + // /Skipping installation: Package already installed/, + // 'Installation should not have been skipped', + // ); const output3 = await ng('add', '@angular/localize@19.1.0', '--skip-confirmation'); assert.doesNotMatch(