-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtag-and-release.ts
More file actions
42 lines (34 loc) · 1.21 KB
/
tag-and-release.ts
File metadata and controls
42 lines (34 loc) · 1.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import { $ } from "bun";
import semver from "semver";
import packageJson from "./packages/react-query-tree/package.json";
async function doesTagAlreadyExist(version: string) {
try {
await $`gh api -X GET /repos/{owner}/{repo}/git/ref/tags/v${version}`.quiet();
return true;
} catch {
return false;
}
}
async function tagAndPush(version: string) {
await $`git tag -a v${version} -m "Release version ${version}"`;
await $`git push origin v${version}`;
}
async function createRelease(version: string, preRelease: boolean) {
await $`gh release create v${version} --generate-notes ${preRelease ? "--prerelease" : ""}`;
}
function getVersionAndTag(version: string) {
const parsedVersion = semver.valid(version);
if (!parsedVersion) {
throw new Error(`Invalid version: ${version}`);
}
return { version: parsedVersion };
}
const { version: versionString } = await getVersionAndTag(packageJson.version);
const versionIsBusy = await doesTagAlreadyExist(versionString);
if (versionIsBusy) {
console.error(`Version "${versionString}" already exists`);
process.exit(1);
}
const isPreRelease = packageJson.publishConfig.tag !== "latest";
await tagAndPush(versionString);
await createRelease(versionString, isPreRelease);