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
- Goto https://github.com/settings/apps
 - Click "New GitHub App" and complete form
 - GitHub App Name
 - Homepage URL: e.g. https://winglang.io
 - Webhook:
- Active: ✅
 - URL: http://this-will-change-automatically.com
 - Webhook secret: "this-is-a-bad-secret"
 
 - Permissions -> Repository permissions:
- Contents: Read and write
 - Pull requests: Read and write
 
 - Subscribe to events
- Pull request
 - Push
 
 - Save
 - Notice the app id and save it
 - 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
- Classes
 - Interfaces
 - Structs
- ProbotAppProps
 - simutils.ServiceProps
 - probot.Context
 - probot.ProbotInstance
 - probot.PullRequestClosedContext
 - probot.PullRequestContext
 - probot.PullRequestOpenedContext
 - probot.PullRequestSyncContext
 - probot.PushContext
 - probot.VerifyAndReceieveProps
 - probot.CreateAdapterOptions
 - probot.ProbotAdapterProps
 - octokit.CompareCommitsProps
 - octokit.CompareCommitsResponse
 - octokit.CompareCommitsResponseCommit
 - octokit.CompareCommitsResponseData
 - octokit.CompareCommitsResponseFile
 - octokit.GetCommitProps
 - octokit.GetCommitResponse
 - octokit.GetCommitResponseData
 - octokit.GetCommitResponseFile
 - octokit.GetContentProps
 - octokit.GetContentResponse
 - octokit.GetContentResponseData
 - octokit.ListReposResponse
 - octokit.OctoKit
 - ngrok.NgrokProps
 
 
ProbotApp (preflight class) 
No description
Constructor
new(props: ProbotAppProps): ProbotApp
Properties
No properties
Methods
| Signature | Description | 
|---|---|
static inflight createGithubAppJwt(appId: str, privateKey: str): str | No description | 
onPullRequestOpened(handler: inflight (PullRequestOpenedContext): void): void | No description | 
onPullRequestReopened(handler: inflight (PullRequestOpenedContext): void): void | No description | 
inflight updateWebhookUrl(url: str): void | No description | 
utils.LowkeysMap (inflight class) 
No description
Constructor
new(): LowkeysMap
Properties
No properties
Methods
| Signature | Description | 
|---|---|
 | No description | 
simutils.Port (preflight class) 
No description
Constructor
new(): Port
Properties
| Name | Type | Description | 
|---|---|---|
port | str | No 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
| Signature | Description | 
|---|---|
inflight auth(installationId: num): OctoKit | No description | 
static inflight createProbotAdapter(options: CreateAdapterOptions): ProbotInstance | No description | 
inflight handlePullRequstClosed(handler: inflight (PullRequestClosedContext): void): void | No description | 
inflight handlePullRequstOpened(handler: inflight (PullRequestOpenedContext): void): void | No description | 
inflight handlePullRequstReopened(handler: inflight (PullRequestOpenedContext): void): void | No description | 
inflight handlePullRequstSync(handler: inflight (PullRequestSyncContext): void): void | No description | 
inflight handlePush(handler: inflight (PushContext): void): void | No description | 
inflight verifyAndReceive(props: VerifyAndReceieveProps): void | No description | 
ngrok.Ngrok (preflight class) 
No description
Constructor
new(props: NgrokProps): Ngrok
Properties
| Name | Type | Description | 
|---|---|---|
url | str | No description | 
Methods
No methods
IProbotAppCredentialsSupplier (interface) 
No description
Properties
No properties
Methods
| Signature | Description | 
|---|---|
inflight getId(): str | No description | 
inflight getPrivateKey(): str | No description | 
inflight getWebhookSecret(): str | No description | 
simutils.Process (interface) 
No description
Properties
No properties
Methods
| Signature | Description | 
|---|---|
inflight kill(): void | No description | 
probot.IProbotAuth (interface) 
No description
Properties
No properties
Methods
| Signature | Description | 
|---|---|
inflight call(instance: ProbotInstance, installationId: num): OctoKit | No description | 
probot.IProbotWebhooks (interface) 
No description
Properties
No properties
Methods
| Signature | Description | 
|---|---|
inflight on(name: str, handler: inflight (): void): void | No description | 
inflight verifyAndReceive(props: VerifyAndReceieveProps): void | No description | 
probot.IProbotAppCredentialsSupplier (interface) 
No description
Properties
No properties
Methods
| Signature | Description | 
|---|---|
inflight getId(): str | No description | 
inflight getPrivateKey(): str | No description | 
inflight getWebhookSecret(): str | No description | 
ProbotAppProps (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
credentialsSupplier | IProbotAppCredentialsSupplier | No description | 
simutils.ServiceProps (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
cwd | str? | No description | 
env |  | No description | 
probot.Context (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
id | str | No description | 
octokit | OctoKit | No description | 
probot.ProbotInstance (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
auth | IProbotAuth | No description | 
webhooks | IProbotWebhooks | No description | 
probot.PullRequestClosedContext (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
id | str | No description | 
octokit | OctoKit | No description | 
payload | PullRequestPayload | No description | 
probot.PullRequestContext (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
id | str | No description | 
octokit | OctoKit | No description | 
payload | PullRequestPayload | No description | 
probot.PullRequestOpenedContext (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
id | str | No description | 
octokit | OctoKit | No description | 
payload | PullRequestPayload | No description | 
probot.PullRequestSyncContext (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
id | str | No description | 
octokit | OctoKit | No description | 
payload | PullRequestPayload | No description | 
probot.PushContext (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
id | str | No description | 
octokit | OctoKit | No description | 
payload | PushPayload | No description | 
probot.VerifyAndReceieveProps (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
id | str | No description | 
name | str | No description | 
payload | str | No description | 
signature | str | No description | 
probot.CreateAdapterOptions (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
appId | str | No description | 
privateKey | str | No description | 
webhookSecret | str | No description | 
probot.ProbotAdapterProps (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
credentialsSupplier | IProbotAppCredentialsSupplier | No description | 
octokit.CompareCommitsProps (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
base | str | No description | 
head | str | No description | 
owner | str | No description | 
repo | str | No description | 
octokit.CompareCommitsResponse (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
data | CompareCommitsResponseData | No description | 
octokit.CompareCommitsResponseCommit (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
sha | str | No description | 
octokit.CompareCommitsResponseData (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
commits |  | No description | 
octokit.CompareCommitsResponseFile (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
filaname | str | No description | 
sha | str | No description | 
octokit.GetCommitProps (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
owner | str | No description | 
ref | str | No description | 
repo | str | No description | 
octokit.GetCommitResponse (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
data | GetCommitResponseData | No description | 
octokit.GetCommitResponseData (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
files |  | No description | 
octokit.GetCommitResponseFile (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
filename | str | No description | 
sha | str | No description | 
status | str | No description | 
octokit.GetContentProps (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
owner | str | No description | 
path | str | No description | 
ref | str? | No description | 
repo | str | No description | 
octokit.GetContentResponse (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
data | GetContentResponseData | No description | 
status | num | No description | 
octokit.GetContentResponseData (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
content | str? | No description | 
name | str | No description | 
path | str | No description | 
sha | str | No description | 
size | num | No description | 
type | str | No description | 
octokit.ListReposResponse (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
data |  | No description | 
status | num | No description | 
octokit.OctoKit (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
apps | OctoKitApps | No description | 
git | OctoKitGit | No description | 
issues | OctoKitIssues | No description | 
pulls | OctoKitPulls | No description | 
repos | OctoKitRepos | No description | 
ngrok.NgrokProps (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
domain | str? | No description | 
url | str | No description |