1
1
const args = require ( 'minimist' ) ( process . argv . slice ( 2 ) )
2
2
const fs = require ( 'fs' )
3
3
const path = require ( 'path' )
4
+ const chalk = require ( 'chalk' )
4
5
const semver = require ( 'semver' )
5
6
const currentVersion = require ( '../package.json' ) . version
6
7
const { prompt } = require ( 'enquirer' )
@@ -14,6 +15,8 @@ const packages = fs
14
15
. readdirSync ( path . resolve ( __dirname , '../packages' ) )
15
16
. filter ( p => ! p . endsWith ( '.ts' ) && ! p . startsWith ( '.' ) )
16
17
18
+ const skippedPackages = [ 'server-renderer' ]
19
+
17
20
const versionIncrements = [
18
21
'patch' ,
19
22
'minor' ,
@@ -28,7 +31,11 @@ const inc = i => semver.inc(currentVersion, i, preId)
28
31
const bin = name => path . resolve ( __dirname , '../node_modules/.bin/' + name )
29
32
const run = ( bin , args , opts = { } ) =>
30
33
execa ( bin , args , { stdio : 'inherit' , ...opts } )
34
+ const dryRun = ( bin , args , opts = { } ) =>
35
+ console . log ( chalk . blue ( `[dryrun] ${ bin } ${ args . join ( ' ' ) } ` ) , opts )
36
+ const runIfNotDry = isDryRun ? dryRun : run
31
37
const getPkgRoot = pkg => path . resolve ( __dirname , '../packages/' + pkg )
38
+ const step = msg => console . log ( chalk . cyan ( msg ) )
32
39
33
40
async function main ( ) {
34
41
let targetVersion = args . _ [ 0 ]
@@ -69,85 +76,134 @@ async function main() {
69
76
}
70
77
71
78
// run tests before release
72
- if ( ! skipTests ) {
79
+ step ( '\nRunning tests...' )
80
+ if ( ! skipTests && ! isDryRun ) {
73
81
await run ( bin ( 'jest' ) , [ '--clearCache' ] )
74
82
await run ( 'yarn' , [ 'test' ] )
83
+ } else {
84
+ console . log ( `(skipped)` )
75
85
}
76
86
77
87
// update all package versions and inter-dependencies
88
+ step ( '\nUpdating cross dependencies...' )
78
89
updateVersions ( targetVersion )
79
90
80
91
// build all packages with types
81
- if ( ! skipBuild ) {
92
+ step ( '\nBuilding all packages...' )
93
+ if ( ! skipBuild && ! isDryRun ) {
82
94
await run ( 'yarn' , [ 'build' , '--release' ] )
83
95
// test generated dts files
96
+ step ( '\nVerifying type declarations...' )
84
97
await run ( bin ( 'tsd' ) )
98
+ } else {
99
+ console . log ( `(skipped)` )
85
100
}
86
101
87
- // all good...
88
- if ( isDryRun ) {
89
- // stop here so we can inspect changes to be committed
90
- // and packages built
91
- console . log ( 'Dry run finished.' )
102
+ const { stdout } = await run ( 'git' , [ 'diff' ] , { stdio : 'pipe' } )
103
+ if ( stdout ) {
104
+ step ( '\nCommitting changes...' )
105
+ await runIfNotDry ( 'git' , [ 'add' , '-A' ] )
106
+ await runIfNotDry ( 'git' , [ 'commit' , '-m' , `release: v ${ targetVersion } ` ] )
92
107
} else {
93
- // commit all changes
94
- console . log ( 'Committing changes...' )
95
- await run ( 'git' , [ 'add' , '-A' ] )
96
- await run ( 'git' , [ 'commit' , '-m' , `release: v${ targetVersion } ` ] )
97
-
98
- // publish packages
99
- const releaseTag = semver . prerelease ( targetVersion ) [ 0 ] || 'latest'
100
- for ( const pkg of packagesToPublish ) {
101
- await publish ( pkg , releaseTag )
102
- }
108
+ console . log ( 'No changes to commit.' )
109
+ }
110
+
111
+ // publish packages
112
+ step ( '\nPublishing packages...' )
113
+ const releaseTag = semver . prerelease ( targetVersion ) [ 0 ] || 'latest'
114
+ for ( const pkg of packages ) {
115
+ step ( `Publishing ${ pkg } ...` )
116
+ await publishPackage ( pkg , targetVersion , releaseTag , runIfNotDry )
117
+ }
118
+
119
+ // push to GitHub
120
+ step ( '\nPushing to GitHub...' )
121
+ await runIfNotDry ( 'git' , [ 'tag' , `v${ targetVersion } ` ] )
122
+ await runIfNotDry ( 'git' , [ 'push' , 'origin' , `refs/tags/v${ targetVersion } ` ] )
123
+ await runIfNotDry ( 'git' , [ 'push' ] )
124
+
125
+ if ( isDryRun ) {
126
+ console . log ( `\nDry run finished - run git diff to see package changes.` )
127
+ }
103
128
104
- // push to GitHub
105
- await run ( 'git' , [ 'tag' , `v${ targetVersion } ` ] )
106
- await run ( 'git' , [ 'push' , 'origin' , `refs/tags/v${ targetVersion } ` ] )
107
- await run ( 'git' , [ 'push' ] )
129
+ if ( skippedPackages . length ) {
130
+ console . log (
131
+ chalk . yellow (
132
+ `The following packages are skipped and NOT published:\n- ${ skippedPackages . join (
133
+ '\n- '
134
+ ) } `
135
+ )
136
+ )
108
137
}
138
+ console . log ( )
109
139
}
110
140
111
141
function updateVersions ( version ) {
112
- console . log ( 'Updating versions...' )
113
142
// 1. update root package.json
114
143
updatePackage ( path . resolve ( __dirname , '..' ) , version )
115
144
// 2. update all packages
116
145
packages . forEach ( p => updatePackage ( getPkgRoot ( p ) , version ) )
117
146
}
118
147
119
148
function updatePackage ( pkgRoot , version ) {
120
- const pkg = readPkg ( pkgRoot )
149
+ const pkgPath = path . resolve ( pkgRoot , 'package.json' )
150
+ const pkg = JSON . parse ( fs . readFileSync ( pkgPath , 'utf-8' ) )
121
151
pkg . version = version
122
- updateDeps ( pkg . dependencies )
123
- updateDeps ( pkg . peerDependencies )
152
+ updateDeps ( pkg , ' dependencies' , version )
153
+ updateDeps ( pkg , ' peerDependencies' , version )
124
154
fs . writeFileSync ( pkgPath , JSON . stringify ( pkg , null , 2 ) + '\n' )
125
155
}
126
156
127
- function updateDeps ( deps , version ) {
157
+ function updateDeps ( pkg , depType , version ) {
158
+ const deps = pkg [ depType ]
128
159
if ( ! deps ) return
129
160
Object . keys ( deps ) . forEach ( dep => {
130
161
if (
131
162
dep === 'vue' ||
132
163
( dep . startsWith ( '@vue' ) && packages . includes ( dep . replace ( / ^ @ v u e \/ / , '' ) ) )
133
164
) {
165
+ console . log (
166
+ chalk . yellow ( `${ pkg . name } -> ${ depType } -> ${ dep } @${ version } ` )
167
+ )
134
168
deps [ dep ] = version
135
169
}
136
170
} )
137
171
}
138
172
139
- function readPkg ( pkgRoot ) {
140
- const pkgPath = path . resolve ( pkgRoot , 'package.json' )
141
- return JSON . parse ( fs . readFileSync ( pkgPath , 'utf-8' ) )
142
- }
143
-
144
- async function publish ( pkgName , releaseTag ) {
173
+ async function publishPackage ( pkgName , version , releaseTag , runIfNotDry ) {
174
+ if ( skippedPackages . includes [ pkgName ] ) {
175
+ return
176
+ }
145
177
const pkgRoot = getPkgRoot ( pkgName )
146
- const pkg = readPkg ( pkgRoot )
147
- if ( ! pkg . private ) {
148
- await run ( 'npm' , [ 'publish' , '--tag' , releaseTag ] , {
149
- cwd : pkgRoot
150
- } )
178
+ const pkgPath = path . resolve ( pkgRoot , 'package.json' )
179
+ const pkg = JSON . parse ( fs . readFileSync ( pkgPath , 'utf-8' ) )
180
+ if ( pkg . private ) {
181
+ return
182
+ }
183
+ try {
184
+ await runIfNotDry (
185
+ 'yarn' ,
186
+ [
187
+ 'publish' ,
188
+ '--new-version' ,
189
+ version ,
190
+ '--tag' ,
191
+ releaseTag ,
192
+ '--access' ,
193
+ 'public'
194
+ ] ,
195
+ {
196
+ cwd : pkgRoot ,
197
+ stdio : 'pipe'
198
+ }
199
+ )
200
+ console . log ( chalk . green ( `Successfully published ${ pkgName } @${ version } ` ) )
201
+ } catch ( e ) {
202
+ if ( e . stderr . match ( / p r e v i o u s l y p u b l i s h e d / ) ) {
203
+ console . log ( chalk . red ( `Skipping already published: ${ pkgName } ` ) )
204
+ } else {
205
+ throw e
206
+ }
151
207
}
152
208
}
153
209
0 commit comments