@@ -21,61 +21,76 @@ module.exports = async (pluginConfig, context) => {
21
21
const { githubToken, githubUrl, githubApiPathPrefix, proxy, assets} = resolveConfig ( pluginConfig , context ) ;
22
22
const { name : repo , owner} = parseGithubUrl ( repositoryUrl ) ;
23
23
const github = getClient ( { githubToken, githubUrl, githubApiPathPrefix, proxy} ) ;
24
- const release = { owner, repo, tag_name : gitTag , name, body : notes , prerelease : isPrerelease ( branch ) } ; // eslint-disable-line camelcase
24
+ const release = { owner, repo, tag_name : gitTag , name, body : notes , prerelease : isPrerelease ( branch ) } ;
25
25
26
26
debug ( 'release object: %O' , release ) ;
27
27
28
- const {
29
- data : { html_url : url , upload_url : uploadUrl } ,
30
- } = await github . repos . createRelease ( release ) ;
31
- logger . log ( 'Published GitHub release: %s' , url ) ;
28
+ // When there are no assets, we publish a release directly
29
+ if ( ! assets || assets . length === 0 ) {
30
+ const {
31
+ data : { html_url : url } ,
32
+ } = await github . repos . createRelease ( release ) ;
32
33
33
- if ( assets && assets . length > 0 ) {
34
- const globbedAssets = await globAssets ( context , assets ) ;
35
- debug ( 'globed assets: %o' , globbedAssets ) ;
36
-
37
- await Promise . all (
38
- globbedAssets . map ( async asset => {
39
- const filePath = isPlainObject ( asset ) ? asset . path : asset ;
40
- let file ;
41
-
42
- try {
43
- file = await stat ( resolve ( cwd , filePath ) ) ;
44
- } catch ( error ) {
45
- logger . error ( 'The asset %s cannot be read, and will be ignored.' , filePath ) ;
46
- return ;
47
- }
48
-
49
- if ( ! file || ! file . isFile ( ) ) {
50
- logger . error ( 'The asset %s is not a file, and will be ignored.' , filePath ) ;
51
- return ;
52
- }
53
-
54
- const fileName = asset . name || basename ( filePath ) ;
55
- const upload = {
56
- url : uploadUrl ,
57
- file : await readFile ( resolve ( cwd , filePath ) ) ,
58
- name : fileName ,
59
- headers : {
60
- 'content-type' : mime . getType ( extname ( fileName ) ) || 'text/plain' ,
61
- 'content-length' : file . size ,
62
- } ,
63
- } ;
64
-
65
- debug ( 'file path: %o' , filePath ) ;
66
- debug ( 'file name: %o' , fileName ) ;
67
-
68
- if ( isPlainObject ( asset ) && asset . label ) {
69
- upload . label = asset . label ;
70
- }
71
-
72
- const {
73
- data : { browser_download_url : downloadUrl } ,
74
- } = await github . repos . uploadReleaseAsset ( upload ) ;
75
- logger . log ( 'Published file %s' , downloadUrl ) ;
76
- } )
77
- ) ;
34
+ logger . log ( 'Published GitHub release: %s' , url ) ;
35
+ return { url, name : RELEASE_NAME } ;
78
36
}
79
37
38
+ // We'll create a draft release, append the assets to it, and then publish it.
39
+ // This is so that the assets are available when we get a Github release event.
40
+ const draftRelease = { ...release , draft : true } ;
41
+
42
+ const {
43
+ data : { html_url : url , upload_url : uploadUrl , id : releaseId } ,
44
+ } = await github . repos . createRelease ( draftRelease ) ;
45
+
46
+ // Append assets to the release
47
+ const globbedAssets = await globAssets ( context , assets ) ;
48
+ debug ( 'globed assets: %o' , globbedAssets ) ;
49
+
50
+ await Promise . all (
51
+ globbedAssets . map ( async asset => {
52
+ const filePath = isPlainObject ( asset ) ? asset . path : asset ;
53
+ let file ;
54
+
55
+ try {
56
+ file = await stat ( resolve ( cwd , filePath ) ) ;
57
+ } catch ( error ) {
58
+ logger . error ( 'The asset %s cannot be read, and will be ignored.' , filePath ) ;
59
+ return ;
60
+ }
61
+
62
+ if ( ! file || ! file . isFile ( ) ) {
63
+ logger . error ( 'The asset %s is not a file, and will be ignored.' , filePath ) ;
64
+ return ;
65
+ }
66
+
67
+ const fileName = asset . name || basename ( filePath ) ;
68
+ const upload = {
69
+ url : uploadUrl ,
70
+ file : await readFile ( resolve ( cwd , filePath ) ) ,
71
+ name : fileName ,
72
+ headers : {
73
+ 'content-type' : mime . getType ( extname ( fileName ) ) || 'text/plain' ,
74
+ 'content-length' : file . size ,
75
+ } ,
76
+ } ;
77
+
78
+ debug ( 'file path: %o' , filePath ) ;
79
+ debug ( 'file name: %o' , fileName ) ;
80
+
81
+ if ( isPlainObject ( asset ) && asset . label ) {
82
+ upload . label = asset . label ;
83
+ }
84
+
85
+ const {
86
+ data : { browser_download_url : downloadUrl } ,
87
+ } = await github . repos . uploadReleaseAsset ( upload ) ;
88
+ logger . log ( 'Published file %s' , downloadUrl ) ;
89
+ } )
90
+ ) ;
91
+
92
+ await github . repos . updateRelease ( { owner, repo, release_id : releaseId , draft : false } ) ;
93
+
94
+ logger . log ( 'Published GitHub release: %s' , url ) ;
80
95
return { url, name : RELEASE_NAME } ;
81
96
} ;
0 commit comments