diff --git a/packages/angular/cli/src/commands/add/cli.ts b/packages/angular/cli/src/commands/add/cli.ts index e861a45ab76f..5af1d18ec87d 100644 --- a/packages/angular/cli/src/commands/add/cli.ts +++ b/packages/angular/cli/src/commands/add/cli.ts @@ -34,6 +34,7 @@ import { import { askConfirmation } from '../../utilities/prompt'; import { Spinner } from '../../utilities/spinner'; import { isTTY } from '../../utilities/tty'; +import { VERSION } from '../../utilities/version'; interface AddCommandArgs extends SchematicsCommandArgs { collection: string; @@ -50,6 +51,8 @@ interface AddCommandArgs extends SchematicsCommandArgs { const packageVersionExclusions: Record = { // @angular/localize@9.x versions do not have peer dependencies setup '@angular/localize': '9.x', + // @angular/material@7.x versions have unbounded peer dependency ranges (>=7.0.0) + '@angular/material': '7.x', }; export class AddCommandModule @@ -176,11 +179,15 @@ export class AddCommandModule ); } else if (!latestManifest || (await this.hasMismatchedPeer(latestManifest))) { // 'latest' is invalid so search for most recent matching package + + // Allow prelease versions if the CLI itself is a prerelease + const allowPrereleases = prerelease(VERSION.full); + const versionExclusions = packageVersionExclusions[packageMetadata.name]; const versionManifests = Object.values(packageMetadata.versions).filter( (value: PackageManifest) => { // Prerelease versions are not stable and should not be considered by default - if (prerelease(value.version)) { + if (!allowPrereleases && prerelease(value.version)) { return false; } // Deprecated versions should not be used or considered @@ -196,7 +203,8 @@ export class AddCommandModule }, ); - versionManifests.sort((a, b) => compare(a.version, b.version, true)); + // Sort in reverse SemVer order so that the newest compatible version is chosen + versionManifests.sort((a, b) => compare(b.version, a.version, true)); let newIdentifier; for (const versionManifest of versionManifests) {