@@ -28,6 +28,7 @@ import { assertIsError } from '../../utilities/error';
28
28
import {
29
29
NgAddSaveDependency ,
30
30
PackageManifest ,
31
+ PackageMetadata ,
31
32
fetchPackageManifest ,
32
33
fetchPackageMetadata ,
33
34
} from '../../utilities/package-metadata' ;
@@ -288,40 +289,16 @@ export default class AddCommandModule
288
289
}
289
290
290
291
// Allow prelease versions if the CLI itself is a prerelease
291
- const allowPrereleases = prerelease ( VERSION . full ) ;
292
-
293
- const versionExclusions = packageVersionExclusions [ packageMetadata . name ] ;
294
- const versionManifests = Object . values ( packageMetadata . versions ) . filter (
295
- ( value : PackageManifest ) => {
296
- // Already checked the 'latest' version
297
- if ( latestManifest . version === value . version ) {
298
- return false ;
299
- }
300
- // Prerelease versions are not stable and should not be considered by default
301
- if ( ! allowPrereleases && prerelease ( value . version ) ) {
302
- return false ;
303
- }
304
- // Deprecated versions should not be used or considered
305
- if ( value . deprecated ) {
306
- return false ;
307
- }
308
- // Excluded package versions should not be considered
309
- if (
310
- versionExclusions &&
311
- satisfies ( value . version , versionExclusions , { includePrerelease : true } )
312
- ) {
313
- return false ;
314
- }
315
-
316
- return true ;
317
- } ,
318
- ) ;
319
-
320
- // Sort in reverse SemVer order so that the newest compatible version is chosen
321
- versionManifests . sort ( ( a , b ) => compare ( b . version , a . version , true ) ) ;
292
+ const allowPrereleases = ! ! prerelease ( VERSION . full ) ;
293
+ const versionManifests = this . #getPotentialVersionManifests( packageMetadata , allowPrereleases ) ;
322
294
323
295
let found = false ;
324
296
for ( const versionManifest of versionManifests ) {
297
+ // Already checked the 'latest' version
298
+ if ( latestManifest ?. version === versionManifest . version ) {
299
+ continue ;
300
+ }
301
+
325
302
const conflicts = await this . getPeerDependencyConflicts ( versionManifest ) ;
326
303
if ( conflicts ) {
327
304
if ( options . verbose || rejectionReasons . length < DEFAULT_CONFLICT_DISPLAY_LIMIT ) {
@@ -354,6 +331,37 @@ export default class AddCommandModule
354
331
}
355
332
}
356
333
334
+ #getPotentialVersionManifests(
335
+ packageMetadata : PackageMetadata ,
336
+ allowPrereleases : boolean ,
337
+ ) : PackageManifest [ ] {
338
+ const versionExclusions = packageVersionExclusions [ packageMetadata . name ] ;
339
+ const versionManifests = Object . values ( packageMetadata . versions ) . filter (
340
+ ( value : PackageManifest ) => {
341
+ // Prerelease versions are not stable and should not be considered by default
342
+ if ( ! allowPrereleases && prerelease ( value . version ) ) {
343
+ return false ;
344
+ }
345
+ // Deprecated versions should not be used or considered
346
+ if ( value . deprecated ) {
347
+ return false ;
348
+ }
349
+ // Excluded package versions should not be considered
350
+ if (
351
+ versionExclusions &&
352
+ satisfies ( value . version , versionExclusions , { includePrerelease : true } )
353
+ ) {
354
+ return false ;
355
+ }
356
+
357
+ return true ;
358
+ } ,
359
+ ) ;
360
+
361
+ // Sort in reverse SemVer order so that the newest compatible version is chosen
362
+ return versionManifests . sort ( ( a , b ) => compare ( b . version , a . version , true ) ) ;
363
+ }
364
+
357
365
private async loadPackageInfoTask (
358
366
context : AddCommandTaskContext ,
359
367
task : AddCommandTaskWrapper ,
0 commit comments