@ossjs/release
Version:
Minimalistic, opinionated, and predictable release automation tool.
61 lines • 3.02 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createGitHubRelease = void 0;
const node_fetch_1 = __importDefault(require("node-fetch"));
const outvariant_1 = require("outvariant");
const semver_1 = require("semver");
const getGitHubRelease_1 = require("./getGitHubRelease");
const logger_1 = require("../../logger");
/**
* Create a new GitHub release with the given release notes.
* This is only called if there's no existing GitHub release
* for the next release tag.
* @return {string} The URL of the newly created release.
*/
async function createGitHubRelease(context, notes) {
const { repo } = context;
logger_1.log.info((0, outvariant_1.format)('creating a new GitHub release at "%s/%s"...', repo.owner, repo.name));
// Determine if the next release should be marked as the
// latest release on GitHub. For that, fetch whichever latest
// release exists on GitHub and see if its version is larger
// than the version we are releasing right now.
const latestGitHubRelease = await (0, getGitHubRelease_1.getGitHubRelease)('latest').catch((error) => {
logger_1.log.error(`Failed to fetch the latest GitHub release:`, error);
// We aren't interested in the GET endpoint errors in this context.
return undefined;
});
const shouldMarkAsLatest = latestGitHubRelease
? (0, semver_1.lt)(latestGitHubRelease.tag_name || '0.0.0', context.nextRelease.tag)
: // Undefined is fine, it means GitHub will use its default
// value for the "make_latest" property in the API.
undefined;
/**
* @see https://docs.github.com/en/rest/releases/releases?apiVersion=2022-11-28#create-a-release
*/
const response = await (0, node_fetch_1.default)(`https://api.github.com/repos/${repo.owner}/${repo.name}/releases`, {
method: 'POST',
headers: {
Accept: 'application/json',
Authorization: `Bearer ${process.env.GITHUB_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
tag_name: context.nextRelease.tag,
name: context.nextRelease.tag,
body: notes,
make_latest: shouldMarkAsLatest?.toString(),
}),
});
if (response.status === 401) {
throw new Error('Failed to create a new GitHub release: provided GITHUB_TOKEN does not have sufficient permissions to perform this operation. Please check your token and update it if necessary.');
}
if (response.status !== 201) {
throw new Error((0, outvariant_1.format)('Failed to create a new GitHub release: GitHub API responded with status code %d.', response.status, await response.text()));
}
return response.json();
}
exports.createGitHubRelease = createGitHubRelease;
//# sourceMappingURL=createGitHubRelease.js.map