@@ -18,7 +18,11 @@ import {
1818 PackageManifest ,
1919 fetchPackageMetadata ,
2020} from '../utilities/package-metadata' ;
21- import { findNodeDependencies , readPackageTree } from '../utilities/package-tree' ;
21+ import {
22+ PackageTreeActual ,
23+ findNodeDependencies ,
24+ readPackageTree ,
25+ } from '../utilities/package-tree' ;
2226import { Schema as UpdateCommandSchema } from './update' ;
2327
2428const npa = require ( 'npm-package-arg' ) ;
@@ -238,7 +242,10 @@ export class UpdateCommand extends SchematicCommand<UpdateCommandSchema> {
238242 } ) ;
239243 }
240244
241- const requests : PackageIdentifier [ ] = [ ] ;
245+ const requests : {
246+ identifier : PackageIdentifier ;
247+ node : PackageTreeActual | string ;
248+ } [ ] = [ ] ;
242249
243250 // Validate packages actually are part of the workspace
244251 for ( const pkg of packages ) {
@@ -259,22 +266,26 @@ export class UpdateCommand extends SchematicCommand<UpdateCommandSchema> {
259266 continue ;
260267 }
261268
262- requests . push ( pkg ) ;
269+ requests . push ( { identifier : pkg , node } ) ;
263270 }
264271
265272 if ( requests . length === 0 ) {
266273 return 0 ;
267274 }
268275
276+ const packagesToUpdate : string [ ] = [ ] ;
277+
269278 this . logger . info ( 'Fetching dependency metadata from registry...' ) ;
270- for ( const requestIdentifier of requests ) {
279+ for ( const { identifier : requestIdentifier , node } of requests ) {
280+ const packageName = requestIdentifier . name ;
281+
271282 let metadata ;
272283 try {
273284 // Metadata requests are internally cached; multiple requests for same name
274285 // does not result in additional network traffic
275- metadata = await fetchPackageMetadata ( requestIdentifier . name , this . logger ) ;
286+ metadata = await fetchPackageMetadata ( packageName , this . logger ) ;
276287 } catch ( e ) {
277- this . logger . error ( `Error fetching metadata for '${ requestIdentifier . name } ': ` + e . message ) ;
288+ this . logger . error ( `Error fetching metadata for '${ packageName } ': ` + e . message ) ;
278289
279290 return 1 ;
280291 }
@@ -303,6 +314,20 @@ export class UpdateCommand extends SchematicCommand<UpdateCommandSchema> {
303314
304315 return 1 ;
305316 }
317+
318+ if (
319+ ( typeof node === 'string' && manifest . version === node ) ||
320+ ( typeof node === 'object' && manifest . version === node . package . version )
321+ ) {
322+ this . logger . info ( `Package '${ packageName } ' is already up to date.` ) ;
323+ continue ;
324+ }
325+
326+ packagesToUpdate . push ( requestIdentifier . toString ( ) ) ;
327+ }
328+
329+ if ( packagesToUpdate . length === 0 ) {
330+ return 0 ;
306331 }
307332
308333 return this . runSchematic ( {
@@ -313,7 +338,7 @@ export class UpdateCommand extends SchematicCommand<UpdateCommandSchema> {
313338 additionalOptions : {
314339 force : options . force || false ,
315340 packageManager,
316- packages : requests . map ( p => p . toString ( ) ) ,
341+ packages : packagesToUpdate ,
317342 } ,
318343 } ) ;
319344 }
0 commit comments