@pagopa/dx-cli
Version:
A CLI useful to manage DX tools.
66 lines (65 loc) • 2.46 kB
JavaScript
import { ResultAsync } from "neverthrow";
import { RequestError } from "octokit";
import semverParse from "semver/functions/parse.js";
import semverSort from "semver/functions/sort.js";
import { PullRequest, Repository, RepositoryNotFoundError, } from "../../domain/github.js";
export class OctokitGitHubService {
#octokit;
constructor(octokit) {
this.#octokit = octokit;
}
async createPullRequest(params) {
try {
const { data } = await this.#octokit.rest.pulls.create({
base: params.base,
body: params.body,
head: params.head,
owner: params.owner,
repo: params.repo,
title: params.title,
});
return new PullRequest(data.html_url);
}
catch (error) {
throw new Error(`Failed to create pull request in ${params.owner}/${params.repo}`, {
cause: error,
});
}
}
async getRepository(owner, name) {
try {
const { data } = await this.#octokit.rest.repos.get({
owner,
repo: name,
});
return new Repository(data.name, data.owner.login);
}
catch (error) {
if (error instanceof RequestError && error.status === 404) {
throw new RepositoryNotFoundError(owner, name);
}
throw new Error(`Failed to fetch repository ${owner}/${name}`, {
cause: error,
});
}
}
}
export const fetchLatestTag = ({ client, owner, repo }) => ResultAsync.fromPromise(
// Get repository tags
client.request("GET /repos/{owner}/{repo}/tags", {
owner,
repo,
}), () => new Error(`Failed to fetch tags for ${owner}/${repo}`))
.map(({ data }) => data.map(({ name }) => name))
// Filter out tags that are not valid semver
.map((tags) => tags.map((tag) => semverParse(tag)).filter((tag) => tag !== null))
// Sort tags in ascending order
.map(semverSort)
// Get the latest tag
.map((tags) => tags.pop() ?? null);
export const fetchLatestRelease = ({ client, owner, repo, }) => ResultAsync.fromPromise(
// Get the latest release for a repository
client.request("GET /repos/{owner}/{repo}/releases/latest", {
owner,
repo,
}), () => new Error(`Failed to fetch latest release for ${owner}/${repo}`)).map(({ data }) => semverParse(data.tag_name));