Skip to main content

GitHub

A Wing library for working with GitHub Probot

Prerequisites

Installation

sh npm i @winglibs/github

Usage

This following application is a simple GitHub application that listens to created and reopened pull requests, look for any *.md files that where changed and replace their content with their uppercase version.

  • It requires a GitHub application
  • Configured secrets

In order to start you need to create a GitHub application:

Create a GitHub App

  1. Goto https://github.com/settings/apps
  2. Click "New GitHub App" and complete form
  3. GitHub App Name
  4. Homepage URL: e.g. https://winglang.io
  5. Webhook:
    1. Active: ✅
    2. URL: http://this-will-change-automatically.com
    3. Webhook secret: "this-is-a-bad-secret"
  6. Permissions -> Repository permissions:
    1. Contents: Read and write
    2. Pull requests: Read and write
  7. Subscribe to events
    1. Pull request
    2. Push
  8. Save
  9. Notice the app id and save it
  10. Generate & download a private key for the app

main.w

When running on the simulator, the Webhook URL will automatically update on every simulator run.

bring util;
bring cloud;
bring github;
bring fs;

let uppercaseAllMarkdownFiles = inflight (ctx) => {
let repo = ctx.payload.repository;

// find all changed mdfiles by comparing the commits of the PR
let compare = ctx.octokit.repos.compareCommits(
owner: repo.owner.login,
repo: repo.name,
base: ctx.payload.pull_request.base.sha,
head: ctx.payload.pull_request.head.sha,
);

let mdFiles = MutMap<str>{};
for commit in compare.data.commits {
let commitContent = ctx.octokit.repos.getCommit(
owner: repo.owner.login,
repo: repo.name,
ref: ctx.payload.pull_request.head.ref,
);
if let files = commitContent.data.files {
for file in files {
if file.filename.endsWith(".md") &&
(file.status == "modified" || file.status == "added" || file.status == "changed") {
mdFiles.set(file.filename, file.sha);
}
}
}
}

// list over mdfiles and update them
for filename in mdFiles.keys() {
let contents = ctx.octokit.repos.getContent(
owner: repo.owner.login,
repo: repo.name,
path: filename,
ref: ctx.payload.pull_request.head.sha
);

let fileContents = util.base64Decode("{contents.data.content}");

ctx.octokit.repos.createOrUpdateFileContents(
owner: repo.owner.login,
repo: repo.name,
branch: ctx.payload.pull_request.head.ref,
sha: contents.data.sha,
path: filename,
message: "uppercase {filename}",
content: util.base64Encode(fileContents.uppercase())
);
}
};

class SimpleCredentialsSupplier impl github.IProbotAppCredentialsSupplier {

pub inflight getId(): str {
return "app id";
}

pub inflight getWebhookSecret(): str {
return "this-is-a-bad-secret";
}

pub inflight getPrivateKey(): str {
return fs.readFile("/path/to/private-key.pem");
}
}

let credentialsSupplier = new SimpleCredentialsSupplier();
let markdown = new github.ProbotApp(
credentialsSupplier: credentialsSupplier,
onPullRequestOpened: handler,
onPullRequestReopened: handler
);

License

This library is licensed under the MIT License.

API Reference

Table of Contents

ProbotApp (preflight class)

No description

Constructor

new(props: ProbotAppProps): ProbotApp

Properties

No properties

Methods

SignatureDescription
static inflight createGithubAppJwt(appId: str, privateKey: str): strNo description
onPullRequestOpened(handler: inflight (PullRequestOpenedContext): void): voidNo description
onPullRequestReopened(handler: inflight (PullRequestOpenedContext): void): voidNo description
inflight updateWebhookUrl(url: str): voidNo description

utils.LowkeysMap (inflight class)

No description

Constructor

new(): LowkeysMap

Properties

No properties

Methods

SignatureDescription
static inflight fromMap(map: Map): Map
No description

simutils.Port (preflight class)

No description

Constructor

new(): Port

Properties

NameTypeDescription
portstrNo description

Methods

No methods

simutils.Service (preflight class)

No description

Constructor

new(command: str, args: Array<str>, props: ServiceProps): Service

Properties

No properties

Methods

No methods

probot.ProbotAdapter (preflight class)

No description

Constructor

new(props: ProbotAdapterProps): ProbotAdapter

Properties

No properties

Methods

SignatureDescription
inflight auth(installationId: num): OctoKitNo description
static inflight createProbotAdapter(options: CreateAdapterOptions): ProbotInstanceNo description
inflight handlePullRequstClosed(handler: inflight (PullRequestClosedContext): void): voidNo description
inflight handlePullRequstOpened(handler: inflight (PullRequestOpenedContext): void): voidNo description
inflight handlePullRequstReopened(handler: inflight (PullRequestOpenedContext): void): voidNo description
inflight handlePullRequstSync(handler: inflight (PullRequestSyncContext): void): voidNo description
inflight handlePush(handler: inflight (PushContext): void): voidNo description
inflight verifyAndReceive(props: VerifyAndReceieveProps): voidNo description

ngrok.Ngrok (preflight class)

No description

Constructor

new(props: NgrokProps): Ngrok

Properties

NameTypeDescription
urlstrNo description

Methods

No methods

IProbotAppCredentialsSupplier (interface)

No description

Properties

No properties

Methods

SignatureDescription
inflight getId(): strNo description
inflight getPrivateKey(): strNo description
inflight getWebhookSecret(): strNo description

simutils.Process (interface)

No description

Properties

No properties

Methods

SignatureDescription
inflight kill(): voidNo description

probot.IProbotAuth (interface)

No description

Properties

No properties

Methods

SignatureDescription
inflight call(instance: ProbotInstance, installationId: num): OctoKitNo description

probot.IProbotWebhooks (interface)

No description

Properties

No properties

Methods

SignatureDescription
inflight on(name: str, handler: inflight (): void): voidNo description
inflight verifyAndReceive(props: VerifyAndReceieveProps): voidNo description

probot.IProbotAppCredentialsSupplier (interface)

No description

Properties

No properties

Methods

SignatureDescription
inflight getId(): strNo description
inflight getPrivateKey(): strNo description
inflight getWebhookSecret(): strNo description

ProbotAppProps (struct)

No description

Properties

NameTypeDescription
credentialsSupplierIProbotAppCredentialsSupplierNo description

simutils.ServiceProps (struct)

No description

Properties

NameTypeDescription
cwdstr?No description
env
Map?
No description

probot.Context (struct)

No description

Properties

NameTypeDescription
idstrNo description
octokitOctoKitNo description

probot.ProbotInstance (struct)

No description

Properties

NameTypeDescription
authIProbotAuthNo description
webhooksIProbotWebhooksNo description

probot.PullRequestClosedContext (struct)

No description

Properties

NameTypeDescription
idstrNo description
octokitOctoKitNo description
payloadPullRequestPayloadNo description

probot.PullRequestContext (struct)

No description

Properties

NameTypeDescription
idstrNo description
octokitOctoKitNo description
payloadPullRequestPayloadNo description

probot.PullRequestOpenedContext (struct)

No description

Properties

NameTypeDescription
idstrNo description
octokitOctoKitNo description
payloadPullRequestPayloadNo description

probot.PullRequestSyncContext (struct)

No description

Properties

NameTypeDescription
idstrNo description
octokitOctoKitNo description
payloadPullRequestPayloadNo description

probot.PushContext (struct)

No description

Properties

NameTypeDescription
idstrNo description
octokitOctoKitNo description
payloadPushPayloadNo description

probot.VerifyAndReceieveProps (struct)

No description

Properties

NameTypeDescription
idstrNo description
namestrNo description
payloadstrNo description
signaturestrNo description

probot.CreateAdapterOptions (struct)

No description

Properties

NameTypeDescription
appIdstrNo description
privateKeystrNo description
webhookSecretstrNo description

probot.ProbotAdapterProps (struct)

No description

Properties

NameTypeDescription
credentialsSupplierIProbotAppCredentialsSupplierNo description

octokit.CompareCommitsProps (struct)

No description

Properties

NameTypeDescription
basestrNo description
headstrNo description
ownerstrNo description
repostrNo description

octokit.CompareCommitsResponse (struct)

No description

Properties

NameTypeDescription
dataCompareCommitsResponseDataNo description

octokit.CompareCommitsResponseCommit (struct)

No description

Properties

NameTypeDescription
shastrNo description

octokit.CompareCommitsResponseData (struct)

No description

Properties

NameTypeDescription
commits
Array
No description

octokit.CompareCommitsResponseFile (struct)

No description

Properties

NameTypeDescription
filanamestrNo description
shastrNo description

octokit.GetCommitProps (struct)

No description

Properties

NameTypeDescription
ownerstrNo description
refstrNo description
repostrNo description

octokit.GetCommitResponse (struct)

No description

Properties

NameTypeDescription
dataGetCommitResponseDataNo description

octokit.GetCommitResponseData (struct)

No description

Properties

NameTypeDescription
files
Array?
No description

octokit.GetCommitResponseFile (struct)

No description

Properties

NameTypeDescription
filenamestrNo description
shastrNo description
statusstrNo description

octokit.GetContentProps (struct)

No description

Properties

NameTypeDescription
ownerstrNo description
pathstrNo description
refstr?No description
repostrNo description

octokit.GetContentResponse (struct)

No description

Properties

NameTypeDescription
dataGetContentResponseDataNo description
statusnumNo description

octokit.GetContentResponseData (struct)

No description

Properties

NameTypeDescription
contentstr?No description
namestrNo description
pathstrNo description
shastrNo description
sizenumNo description
typestrNo description

octokit.ListReposResponse (struct)

No description

Properties

NameTypeDescription
data
Array
No description
statusnumNo description

octokit.OctoKit (struct)

No description

Properties

NameTypeDescription
appsOctoKitAppsNo description
gitOctoKitGitNo description
issuesOctoKitIssuesNo description
pullsOctoKitPullsNo description
reposOctoKitReposNo description

ngrok.NgrokProps (struct)

No description

Properties

NameTypeDescription
domainstr?No description
urlstrNo description