@@ -26,6 +26,12 @@ let cli = readline.createInterface({
26
26
output : process . stdout
27
27
} ) ;
28
28
29
+ function question ( prompt ) {
30
+ return new Promise ( resolve => {
31
+ cli . question ( prompt , resolve ) ;
32
+ } ) ;
33
+ }
34
+
29
35
// Load up the built packages in dist.
30
36
let packages = Project . from ( DIST_PATH )
31
37
. packages
@@ -37,30 +43,35 @@ let distTag;
37
43
38
44
// Begin interactive CLI
39
45
printExistingVersions ( ) ;
40
- promptForVersion ( ) ;
46
+ promptForVersion ( )
47
+ . finally ( ( ) => cli . close ( ) )
48
+ . catch ( reason => {
49
+ console . error ( reason ) ;
50
+ process . exit ( 1 ) ;
51
+ } ) ;
41
52
42
53
function printExistingVersions ( ) {
43
54
let packageVersions = packages . map ( package => [ package . name , package . version ] ) ;
44
55
printPadded ( packageVersions ) ;
45
56
}
46
57
47
- function promptForVersion ( ) {
58
+ async function promptForVersion ( ) {
48
59
let defaultVersion = generateDefaultVersion ( ) ;
49
60
50
- cli . question ( chalk . green ( `\nNew version to publish? [${ defaultVersion } ] ` ) , version => {
51
- version = version . trim ( ) ;
52
- if ( version === '' ) {
53
- version = defaultVersion ;
54
- }
61
+ let version = await question ( chalk . green ( `\nNew version to publish? [${ defaultVersion } ] ` ) )
55
62
56
- validateNewVersion ( version ) ;
57
- console . log ( chalk . green ( `Publishing v${ version } ...` ) ) ;
63
+ version = version . trim ( ) ;
64
+ if ( version === '' ) {
65
+ version = defaultVersion ;
66
+ }
58
67
59
- newVersion = version ;
60
- applyNewVersion ( ) ;
61
- gitCommitAndTag ( ) ;
62
- confirmPublish ( ) ;
63
- } ) ;
68
+ await validateNewVersion ( version ) ;
69
+ console . log ( chalk . green ( `Publishing v${ version } ...` ) ) ;
70
+
71
+ newVersion = version ;
72
+ await applyNewVersion ( ) ;
73
+ await gitCommitAndTag ( ) ;
74
+ await confirmPublish ( ) ;
64
75
}
65
76
66
77
function generateDefaultVersion ( ) {
@@ -152,31 +163,47 @@ function gitCommitAndTag() {
152
163
execWithSideEffects ( `git tag "v${ newVersion } "` ) ;
153
164
}
154
165
155
- function confirmPublish ( ) {
166
+ async function getOTPToken ( ) {
167
+ let token = await question ( chalk . green ( '\nPlease provide OTP token ' ) ) ;
168
+
169
+ return token . trim ( ) ;
170
+ }
171
+
172
+ async function confirmPublish ( ) {
156
173
distTag = semver . prerelease ( newVersion ) ? 'next' : 'latest' ;
157
174
158
175
console . log ( chalk . blue ( "Version" ) , newVersion ) ;
159
176
console . log ( chalk . blue ( "Dist Tag" ) , distTag ) ;
160
177
161
- cli . question ( chalk . bgRed . white . bold ( "Are you sure? [Y/N]" ) + " " , answer => {
162
- if ( answer !== 'y' && answer !== 'Y' ) {
163
- console . log ( chalk . red ( "Aborting" ) ) ;
164
- cli . close ( ) ;
165
- return ;
166
- }
178
+ let answer = await question ( chalk . bgRed . white . bold ( "Are you sure? [Y/N]" ) + " " ) ;
179
+ if ( answer !== 'y' && answer !== 'Y' ) {
180
+ console . log ( chalk . red ( "Aborting" ) ) ;
181
+ return ;
182
+ }
167
183
168
- packages . filter ( pkg => ! pkg . private ) . forEach ( package => {
169
- execWithSideEffects ( `npm publish --tag ${ distTag } --access public` , {
184
+ let otp = await getOTPToken ( ) ;
185
+ let publicPackages = packages . filter ( pkg => ! pkg . private ) ;
186
+ for ( let package of publicPackages ) {
187
+ try {
188
+ execWithSideEffects ( `npm publish --tag ${ distTag } --otp ${ otp } --access public` , {
170
189
cwd : package . absolutePath
171
190
} ) ;
172
- } ) ;
191
+ } catch ( e ) {
192
+ // the token is outdated, we need another one
193
+ if ( e . message . includes ( 'E401' ) ) {
194
+ otp = await getOTPToken ( ) ;
195
+
196
+ publishPackage ( distTag , otp , package . absolutePath ) ;
197
+ } else {
198
+ throw e ;
199
+ }
200
+ }
201
+ }
173
202
174
- execWithSideEffects ( `git push origin master --tags` ) ;
203
+ execWithSideEffects ( `git push origin master --tags` ) ;
175
204
176
- console . log ( chalk . green ( `\nv${ newVersion } deployed!` ) ) ;
177
- console . log ( chalk . green ( 'Done.' ) ) ;
178
- cli . close ( ) ;
179
- } ) ;
205
+ console . log ( chalk . green ( `\nv${ newVersion } deployed!` ) ) ;
206
+ console . log ( chalk . green ( 'Done.' ) ) ;
180
207
}
181
208
182
209
function fatalError ( message ) {
0 commit comments