@@ -19,7 +19,7 @@ import { map, mergeMap, reduce, switchMap } from 'rxjs/operators';
1919import * as semver from 'semver' ;
2020import { getNpmPackageJson } from './npm' ;
2121import { NpmRepositoryPackageJson } from './npm-package-json' ;
22- import { JsonSchemaForNpmPackageJsonFiles } from './package-json' ;
22+ import { Dependency , JsonSchemaForNpmPackageJsonFiles } from './package-json' ;
2323import { UpdateSchema } from './schema' ;
2424
2525type VersionRange = string & { __VERSION_RANGE : void ; } ;
@@ -220,6 +220,13 @@ function _performUpdate(
220220 throw new SchematicsException ( 'package.json could not be parsed: ' + e . message ) ;
221221 }
222222
223+ const updateDependency = ( deps : Dependency , name : string , newVersion : string ) => {
224+ const oldVersion = deps [ name ] ;
225+ // We only respect caret and tilde ranges on update.
226+ const execResult = / ^ [ \^ ~ ] / . exec ( oldVersion ) ;
227+ deps [ name ] = `${ execResult ? execResult [ 0 ] : '' } ${ newVersion } ` ;
228+ } ;
229+
223230 const toInstall = [ ...infoMap . values ( ) ]
224231 . map ( x => [ x . name , x . target , x . installed ] )
225232 // tslint:disable-next-line:non-null-operator
@@ -234,7 +241,7 @@ function _performUpdate(
234241 ) ;
235242
236243 if ( packageJson . dependencies && packageJson . dependencies [ name ] ) {
237- packageJson . dependencies [ name ] = target . version ;
244+ updateDependency ( packageJson . dependencies , name , target . version ) ;
238245
239246 if ( packageJson . devDependencies && packageJson . devDependencies [ name ] ) {
240247 delete packageJson . devDependencies [ name ] ;
@@ -243,13 +250,13 @@ function _performUpdate(
243250 delete packageJson . peerDependencies [ name ] ;
244251 }
245252 } else if ( packageJson . devDependencies && packageJson . devDependencies [ name ] ) {
246- packageJson . devDependencies [ name ] = target . version ;
253+ updateDependency ( packageJson . devDependencies , name , target . version ) ;
247254
248255 if ( packageJson . peerDependencies && packageJson . peerDependencies [ name ] ) {
249256 delete packageJson . peerDependencies [ name ] ;
250257 }
251258 } else if ( packageJson . peerDependencies && packageJson . peerDependencies [ name ] ) {
252- packageJson . peerDependencies [ name ] = target . version ;
259+ updateDependency ( packageJson . peerDependencies , name , target . version ) ;
253260 } else {
254261 logger . warn ( `Package ${ name } was not found in dependencies.` ) ;
255262 }
0 commit comments