Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions packages/angular/cli/src/commands/add/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -50,6 +51,8 @@ interface AddCommandArgs extends SchematicsCommandArgs {
const packageVersionExclusions: Record<string, string | undefined> = {
// @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
Expand Down Expand Up @@ -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
Expand All @@ -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) {
Expand Down