@@ -24,54 +24,63 @@ async function yarnUpdateDependency() {
2424 } )
2525 . option ( '-v, --target-version <value>' , 'The version to update to' )
2626 . option ( '-p, --package <value>' , 'The package to update' )
27- . option ( '-c, --caret' , 'Update the version to ^X.X.X' )
28- . option ( '-t, --tilde' , 'Update the version to ~X.X.X' )
29- . option ( '-e, --exact' , 'Update the version to X.X.X' )
3027 . option ( '-ny, --no-yarn' , 'Do not auto-run "yarn install"' )
3128 . parse ( process . argv ) ;
3229
33- let { targetVersion, package, caret , exact , yarn : runYarn } = program . opts ( ) ;
30+ let { targetVersion, package, yarn : runYarn } = program . opts ( ) ;
3431
3532 package = package || posPackage ;
3633 let version = targetVersion || posVersion ;
3734
38- if ( typeof version === 'undefined' ) {
39- let out = await exec ( `npm show ${ package } version` ) ;
40- version = out . stdout . trim ( ) ;
41- log ( `Fetching latest version: ${ version } ` ) ;
35+ if ( ! package ) {
36+ throw new Error ( 'You have to specify a package.' ) ;
4237 }
4338
44- if ( ! version . startsWith ( '~' ) && ! version . startsWith ( '^' ) ) {
45- let versionRangeChar = '~' ;
46- if ( exact ) {
47- versionRangeChar = '' ;
48- } else if ( caret ) {
49- versionRangeChar = '^' ;
50- }
39+ await updateDependency ( package , version ) ;
5140
52- version = `${ versionRangeChar } ${ version } ` ;
41+ if ( ! runYarn ) {
42+ log ( '' ) ;
43+ log ( chalk . green ( 'Done! Please run `yarn` to update your dependencies.' ) ) ;
44+ return ;
5345 }
5446
55- if ( ! package || ! version ) {
56- throw new Error (
57- 'You have to specify a package & version to update, e.g. "yu my-package 0.2.0"'
58- ) ;
47+ log ( '' ) ;
48+ log ( 'Now running `yarn` to install new dependency...' ) ;
49+
50+ await exec ( 'yarn install' ) ;
51+
52+ log ( '' ) ;
53+ log ( chalk . green ( 'Done!' ) ) ;
54+ }
55+
56+ function updateVersion ( deps , package , version ) {
57+ // If not specifying a full version with ~ or ^, we want to keep the current symbol
58+ if ( ! version . startsWith ( '~' ) && ! version . startsWith ( '^' ) ) {
59+ let currentVersion = deps [ package ] ;
60+ let currentSymbol = currentVersion [ 0 ] ;
61+
62+ if ( currentSymbol === '~' || currentSymbol === '^' ) {
63+ version = `${ currentSymbol } ${ version } ` ;
64+ }
5965 }
6066
61- log ( `Updating ${ package } to version ${ version } ...` ) ;
67+ deps [ package ] = version ;
68+ }
6269
63- let packageJson = readPackageJson ( 'package.json' ) ;
64- let isWorkspace = ! ! packageJson . workspaces ;
70+ async function updateDependency ( package , version ) {
71+ if ( typeof version === 'undefined' ) {
72+ let out = await exec ( `npm show ${ package } version` ) ;
73+ version = out . stdout . trim ( ) ;
74+ log ( `Fetching latest version: ${ version } ` ) ;
75+ }
6576
66- let packageJsonFilePaths = [ 'package.json' ] ;
67- if ( isWorkspace ) {
68- packageJson . workspaces . forEach ( ( workspacePattern ) => {
69- let pattern = `${ workspacePattern } /package.json` ;
70- let workspacePackageJsonFiles = glob . sync ( pattern ) ;
71- packageJsonFilePaths . push ( ...workspacePackageJsonFiles ) ;
72- } ) ;
77+ if ( ! version ) {
78+ throw new Error ( `No version found to update to for package ${ package } ` ) ;
7379 }
7480
81+ log ( `Updating ${ package } to version ${ version } ...` ) ;
82+
83+ let packageJsonFilePaths = getPackageJsonFiles ( ) ;
7584 let hasAnyChange = false ;
7685
7786 // Update package.json files...
@@ -85,17 +94,17 @@ async function yarnUpdateDependency() {
8594 let hasChanged = false ;
8695
8796 if ( dependencies [ package ] ) {
88- dependencies [ package ] = version ;
97+ updateVersion ( dependencies , package , version ) ;
8998 hasChanged = true ;
9099 }
91100
92101 if ( devDependencies [ package ] ) {
93- devDependencies [ package ] = version ;
102+ updateVersion ( devDependencies , package , version ) ;
94103 hasChanged = true ;
95104 }
96105
97106 if ( peerDependencies [ package ] ) {
98- peerDependencies [ package ] = version ;
107+ updateVersion ( peerDependencies , package , version ) ;
99108 hasChanged = true ;
100109 }
101110
@@ -138,20 +147,6 @@ async function yarnUpdateDependency() {
138147 ) ;
139148 return ;
140149 }
141-
142- if ( ! runYarn ) {
143- log ( '' ) ;
144- log ( chalk . green ( 'Done! Please run `yarn` to update your dependencies.' ) ) ;
145- return ;
146- }
147-
148- log ( '' ) ;
149- log ( 'Now running `yarn` to install new dependency...' ) ;
150-
151- await exec ( 'yarn install' ) ;
152-
153- log ( '' ) ;
154- log ( chalk . green ( 'Done!' ) ) ;
155150}
156151
157152module . exports = async function ( ) {
@@ -166,3 +161,19 @@ function log(str) {
166161 // eslint-disable-next-line no-console
167162 console . log ( str ) ;
168163}
164+
165+ function getPackageJsonFiles ( ) {
166+ let packageJson = readPackageJson ( 'package.json' ) ;
167+ let isWorkspace = ! ! packageJson . workspaces ;
168+
169+ let packageJsonFilePaths = [ 'package.json' ] ;
170+ if ( isWorkspace ) {
171+ packageJson . workspaces . forEach ( ( workspacePattern ) => {
172+ let pattern = `${ workspacePattern } /package.json` ;
173+ let workspacePackageJsonFiles = glob . sync ( pattern ) ;
174+ packageJsonFilePaths . push ( ...workspacePackageJsonFiles ) ;
175+ } ) ;
176+ }
177+
178+ return packageJsonFilePaths ;
179+ }
0 commit comments