UNPKG

@ossjs/release

Version:

Minimalistic, opinionated, and predictable release automation tool.

61 lines 3.02 kB
"use strict"; 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