UNPKG

@pagopa/dx-cli

Version:

A CLI useful to manage DX tools.

66 lines (65 loc) 2.46 kB
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));