@@ -12,7 +12,6 @@ import { existsSync, promises as fs } from 'node:fs';
1212import { createRequire } from 'node:module' ;
1313import * as path from 'node:path' ;
1414import npa from 'npm-package-arg' ;
15- import * as semver from 'semver' ;
1615import { Argv } from 'yargs' ;
1716import {
1817 CommandModule ,
@@ -21,14 +20,10 @@ import {
2120 Options ,
2221} from '../../command-builder/command-module' ;
2322import { SchematicEngineHost } from '../../command-builder/utilities/schematic-engine-host' ;
23+ import { PackageManager , PackageManifest , createPackageManager } from '../../package-managers' ;
2424import { colors } from '../../utilities/color' ;
2525import { disableVersionCheck } from '../../utilities/environment-options' ;
2626import { assertIsError } from '../../utilities/error' ;
27- import {
28- PackageIdentifier ,
29- PackageManifest ,
30- fetchPackageMetadata ,
31- } from '../../utilities/package-metadata' ;
3227import {
3328 PackageTreeNode ,
3429 findPackageJson ,
@@ -174,7 +169,12 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
174169 }
175170
176171 async run ( options : Options < UpdateCommandArgs > ) : Promise < number | void > {
177- const { logger, packageManager } = this . context ;
172+ const { logger } = this . context ;
173+ // Instantiate the package manager
174+ const packageManager = await createPackageManager ( {
175+ cwd : this . context . root ,
176+ logger,
177+ } ) ;
178178
179179 // Check if the current installed CLI version is older than the latest compatible version.
180180 // Skip when running `ng update` without a package name as this will not trigger an actual update.
@@ -183,7 +183,6 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
183183 options . packages ,
184184 logger ,
185185 packageManager ,
186- options . verbose ,
187186 options . next ,
188187 ) ;
189188
@@ -201,7 +200,7 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
201200 }
202201 }
203202
204- const packages : PackageIdentifier [ ] = [ ] ;
203+ const packages : npa . Result [ ] = [ ] ;
205204 for ( const request of options . packages ?? [ ] ) {
206205 try {
207206 const packageIdentifier = npa ( request ) ;
@@ -230,7 +229,7 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
230229 packageIdentifier . type = 'tag' ;
231230 }
232231
233- packages . push ( packageIdentifier as PackageIdentifier ) ;
232+ packages . push ( packageIdentifier ) ;
234233 } catch ( e ) {
235234 assertIsError ( e ) ;
236235 logger . error ( e . message ) ;
@@ -247,7 +246,7 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
247246
248247 const workflow = new NodeWorkflow ( this . context . root , {
249248 packageManager : packageManager . name ,
250- packageManagerForce : shouldForcePackageManager ( packageManager , logger , options . verbose ) ,
249+ packageManagerForce : await shouldForcePackageManager ( packageManager , logger , options . verbose ) ,
251250 // __dirname -> favor @schematics/update from this package
252251 // Otherwise, use packages from the active workspace (migrations)
253252 resolvePaths : this . resolvePaths ,
@@ -276,7 +275,13 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
276275
277276 return options . migrateOnly
278277 ? this . migrateOnly ( workflow , ( options . packages ?? [ ] ) [ 0 ] , rootDependencies , options )
279- : this . updatePackagesAndMigrate ( workflow , rootDependencies , options , packages ) ;
278+ : this . updatePackagesAndMigrate (
279+ workflow ,
280+ rootDependencies ,
281+ options ,
282+ packages ,
283+ packageManager ,
284+ ) ;
280285 }
281286
282287 private async migrateOnly (
@@ -395,7 +400,8 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
395400 workflow : NodeWorkflow ,
396401 rootDependencies : Map < string , PackageTreeNode > ,
397402 options : Options < UpdateCommandArgs > ,
398- packages : PackageIdentifier [ ] ,
403+ packages : npa . Result [ ] ,
404+ packageManager : PackageManager ,
399405 ) : Promise < number > {
400406 const { logger } = this . context ;
401407
@@ -406,13 +412,14 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
406412 } ;
407413
408414 const requests : {
409- identifier : PackageIdentifier ;
415+ identifier : npa . Result ;
410416 node : PackageTreeNode ;
411417 } [ ] = [ ] ;
412418
413419 // Validate packages actually are part of the workspace
414420 for ( const pkg of packages ) {
415- const node = rootDependencies . get ( pkg . name ) ;
421+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
422+ const node = rootDependencies . get ( pkg . name ! ) ;
416423 if ( ! node ?. package ) {
417424 logger . error ( `Package '${ pkg . name } ' is not a dependency.` ) ;
418425
@@ -438,64 +445,16 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
438445 for ( const { identifier : requestIdentifier , node } of requests ) {
439446 const packageName = requestIdentifier . name ;
440447
441- let metadata ;
448+ let manifest : PackageManifest | null = null ;
442449 try {
443- // Metadata requests are internally cached; multiple requests for same name
444- // does not result in additional network traffic
445- metadata = await fetchPackageMetadata ( packageName , logger , {
446- verbose : options . verbose ,
447- } ) ;
450+ manifest = await packageManager . getManifest ( requestIdentifier ) ;
448451 } catch ( e ) {
449452 assertIsError ( e ) ;
450- logger . error ( `Error fetching metadata for '${ packageName } ': ` + e . message ) ;
453+ logger . error ( `Error fetching manifest for '${ packageName } ': ` + e . message ) ;
451454
452455 return 1 ;
453456 }
454457
455- // Try to find a package version based on the user requested package specifier
456- // registry specifier types are either version, range, or tag
457- let manifest : PackageManifest | undefined ;
458- switch ( requestIdentifier . type ) {
459- case 'tag' :
460- manifest = metadata . tags [ requestIdentifier . fetchSpec ] ;
461- // If not found and next option was used and user did not provide a specifier, try latest.
462- // Package may not have a next tag.
463- if (
464- ! manifest &&
465- requestIdentifier . fetchSpec === 'next' &&
466- requestIdentifier . rawSpec === '*'
467- ) {
468- manifest = metadata . tags [ 'latest' ] ;
469- }
470- break ;
471- case 'version' :
472- manifest = metadata . versions [ requestIdentifier . fetchSpec ] ;
473- break ;
474- case 'range' :
475- for ( const potentialManifest of Object . values ( metadata . versions ) ) {
476- // Ignore deprecated package versions
477- if ( potentialManifest . deprecated ) {
478- continue ;
479- }
480- // Only consider versions that are within the range
481- if (
482- ! semver . satisfies ( potentialManifest . version , requestIdentifier . fetchSpec , {
483- loose : true ,
484- } )
485- ) {
486- continue ;
487- }
488- // Update the used manifest if current potential is newer than existing or there is not one yet
489- if (
490- ! manifest ||
491- semver . gt ( potentialManifest . version , manifest . version , { loose : true } )
492- ) {
493- manifest = potentialManifest ;
494- }
495- }
496- break ;
497- }
498-
499458 if ( ! manifest ) {
500459 logger . error (
501460 `Package specified by '${ requestIdentifier . raw } ' does not exist within the registry.` ,
@@ -560,10 +519,8 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
560519 ) ;
561520
562521 if ( success ) {
563- const { root : commandRoot , packageManager } = this . context ;
564- const installArgs = shouldForcePackageManager ( packageManager , logger , options . verbose )
565- ? [ '--force' ]
566- : [ ] ;
522+ const { root : commandRoot } = this . context ;
523+ const force = await shouldForcePackageManager ( packageManager , logger , options . verbose ) ;
567524 const tasks = new Listr ( [
568525 {
569526 title : 'Cleaning node modules directory' ,
@@ -585,9 +542,11 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
585542 {
586543 title : 'Installing packages' ,
587544 async task ( ) {
588- const installationSuccess = await packageManager . installAll ( installArgs , commandRoot ) ;
589-
590- if ( ! installationSuccess ) {
545+ try {
546+ await packageManager . install ( {
547+ force,
548+ } ) ;
549+ } catch ( e ) {
591550 throw new CommandError ( 'Unable to install packages' ) ;
592551 }
593552 } ,
0 commit comments