UNPKG

1.62 kBJavaScriptView Raw
1const debug = require('debug')('semantic-release:github');
2const {RELEASE_NAME} = require('./definitions/constants');
3const parseGithubUrl = require('./parse-github-url');
4const resolveConfig = require('./resolve-config');
5const getClient = require('./get-client');
6const isPrerelease = require('./is-prerelease');
7
8module.exports = async (pluginConfig, context) => {
9 const {
10 options: {repositoryUrl},
11 branch,
12 nextRelease: {name, gitTag, notes},
13 logger,
14 } = context;
15 const {githubToken, githubUrl, githubApiPathPrefix, proxy} = resolveConfig(pluginConfig, context);
16 const {owner, repo} = parseGithubUrl(repositoryUrl);
17 const github = getClient({githubToken, githubUrl, githubApiPathPrefix, proxy});
18 let releaseId;
19
20 const release = {owner, repo, name, prerelease: isPrerelease(branch), tag_name: gitTag};
21
22 debug('release object: %O', release);
23
24 try {
25 ({
26 data: {id: releaseId},
27 } = await github.repos.getReleaseByTag({owner, repo, tag: gitTag}));
28 } catch (error) {
29 if (error.status === 404) {
30 logger.log('There is no release for tag %s, creating a new one', gitTag);
31
32 const {
33 data: {html_url: url},
34 } = await github.repos.createRelease({...release, body: notes});
35
36 logger.log('Published GitHub release: %s', url);
37 return {url, name: RELEASE_NAME};
38 }
39
40 throw error;
41 }
42
43 debug('release release_id: %o', releaseId);
44
45 const {
46 data: {html_url: url},
47 } = await github.repos.updateRelease({...release, release_id: releaseId});
48
49 logger.log('Updated GitHub release: %s', url);
50
51 return {url, name: RELEASE_NAME};
52};