jsii-release
Version:
Release jsii modules to multiple package managers
133 lines • 15 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
/**
* Creates a GitHub release, tolerating a release that already exists so that
* re-running a release is a no-op rather than a failure.
*
* Usage: publib-github
*
* GITHUB_TOKEN (required): token used to authenticate against the GitHub API
* GITHUB_RELEASE_TAG (optional): the tag to release; either this or GITHUB_RELEASE_TAG_FILE is required
* GITHUB_RELEASE_TAG_FILE (optional): a file containing the tag to release
* GITHUB_CHANGELOG_FILE (optional): a markdown file used as the release notes
* GITHUB_REPOSITORY (optional): the repository to release to, in `owner/repo` format (defaults to the repository of the "origin" remote in the current directory)
* GITHUB_SHA (optional): the commit to tag if the tag doesn't exist yet (defaults to the current git HEAD, or the repository's default branch when not in a git repository)
* GITHUB_PRERELEASE (optional): set to "true" to mark the release as a prerelease
* GITHUB_MARK_LATEST (optional): "true" to explicitly mark the release as the latest release, "false" to explicitly not mark it as latest (defaults to GitHub determining the latest release)
* GITHUB_API_URL (optional): base URL of the GitHub API (defaults to "https://api.github.com"; set automatically in GitHub Actions)
* PUBLIB_DRYRUN (optional): set to "true" to print what would be done without creating a release
*/
const fs_1 = require("fs");
const git = __importStar(require("../help/git"));
const github_1 = require("../targets/github");
async function main() {
const repository = optionalEnv('GITHUB_REPOSITORY') ?? git.repositorySlug();
if (!repository) {
throw new Error('GITHUB_REPOSITORY is required, could not infer the repository from the "origin" remote');
}
const tag = releaseTag();
const changelogFile = optionalEnv('GITHUB_CHANGELOG_FILE');
const body = changelogFile ? (0, fs_1.readFileSync)(changelogFile, 'utf-8') : undefined;
const target = optionalEnv('GITHUB_SHA') ?? git.head();
const prerelease = (optionalEnv('GITHUB_PRERELEASE') ?? 'false').toLowerCase() === 'true';
const latest = parseMarkLatest(optionalEnv('GITHUB_MARK_LATEST'));
const dryRun = (process.env.PUBLIB_DRYRUN ?? process.env.DRYRUN ?? 'false').toLowerCase() === 'true';
if (dryRun) {
console.log(`🏜️ Dry run: would create GitHub release ${tag}${prerelease ? ' (prerelease)' : ''} in ${repository}${target ? ` at ${target}` : ''}`);
console.log('SUCCESS (dry run)');
return;
}
const result = await (0, github_1.createGitHubRelease)({
tag,
repository,
body,
target,
prerelease,
latest,
token: requireEnv('GITHUB_TOKEN'),
apiUrl: optionalEnv('GITHUB_API_URL'),
});
if (result === 'already_exists') {
console.log(`SKIPPING: release ${tag} already exists`);
}
else {
console.log(`SUCCESS: created release ${tag}`);
}
}
function releaseTag() {
const explicitTag = optionalEnv('GITHUB_RELEASE_TAG');
if (explicitTag) {
return explicitTag;
}
const tagFile = optionalEnv('GITHUB_RELEASE_TAG_FILE');
if (!tagFile) {
throw new Error('GITHUB_RELEASE_TAG or GITHUB_RELEASE_TAG_FILE is required');
}
const tag = (0, fs_1.readFileSync)(tagFile, 'utf-8').trim();
if (!tag) {
throw new Error(`release tag file ${tagFile} is empty`);
}
return tag;
}
function parseMarkLatest(value) {
if (value === undefined) {
return undefined;
}
if (value === 'true' || value === 'false') {
return value === 'true';
}
throw new Error(`GITHUB_MARK_LATEST must be "true" or "false", got: "${value}"`);
}
/**
* Returns the value of the environment variable, treating an empty string as
* not set.
*/
function optionalEnv(name) {
return process.env[name] ? process.env[name] : undefined;
}
function requireEnv(name) {
const value = process.env[name];
if (!value) {
throw new Error(`${name} is required`);
}
return value;
}
main().catch((error) => {
console.error(`ERROR: ${error.message}`);
process.exit(1);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGliLWdpdGh1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vcHVibGliLWdpdGh1Yi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILDJCQUFrQztBQUNsQyxpREFBbUM7QUFDbkMsOENBQXdEO0FBRXhELEtBQUssVUFBVSxJQUFJO0lBQ2pCLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUM1RSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3RkFBd0YsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxVQUFVLEVBQUUsQ0FBQztJQUN6QixNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUMzRCxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUEsaUJBQVksRUFBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM5RSxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZELE1BQU0sVUFBVSxHQUFHLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDO0lBQzFGLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUks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QzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN6QyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuLyoqXG4gKiBDcmVhdGVzIGEgR2l0SHViIHJlbGVhc2UsIHRvbGVyYXRpbmcgYSByZWxlYXNlIHRoYXQgYWxyZWFkeSBleGlzdHMgc28gdGhhdFxuICogcmUtcnVubmluZyBhIHJlbGVhc2UgaXMgYSBuby1vcCByYXRoZXIgdGhhbiBhIGZhaWx1cmUuXG4gKlxuICogVXNhZ2U6IHB1YmxpYi1naXRodWJcbiAqXG4gKiBHSVRIVUJfVE9LRU4gKHJlcXVpcmVkKTogdG9rZW4gdXNlZCB0byBhdXRoZW50aWNhdGUgYWdhaW5zdCB0aGUgR2l0SHViIEFQSVxuICogR0lUSFVCX1JFTEVBU0VfVEFHIChvcHRpb25hbCk6IHRoZSB0YWcgdG8gcmVsZWFzZTsgZWl0aGVyIHRoaXMgb3IgR0lUSFVCX1JFTEVBU0VfVEFHX0ZJTEUgaXMgcmVxdWlyZWRcbiAqIEdJVEhVQl9SRUxFQVNFX1RBR19GSUxFIChvcHRpb25hbCk6IGEgZmlsZSBjb250YWluaW5nIHRoZSB0YWcgdG8gcmVsZWFzZVxuICogR0lUSFVCX0NIQU5HRUxPR19GSUxFIChvcHRpb25hbCk6IGEgbWFya2Rvd24gZmlsZSB1c2VkIGFzIHRoZSByZWxlYXNlIG5vdGVzXG4gKiBHSVRIVUJfUkVQT1NJVE9SWSAob3B0aW9uYWwpOiB0aGUgcmVwb3NpdG9yeSB0byByZWxlYXNlIHRvLCBpbiBgb3duZXIvcmVwb2AgZm9ybWF0IChkZWZhdWx0cyB0byB0aGUgcmVwb3NpdG9yeSBvZiB0aGUgXCJvcmlnaW5cIiByZW1vdGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5KVxuICogR0lUSFVCX1NIQSAob3B0aW9uYWwpOiB0aGUgY29tbWl0IHRvIHRhZyBpZiB0aGUgdGFnIGRvZXNuJ3QgZXhpc3QgeWV0IChkZWZhdWx0cyB0byB0aGUgY3VycmVudCBnaXQgSEVBRCwgb3IgdGhlIHJlcG9zaXRvcnkncyBkZWZhdWx0IGJyYW5jaCB3aGVuIG5vdCBpbiBhIGdpdCByZXBvc2l0b3J5KVxuICogR0lUSFVCX1BSRVJFTEVBU0UgKG9wdGlvbmFsKTogc2V0IHRvIFwidHJ1ZVwiIHRvIG1hcmsgdGhlIHJlbGVhc2UgYXMgYSBwcmVyZWxlYXNlXG4gKiBHSVRIVUJfTUFSS19MQVRFU1QgKG9wdGlvbmFsKTogXCJ0cnVlXCIgdG8gZXhwbGljaXRseSBtYXJrIHRoZSByZWxlYXNlIGFzIHRoZSBsYXRlc3QgcmVsZWFzZSwgXCJmYWxzZVwiIHRvIGV4cGxpY2l0bHkgbm90IG1hcmsgaXQgYXMgbGF0ZXN0IChkZWZhdWx0cyB0byBHaXRIdWIgZGV0ZXJtaW5pbmcgdGhlIGxhdGVzdCByZWxlYXNlKVxuICogR0lUSFVCX0FQSV9VUkwgKG9wdGlvbmFsKTogYmFzZSBVUkwgb2YgdGhlIEdpdEh1YiBBUEkgKGRlZmF1bHRzIHRvIFwiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbVwiOyBzZXQgYXV0b21hdGljYWxseSBpbiBHaXRIdWIgQWN0aW9ucylcbiAqIFBVQkxJQl9EUllSVU4gKG9wdGlvbmFsKTogc2V0IHRvIFwidHJ1ZVwiIHRvIHByaW50IHdoYXQgd291bGQgYmUgZG9uZSB3aXRob3V0IGNyZWF0aW5nIGEgcmVsZWFzZVxuICovXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBnaXQgZnJvbSAnLi4vaGVscC9naXQnO1xuaW1wb3J0IHsgY3JlYXRlR2l0SHViUmVsZWFzZSB9IGZyb20gJy4uL3RhcmdldHMvZ2l0aHViJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgY29uc3QgcmVwb3NpdG9yeSA9IG9wdGlvbmFsRW52KCdHSVRIVUJfUkVQT1NJVE9SWScpID8/IGdpdC5yZXBvc2l0b3J5U2x1ZygpO1xuICBpZiAoIXJlcG9zaXRvcnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dJVEhVQl9SRVBPU0lUT1JZIGlzIHJlcXVpcmVkLCBjb3VsZCBub3QgaW5mZXIgdGhlIHJlcG9zaXRvcnkgZnJvbSB0aGUgXCJvcmlnaW5cIiByZW1vdGUnKTtcbiAgfVxuICBjb25zdCB0YWcgPSByZWxlYXNlVGFnKCk7XG4gIGNvbnN0IGNoYW5nZWxvZ0ZpbGUgPSBvcHRpb25hbEVudignR0lUSFVCX0NIQU5HRUxPR19GSUxFJyk7XG4gIGNvbnN0IGJvZHkgPSBjaGFuZ2Vsb2dGaWxlID8gcmVhZEZpbGVTeW5jKGNoYW5nZWxvZ0ZpbGUsICd1dGYtOCcpIDogdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXQgPSBvcHRpb25hbEVudignR0lUSFVCX1NIQScpID8/IGdpdC5oZWFkKCk7XG4gIGNvbnN0IHByZXJlbGVhc2UgPSAob3B0aW9uYWxFbnYoJ0dJVEhVQl9QUkVSRUxFQVNFJykgPz8gJ2ZhbHNlJykudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xuICBjb25zdCBsYXRlc3QgPSBwYXJzZU1hcmtMYXRlc3Qob3B0aW9uYWxFbnYoJ0dJVEhVQl9NQVJLX0xBVEVTVCcpKTtcbiAgY29uc3QgZHJ5UnVuID0gKHByb2Nlc3MuZW52LlBVQkxJQl9EUllSVU4gPz8gcHJvY2Vzcy5lbnYuRFJZUlVOID8/ICdmYWxzZScpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcblxuICBpZiAoZHJ5UnVuKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBg8J+PnO+4jyBEcnkgcnVuOiB3b3VsZCBjcmVhdGUgR2l0SHViIHJlbGVhc2UgJHt0YWd9JHtwcmVyZWxlYXNlID8gJyAocHJlcmVsZWFzZSknIDogJyd9IGluICR7cmVwb3NpdG9yeX0ke3RhcmdldCA/IGAgYXQgJHt0YXJnZXR9YCA6ICcnfWAsXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZygnU1VDQ0VTUyAoZHJ5IHJ1biknKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVHaXRIdWJSZWxlYXNlKHtcbiAgICB0YWcsXG4gICAgcmVwb3NpdG9yeSxcbiAgICBib2R5LFxuICAgIHRhcmdldCxcbiAgICBwcmVyZWxlYXNlLFxuICAgIGxhdGVzdCxcbiAgICB0b2tlbjogcmVxdWlyZUVudignR0lUSFVCX1RPS0VOJyksXG4gICAgYXBpVXJsOiBvcHRpb25hbEVudignR0lUSFVCX0FQSV9VUkwnKSxcbiAgfSk7XG5cbiAgaWYgKHJlc3VsdCA9PT0gJ2FscmVhZHlfZXhpc3RzJykge1xuICAgIGNvbnNvbGUubG9nKGBTS0lQUElORzogcmVsZWFzZSAke3RhZ30gYWxyZWFkeSBleGlzdHNgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhgU1VDQ0VTUzogY3JlYXRlZCByZWxlYXNlICR7dGFnfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbGVhc2VUYWcoKTogc3RyaW5nIHtcbiAgY29uc3QgZXhwbGljaXRUYWcgPSBvcHRpb25hbEVudignR0lUSFVCX1JFTEVBU0VfVEFHJyk7XG4gIGlmIChleHBsaWNpdFRhZykge1xuICAgIHJldHVybiBleHBsaWNpdFRhZztcbiAgfVxuICBjb25zdCB0YWdGaWxlID0gb3B0aW9uYWxFbnYoJ0dJVEhVQl9SRUxFQVNFX1RBR19GSUxFJyk7XG4gIGlmICghdGFnRmlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignR0lUSFVCX1JFTEVBU0VfVEFHIG9yIEdJVEhVQl9SRUxFQVNFX1RBR19GSUxFIGlzIHJlcXVpcmVkJyk7XG4gIH1cbiAgY29uc3QgdGFnID0gcmVhZEZpbGVTeW5jKHRhZ0ZpbGUsICd1dGYtOCcpLnRyaW0oKTtcbiAgaWYgKCF0YWcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJlbGVhc2UgdGFnIGZpbGUgJHt0YWdGaWxlfSBpcyBlbXB0eWApO1xuICB9XG4gIHJldHVybiB0YWc7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWFya0xhdGVzdCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgR0lUSFVCX01BUktfTEFURVNUIG11c3QgYmUgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiLCBnb3Q6IFwiJHt2YWx1ZX1cImApO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdHJlYXRpbmcgYW4gZW1wdHkgc3RyaW5nIGFzXG4gKiBub3Qgc2V0LlxuICovXG5mdW5jdGlvbiBvcHRpb25hbEVudihuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcHJvY2Vzcy5lbnZbbmFtZV0gPyBwcm9jZXNzLmVudltuYW1lXSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVxdWlyZUVudihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9IHByb2Nlc3MuZW52W25hbWVdO1xuICBpZiAoIXZhbHVlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke25hbWV9IGlzIHJlcXVpcmVkYCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tYWluKCkuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICBjb25zb2xlLmVycm9yKGBFUlJPUjogJHtlcnJvci5tZXNzYWdlfWApO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcbiJdfQ==