projenrc/publish-target.ts (48 lines of code) (raw):
import * as core from '@actions/core';
import * as gh from '@actions/github';
import { parse } from 'semver';
import { PublishTargetOutput } from './release';
(async function () {
if (process.argv.length !== 3) {
console.error('Usage: yarn release <semver-version-string>');
process.exit(2);
}
const semver = parse(process.argv[2]);
if (semver == null) {
console.error(`Invalid SemVer version string: ${process.argv[2]}`);
process.exit(2);
}
const prerelease = semver.prerelease.length > 0;
// We follow TypeScript versions, so major.minor is the effective "major".
const tagBase = `v${semver.major}.${semver.minor}`;
const latest = prerelease
? false
: await (async function () {
if (!process.env.GITHUB_TOKEN) {
console.error('Missing GITHUB_TOKEN environment variable. This is required!');
process.exit(2);
}
const octokit = gh.getOctokit(process.env.GITHUB_TOKEN);
const latestRelease = (await octokit.paginate(octokit.rest.repos.listReleases, gh.context.repo))
// Filter out draft releases
.filter((release) => !release.draft)
// Parse out the tags as SemVer instances
.map((release) => parse(release.tag_name)!)
// Sort by SemVer order (in reverse so the greatest appears first)
.sort((l, r) => -l.compare(r))
// First non-prerelease is the latest release per SemVer order
.find((release) => release.prerelease.length === 0);
return latestRelease == null
? // If there's no existing "latest" release, then this is it now...
true
: // Otherwise, it's the new "latest" if it's SemVer-greater than the current one.
semver.compare(latestRelease) >= 0;
})();
// NB: Tag names can't be valid SemVer ranges (v#.# would be one).
const distTag = prerelease
? // Pre-release, publish to next
`${tagBase}-next`
: // Not a pre-releaase, publish to latest on npmjs.com
`${tagBase}-latest`;
core.setOutput(PublishTargetOutput.DIST_TAG, distTag);
core.setOutput(PublishTargetOutput.IS_LATEST, latest);
core.setOutput(PublishTargetOutput.IS_PRERELEASE, prerelease);
core.setOutput(PublishTargetOutput.GITHUB_RELEASE, semver.prerelease?.[0] !== 'dev');
})().catch((err) => {
console.error(err);
process.exit(255);
});