chromium/third_party/google-closure-library/scripts/release/github_client.ts

/**
 * @license
 * Copyright 2020 The Closure Library Authors. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @fileoverview A module that exports a convenience class to interface with the
 * GitHub REST API.
 */

import {Octokit} from '@octokit/rest';

/**
 * An interface that describes options for the GitHubClient class constructor.
 */
export interface GitHubClientOptions {
  /** The owner of the repository. */
  owner: string;
  /** The repository name. */
  repo: string;
  /**
   * A unique user agent for this application, as requested in GitHub API
   * documentation.
   */
  userAgent: string;
  /**
   * A GitHub API token.
   */
  token: string;
}

/**
 * An interface that describes options for GitHubClient#draftRelease.
 */
export interface DraftReleaseOptions {
  /** The name of the tag to associate with this release. */
  tagName: string;
  /** The commit to tag for this release. */
  commit: string;
  /** The name of the release. */
  name: string;
  /** The body text for the release. */
  body: string;
}

/**
 * A class that provides an stripped-down interface for the GitHub REST API.
 */
export class GitHubClient {
  private readonly owner: string;
  private readonly repo: string;
  private readonly octokit: Octokit;

  /**
   * Constructs a new GitHubClient.
   * @param options Options for constructing this GitHubClient.
   */
  constructor({
    owner,
    repo,
    userAgent,
    token,
  }: GitHubClientOptions) {
    this.owner = owner;
    this.repo = repo;
    this.octokit = new Octokit({
      auth: token,
      userAgent,
    });
  }

  /**
   * Returns the tag associated with the latest GitHub Release.
   * @return The tag associated with the latest GitHub Release.
   */
  async getLatestReleaseTag() {
    const {data} = await this.octokit.repos.getLatestRelease({
      owner: this.owner,
      repo: this.repo,
    });
    return data.tag_name;
  }

  /**
   * Drafts a new GitHub Release.
   * @param options Options for drafting the GitHub Release.
   * @return The URL to the GitHub Web UI for managing the drafted release.
   */
  async draftRelease({
    tagName,
    commit,
    name,
    body,
  }: DraftReleaseOptions) {
    const {data} = await this.octokit.repos.createRelease({
      owner: this.owner,
      repo: this.repo,
      tag_name: tagName,
      target_commitish: commit,
      name,
      body,
      draft: true,
    });
    return data.html_url;
  }
}