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