@@ -18,7 +18,11 @@ import {
18
18
PackageManifest ,
19
19
fetchPackageMetadata ,
20
20
} 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' ;
22
26
import { Schema as UpdateCommandSchema } from './update' ;
23
27
24
28
const npa = require ( 'npm-package-arg' ) ;
@@ -238,7 +242,10 @@ export class UpdateCommand extends SchematicCommand<UpdateCommandSchema> {
238
242
} ) ;
239
243
}
240
244
241
- const requests : PackageIdentifier [ ] = [ ] ;
245
+ const requests : {
246
+ identifier : PackageIdentifier ;
247
+ node : PackageTreeActual | string ;
248
+ } [ ] = [ ] ;
242
249
243
250
// Validate packages actually are part of the workspace
244
251
for ( const pkg of packages ) {
@@ -259,22 +266,26 @@ export class UpdateCommand extends SchematicCommand<UpdateCommandSchema> {
259
266
continue ;
260
267
}
261
268
262
- requests . push ( pkg ) ;
269
+ requests . push ( { identifier : pkg , node } ) ;
263
270
}
264
271
265
272
if ( requests . length === 0 ) {
266
273
return 0 ;
267
274
}
268
275
276
+ const packagesToUpdate : string [ ] = [ ] ;
277
+
269
278
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
+
271
282
let metadata ;
272
283
try {
273
284
// Metadata requests are internally cached; multiple requests for same name
274
285
// does not result in additional network traffic
275
- metadata = await fetchPackageMetadata ( requestIdentifier . name , this . logger ) ;
286
+ metadata = await fetchPackageMetadata ( packageName , this . logger ) ;
276
287
} 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 ) ;
278
289
279
290
return 1 ;
280
291
}
@@ -303,6 +314,20 @@ export class UpdateCommand extends SchematicCommand<UpdateCommandSchema> {
303
314
304
315
return 1 ;
305
316
}
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 ;
306
331
}
307
332
308
333
return this . runSchematic ( {
@@ -313,7 +338,7 @@ export class UpdateCommand extends SchematicCommand<UpdateCommandSchema> {
313
338
additionalOptions : {
314
339
force : options . force || false ,
315
340
packageManager,
316
- packages : requests . map ( p => p . toString ( ) ) ,
341
+ packages : packagesToUpdate ,
317
342
} ,
318
343
} ) ;
319
344
}
0 commit comments