@@ -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,13 @@ 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+ configuredPackageManager : this . context . packageManager . name ,
178+ } ) ;
178179
179180 // Check if the current installed CLI version is older than the latest compatible version.
180181 // Skip when running `ng update` without a package name as this will not trigger an actual update.
@@ -183,7 +184,6 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
183184 options . packages ,
184185 logger ,
185186 packageManager ,
186- options . verbose ,
187187 options . next ,
188188 ) ;
189189
@@ -201,7 +201,7 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
201201 }
202202 }
203203
204- const packages : PackageIdentifier [ ] = [ ] ;
204+ const packages : npa . Result [ ] = [ ] ;
205205 for ( const request of options . packages ?? [ ] ) {
206206 try {
207207 const packageIdentifier = npa ( request ) ;
@@ -230,7 +230,7 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
230230 packageIdentifier . type = 'tag' ;
231231 }
232232
233- packages . push ( packageIdentifier as PackageIdentifier ) ;
233+ packages . push ( packageIdentifier ) ;
234234 } catch ( e ) {
235235 assertIsError ( e ) ;
236236 logger . error ( e . message ) ;
@@ -247,7 +247,7 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
247247
248248 const workflow = new NodeWorkflow ( this . context . root , {
249249 packageManager : packageManager . name ,
250- packageManagerForce : shouldForcePackageManager ( packageManager , logger , options . verbose ) ,
250+ packageManagerForce : await shouldForcePackageManager ( packageManager , logger , options . verbose ) ,
251251 // __dirname -> favor @schematics/update from this package
252252 // Otherwise, use packages from the active workspace (migrations)
253253 resolvePaths : this . resolvePaths ,
@@ -276,7 +276,13 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
276276
277277 return options . migrateOnly
278278 ? this . migrateOnly ( workflow , ( options . packages ?? [ ] ) [ 0 ] , rootDependencies , options )
279- : this . updatePackagesAndMigrate ( workflow , rootDependencies , options , packages ) ;
279+ : this . updatePackagesAndMigrate (
280+ workflow ,
281+ rootDependencies ,
282+ options ,
283+ packages ,
284+ packageManager ,
285+ ) ;
280286 }
281287
282288 private async migrateOnly (
@@ -395,7 +401,8 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
395401 workflow : NodeWorkflow ,
396402 rootDependencies : Map < string , PackageTreeNode > ,
397403 options : Options < UpdateCommandArgs > ,
398- packages : PackageIdentifier [ ] ,
404+ packages : npa . Result [ ] ,
405+ packageManager : PackageManager ,
399406 ) : Promise < number > {
400407 const { logger } = this . context ;
401408
@@ -406,13 +413,14 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
406413 } ;
407414
408415 const requests : {
409- identifier : PackageIdentifier ;
416+ identifier : npa . Result ;
410417 node : PackageTreeNode ;
411418 } [ ] = [ ] ;
412419
413420 // Validate packages actually are part of the workspace
414421 for ( const pkg of packages ) {
415- const node = rootDependencies . get ( pkg . name ) ;
422+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
423+ const node = rootDependencies . get ( pkg . name ! ) ;
416424 if ( ! node ?. package ) {
417425 logger . error ( `Package '${ pkg . name } ' is not a dependency.` ) ;
418426
@@ -438,64 +446,16 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
438446 for ( const { identifier : requestIdentifier , node } of requests ) {
439447 const packageName = requestIdentifier . name ;
440448
441- let metadata ;
449+ let manifest : PackageManifest | null = null ;
442450 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- } ) ;
451+ manifest = await packageManager . getManifest ( requestIdentifier ) ;
448452 } catch ( e ) {
449453 assertIsError ( e ) ;
450- logger . error ( `Error fetching metadata for '${ packageName } ': ` + e . message ) ;
454+ logger . error ( `Error fetching manifest for '${ packageName } ': ` + e . message ) ;
451455
452456 return 1 ;
453457 }
454458
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-
499459 if ( ! manifest ) {
500460 logger . error (
501461 `Package specified by '${ requestIdentifier . raw } ' does not exist within the registry.` ,
@@ -560,10 +520,8 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
560520 ) ;
561521
562522 if ( success ) {
563- const { root : commandRoot , packageManager } = this . context ;
564- const installArgs = shouldForcePackageManager ( packageManager , logger , options . verbose )
565- ? [ '--force' ]
566- : [ ] ;
523+ const { root : commandRoot } = this . context ;
524+ const force = await shouldForcePackageManager ( packageManager , logger , options . verbose ) ;
567525 const tasks = new Listr ( [
568526 {
569527 title : 'Cleaning node modules directory' ,
@@ -585,9 +543,11 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
585543 {
586544 title : 'Installing packages' ,
587545 async task ( ) {
588- const installationSuccess = await packageManager . installAll ( installArgs , commandRoot ) ;
589-
590- if ( ! installationSuccess ) {
546+ try {
547+ await packageManager . install ( {
548+ force,
549+ } ) ;
550+ } catch ( e ) {
591551 throw new CommandError ( 'Unable to install packages' ) ;
592552 }
593553 } ,
0 commit comments