1
- #!/usr/bin/env node
2
1
var conventionalRecommendedBump = require ( 'conventional-recommended-bump' )
3
2
var conventionalChangelog = require ( 'conventional-changelog' )
4
3
var path = require ( 'path' )
5
- var argv = require ( 'yargs' )
6
- . usage ( 'Usage: $0 [options]' )
7
- . option ( 'infile' , {
8
- alias : 'i' ,
9
- describe : 'Read the CHANGELOG from this file' ,
10
- default : 'CHANGELOG.md' ,
11
- global : true
12
- } )
13
- . option ( 'message' , {
14
- alias : 'm' ,
15
- describe : 'Commit message, replaces %s with new version' ,
16
- type : 'string' ,
17
- default : 'chore(release): %s' ,
18
- global : true
19
- } )
20
- . option ( 'first-release' , {
21
- alias : 'f' ,
22
- describe : 'Is this the first release?' ,
23
- type : 'boolean' ,
24
- default : false ,
25
- global : true
26
- } )
27
- . option ( 'sign' , {
28
- alias : 's' ,
29
- describe : 'Should the git commit and tag be signed?' ,
30
- type : 'boolean' ,
31
- default : false ,
32
- global : true
33
- } )
34
- . option ( 'no-verify' , {
35
- alias : 'n' ,
36
- describe : 'Bypass pre-commit or commit-msg git hooks during the commit phase' ,
37
- type : 'boolean' ,
38
- default : false ,
39
- global : true
40
- } )
41
- . help ( )
42
- . alias ( 'help' , 'h' )
43
- . example ( '$0' , 'Update changelog and tag release' )
44
- . example ( '$0 -m "%s: see changelog for details"' , 'Update changelog and tag release with custom commit message' )
45
- . wrap ( 97 )
46
- . argv
47
4
48
5
var chalk = require ( 'chalk' )
49
6
var figures = require ( 'figures' )
50
7
var exec = require ( 'child_process' ) . exec
51
8
var fs = require ( 'fs' )
52
9
var accessSync = require ( 'fs-access' ) . sync
53
- var pkgPath = path . resolve ( process . cwd ( ) , './package.json' )
54
- var pkg = require ( pkgPath )
55
10
var semver = require ( 'semver' )
56
11
var util = require ( 'util' )
12
+ var objectAssign = require ( 'object-assign' )
57
13
58
- conventionalRecommendedBump ( {
59
- preset : 'angular'
60
- } , function ( err , release ) {
61
- if ( err ) {
62
- console . error ( chalk . red ( err . message ) )
63
- return
64
- }
14
+ module . exports = function standardVersion ( argv , done ) {
15
+ var pkgPath = path . resolve ( process . cwd ( ) , './package.json' )
16
+ var pkg = require ( pkgPath )
17
+ var defaults = require ( './defaults' )
65
18
66
- var newVersion = pkg . version
67
- if ( ! argv . firstRelease ) {
68
- newVersion = semver . inc ( pkg . version , release . releaseType )
69
- checkpoint ( 'bumping version in package.json from %s to %s' , [ pkg . version , newVersion ] )
70
- pkg . version = newVersion
71
- fs . writeFileSync ( pkgPath , JSON . stringify ( pkg , null , 2 ) + '\n' , 'utf-8' )
72
- } else {
73
- checkpoint ( 'skip version bump on first release' , [ ] , chalk . red ( figures . cross ) )
74
- }
19
+ argv = objectAssign ( defaults , argv )
20
+
21
+ conventionalRecommendedBump ( {
22
+ preset : 'angular'
23
+ } , function ( err , release ) {
24
+ if ( err ) {
25
+ printError ( argv , err . message )
26
+ return done ( err )
27
+ }
75
28
76
- outputChangelog ( argv , function ( ) {
77
- commit ( argv , newVersion , function ( ) {
78
- return tag ( newVersion , argv )
29
+ var newVersion = pkg . version
30
+ if ( ! argv . firstRelease ) {
31
+ newVersion = semver . inc ( pkg . version , release . releaseType )
32
+ checkpoint ( argv , 'bumping version in package.json from %s to %s' , [ pkg . version , newVersion ] )
33
+ pkg . version = newVersion
34
+ fs . writeFileSync ( pkgPath , JSON . stringify ( pkg , null , 2 ) + '\n' , 'utf-8' )
35
+ } else {
36
+ checkpoint ( argv , 'skip version bump on first release' , [ ] , chalk . red ( figures . cross ) )
37
+ }
38
+
39
+ outputChangelog ( argv , function ( err ) {
40
+ if ( err ) {
41
+ return done ( err )
42
+ }
43
+ commit ( argv , newVersion , function ( err ) {
44
+ if ( err ) {
45
+ return done ( err )
46
+ }
47
+ return tag ( newVersion , pkg . private , argv , done )
48
+ } )
79
49
} )
80
50
} )
81
- } )
51
+ }
82
52
83
53
function outputChangelog ( argv , cb ) {
84
54
createIfMissing ( argv )
@@ -92,31 +62,34 @@ function outputChangelog (argv, cb) {
92
62
var changelogStream = conventionalChangelog ( {
93
63
preset : 'angular'
94
64
} )
95
- . on ( 'error' , function ( err ) {
96
- console . error ( chalk . red ( err . message ) )
97
- process . exit ( 1 )
98
- } )
65
+ . on ( 'error' , function ( err ) {
66
+ return cb ( err )
67
+ } )
99
68
100
69
changelogStream . on ( 'data' , function ( buffer ) {
101
70
content += buffer . toString ( )
102
71
} )
103
72
104
73
changelogStream . on ( 'end' , function ( ) {
105
- checkpoint ( 'outputting changes to %s' , [ argv . infile ] )
74
+ checkpoint ( argv , 'outputting changes to %s' , [ argv . infile ] )
106
75
fs . writeFileSync ( argv . infile , header + '\n' + ( content + oldContent ) . replace ( / \n + $ / , '\n' ) , 'utf-8' )
107
76
return cb ( )
108
77
} )
109
78
}
110
79
111
- function handleExecError ( err , stderr ) {
112
- // If exec returns content in stderr, but no error, print it as a warning
113
- // If exec returns an error, print it and exit with return code 1
114
- if ( err ) {
115
- console . error ( chalk . red ( stderr || err . message ) )
116
- process . exit ( 1 )
117
- } else if ( stderr ) {
118
- console . warn ( chalk . yellow ( stderr ) )
119
- }
80
+ function handledExec ( argv , cmd , errorCb , successCb ) {
81
+ // Exec given cmd and handle possible errors
82
+ exec ( cmd , function ( err , stdout , stderr ) {
83
+ // If exec returns content in stderr, but no error, print it as a warning
84
+ // If exec returns an error, print it and exit with return code 1
85
+ if ( err ) {
86
+ printError ( argv , stderr || err . message )
87
+ return errorCb ( err )
88
+ } else if ( stderr ) {
89
+ printError ( argv , stderr , { level : 'warn' , color : 'yellow' } )
90
+ }
91
+ successCb ( )
92
+ } )
120
93
}
121
94
122
95
function commit ( argv , newVersion , cb ) {
@@ -127,13 +100,11 @@ function commit (argv, newVersion, cb) {
127
100
msg += ' and %s'
128
101
args . unshift ( 'package.json' )
129
102
}
130
- checkpoint ( msg , args )
103
+ checkpoint ( argv , msg , args )
131
104
132
- exec ( 'git add package.json ' + argv . infile , function ( err , stdout , stderr ) {
133
- handleExecError ( err , stderr )
134
- exec ( 'git commit ' + verify + ( argv . sign ? '-S ' : '' ) + 'package.json ' + argv . infile + ' -m "' + formatCommitMessage ( argv . message , newVersion ) + '"' , function ( err , stdout , stderr ) {
135
- handleExecError ( err , stderr )
136
- return cb ( )
105
+ handledExec ( argv , 'git add package.json ' + argv . infile , cb , function ( ) {
106
+ handledExec ( argv , 'git commit ' + verify + ( argv . sign ? '-S ' : '' ) + 'package.json ' + argv . infile + ' -m "' + formatCommitMessage ( argv . message , newVersion ) + '"' , cb , function ( ) {
107
+ cb ( )
137
108
} )
138
109
} )
139
110
}
@@ -142,20 +113,20 @@ function formatCommitMessage (msg, newVersion) {
142
113
return String ( msg ) . indexOf ( '%s' ) !== - 1 ? util . format ( msg , newVersion ) : msg
143
114
}
144
115
145
- function tag ( newVersion , argv ) {
116
+ function tag ( newVersion , pkgPrivate , argv , cb ) {
146
117
var tagOption
147
118
if ( argv . sign ) {
148
119
tagOption = '-s '
149
120
} else {
150
121
tagOption = '-a '
151
122
}
152
- checkpoint ( 'tagging release %s' , [ newVersion ] )
153
- exec ( 'git tag ' + tagOption + 'v' + newVersion + ' -m "' + formatCommitMessage ( argv . message , newVersion ) + '"' , function ( err , stdout , stderr ) {
154
- handleExecError ( err , stderr )
123
+ checkpoint ( argv , 'tagging release %s' , [ newVersion ] )
124
+ handledExec ( argv , 'git tag ' + tagOption + 'v' + newVersion + ' -m "' + formatCommitMessage ( argv . message , newVersion ) + '"' , cb , function ( ) {
155
125
var message = 'git push --follow-tags origin master'
156
- if ( pkg . private !== true ) message += '; npm publish'
126
+ if ( pkgPrivate !== true ) message += '; npm publish'
157
127
158
- checkpoint ( 'Run `%s` to publish' , [ message ] , chalk . blue ( figures . info ) )
128
+ checkpoint ( argv , 'Run `%s` to publish' , [ message ] , chalk . blue ( figures . info ) )
129
+ cb ( )
159
130
} )
160
131
}
161
132
@@ -164,15 +135,24 @@ function createIfMissing (argv) {
164
135
accessSync ( argv . infile , fs . F_OK )
165
136
} catch ( err ) {
166
137
if ( err . code === 'ENOENT' ) {
167
- checkpoint ( 'created %s' , [ argv . infile ] )
138
+ checkpoint ( argv , 'created %s' , [ argv . infile ] )
168
139
argv . outputUnreleased = true
169
140
fs . writeFileSync ( argv . infile , '\n' , 'utf-8' )
170
141
}
171
142
}
172
143
}
173
144
174
- function checkpoint ( msg , args , figure ) {
145
+ function checkpoint ( argv , msg , args , figure ) {
175
146
console . info ( ( figure || chalk . green ( figures . tick ) ) + ' ' + util . format . apply ( util , [ msg ] . concat ( args . map ( function ( arg ) {
176
147
return chalk . bold ( arg )
177
148
} ) ) ) )
178
- } ;
149
+ }
150
+
151
+ function printError ( argv , msg , opts ) {
152
+ opts = objectAssign ( {
153
+ level : 'error' ,
154
+ color : 'red'
155
+ } , opts )
156
+
157
+ console [ opts . level ] ( chalk [ opts . color ] ( msg ) )
158
+ }
0 commit comments