#!/usr/bin/env node const url = require('url'); const assert = require('assert'); const GitHub = require('github'); const package = require('../../../package.json'); const github = new GitHub(); assert(process.env.GITHUB_OAUTH_TOKEN, 'GITHUB_OAUTH_TOKEN env variable should contain your personal access token'); github.authenticate({ type: 'oauth', token: process.env.GITHUB_OAUTH_TOKEN }); var repoUrl = package.repository.url || package.homepage; assert(repoUrl, 'Cannot detect repository name. Either `package.repository.url` or `package.homepage` should be set'); var repositoryPath = url.parse(repoUrl).path.replace(/\.git$/, ''); var repositoryParsed = repositoryPath.match(/\/(\S+)\/(\S+)/); const user = repositoryParsed[1]; const repo = repositoryParsed[2]; const checkErr = (err) => { if (err) { console.error(err.toJSON()); process.exit(1); } }; github.repos.getLatestRelease({ user, repo }, (err, latestRelease) => { if (err) { if (err.code === 404) { latestRelease = { name: 'unknown', created_at: new Date('1970-01-01') }; } else { checkErr() } } console.log('Latest release: %s', latestRelease.name) github.pullRequests.getAll({ user, repo, state: 'closed', sort: 'updated', direction: 'desc' }, (err, prs) => { checkErr(err); const name = `v${package.version}`; const body = prs .filter((item) => item.merged_at > latestRelease.created_at) .sort((a, b) => b.title.localeCompare(a.title)) .map((item) => `- ${item.title} #${item.number} (by @${item.user.login})`) .join('\n'); console.log('Publishing release: %s', name); console.log(body); github.repos.createRelease({ user, repo, tag_name: name, target_commitish: 'master', name, body, draft: false, prerelease: false, }, (err) => { checkErr(err); process.exit(0); }); }); });