# Managed API for GitHub
Managed API for GitHub is an API Client for GitHub by [Adaptavist](https://www.adaptavist.com/) primarily designed for the use in [ScriptRunner Connect](https://scriptrunnerconnect.com). You can read more about Managed APIs [here](https://docs.adaptavist.com/src/managed-apis).

This is a runtime agnostic version of the Managed API (with `core` suffix) that makes it easy to port it to any runtime you may want to use this Managed API on.

# Platform specific ports
- [ScriptRunner Connect](https://www.npmjs.com/package/@managed-api/github-sr-connect)

# Supported API calls
- [fetch](https://docs.adaptavist.com/src/managed-apis/managed-api-abstractions)
- Branch
    - [getBranch](https://docs.github.com/en/rest/reference/branches#get-a-branch)
    - [getBranches](https://docs.github.com/en/rest/reference/branches#list-branches)
    - [mergeBranch](https://docs.github.com/en/rest/reference/branches#merge-a-branch)
    - [renameBranch](https://docs.github.com/en/rest/reference/branches#rename-a-branch)
    - [syncForkBranch](https://docs.github.com/en/rest/reference/branches#sync-a-fork-branch-with-the-upstream-repository)
    - Protection
        - [deleteProtection](https://docs.github.com/en/rest/reference/branches#delete-branch-protection)
        - [getProtection](https://docs.github.com/en/rest/reference/branches#get-branch-protection)
        - [updateProtection](https://docs.github.com/en/rest/reference/branches#update-branch-protection)
        - Admin
            - [deleteProtection](https://docs.github.com/en/rest/reference/branches#delete-admin-branch-protection)
            - [getProtection](https://docs.github.com/en/rest/reference/branches#get-admin-branch-protection)
            - [setProtection](https://docs.github.com/en/rest/reference/branches#set-admin-branch-protection)
        - Commit
            - Signature
                - [createProtection](https://docs.github.com/en/rest/reference/branches#create-commit-signature-protection)
                - [deleteProtection](https://docs.github.com/en/rest/reference/branches#delete-commit-signature-protection)
                - [getProtection](https://docs.github.com/en/rest/reference/branches#get-commit-signature-protection)
        - Pull
            - Review
                - [getProtection](https://docs.github.com/en/rest/reference/branches#get-pull-request-review-protection)
                - [updateProtection](https://docs.github.com/en/rest/reference/branches#update-pull-request-review-protection)
        - Status
            - Check
                - [addContexts](https://docs.github.com/en/rest/reference/branches#add-status-check-contexts)
                - [getContexts](https://docs.github.com/en/rest/reference/branches#get-all-status-check-contexts)
                - [getProtection](https://docs.github.com/en/rest/reference/branches#get-status-checks-protection)
                - [removeContexts](https://docs.github.com/en/rest/reference/branches#remove-status-check-contexts)
                - [removeProtection](https://docs.github.com/en/rest/reference/branches#remove-status-check-protection)
                - [setContexts](https://docs.github.com/en/rest/reference/branches#set-status-check-contexts)
                - [updateProtection](https://docs.github.com/en/rest/reference/branches#update-status-check-protection)
- Commit
    - [compareCommits](https://docs.github.com/en/rest/reference/commits#compare-two-commits)
    - [getBranchesForHead](https://docs.github.com/en/rest/reference/commits#list-branches-for-head-commit)
    - [getCommit](https://docs.github.com/en/rest/reference/commits#get-a-commit)
    - [getCommits](https://docs.github.com/en/rest/reference/commits#list-commits)
    - [getPullRequestsForCommit](https://docs.github.com/en/rest/reference/commits#list-pull-requests-associated-with-a-commit)
    - Comment
        - [createComment](https://docs.github.com/en/rest/reference/commits#create-a-commit-comment)
        - [deleteComment](https://docs.github.com/en/rest/reference/commits#delete-a-commit-comment)
        - [getComment](https://docs.github.com/en/rest/reference/commits#get-a-commit-comment)
        - [getComments](https://docs.github.com/en/rest/reference/commits#list-commit-comments)
        - [getCommentsForRepository](https://docs.github.com/en/rest/reference/commits#list-commit-comments-for-a-repository)
        - [updateComment](https://docs.github.com/en/rest/reference/commits#update-a-commit-comment)
    - Status
        - [createStatus](https://docs.github.com/en/rest/reference/commits#create-a-commit-status)
        - [getCombinedStatusForReference](https://docs.github.com/en/rest/reference/commits#get-the-combined-status-for-a-specific-reference)
        - [getStatusesForReference](https://docs.github.com/en/rest/reference/commits#list-commit-statuses-for-a-reference)
- Deployment
    - [createDeployment](https://docs.github.com/en/rest/reference/deployments#create-a-deployment)
    - [deleteDeployment](https://docs.github.com/en/rest/reference/deployments#delete-a-deployment)
    - [getDeployment](https://docs.github.com/en/rest/reference/deployments#get-a-deployment)
    - [getDeployments](https://docs.github.com/en/rest/reference/deployments#list-deployments)
    - Environment
        - [createOrUpdateEnvironment](https://docs.github.com/en/rest/reference/deployments#create-or-update-an-environment)
        - [deleteEnvironment](https://docs.github.com/en/rest/reference/deployments#delete-an-environment)
        - [getEnvironment](https://docs.github.com/en/rest/reference/deployments#get-an-environment)
        - [getEnvironments](https://docs.github.com/en/rest/reference/deployments#get-all-environments)
    - Key
        - [createKey](https://docs.github.com/en/rest/reference/deploy_keys#create-a-deploy-key)
        - [deleteKey](https://docs.github.com/en/rest/reference/deploy_keys#delete-a-deploy-key)
        - [getKey](https://docs.github.com/en/rest/reference/deploy_keys#get-a-deploy-key)
        - [getKeys](https://docs.github.com/en/rest/reference/deploy_keys#list-deploy-keys)
    - Status
        - [createStatus](https://docs.github.com/en/rest/reference/deployments#create-a-deployment-status)
        - [getStatus](https://docs.github.com/en/rest/reference/deployments#get-a-deployment-status)
        - [getStatuses](https://docs.github.com/en/rest/reference/deployments#list-deployment-statuses)
- Git
    - Blob
        - [createBlob](https://docs.github.com/en/rest/reference/git#create-a-blob)
        - [getBlob](https://docs.github.com/en/rest/reference/git#get-a-blob)
    - Commit
        - [createCommit](https://docs.github.com/en/rest/reference/git#create-a-commit)
        - [getCommit](https://docs.github.com/en/rest/reference/git#get-a-commit)
    - Reference
        - [createReference](https://docs.github.com/en/rest/reference/git#create-a-reference)
        - [deleteReference](https://docs.github.com/en/rest/reference/git#delete-a-reference)
        - [getMatchingReferences](https://docs.github.com/en/rest/reference/git#list-matching-references)
        - [getReference](https://docs.github.com/en/rest/reference/git#get-a-reference)
        - [updateReference](https://docs.github.com/en/rest/reference/git#update-a-reference)
    - Tag
        - [createTag](https://docs.github.com/en/rest/reference/git#create-a-tag-object)
        - [getTag](https://docs.github.com/en/rest/reference/git#get-a-tag)
    - Tree
        - [createTree](https://docs.github.com/en/rest/reference/git#create-a-tree)
        - [getTree](https://docs.github.com/en/rest/reference/git#get-a-tree)
- Issue
    - [createIssue](https://docs.github.com/en/rest/reference/issues#create-an-issue)
    - [getIssue](https://docs.github.com/en/rest/reference/issues#get-an-issue)
    - [getIssuesForAuthenticatedUser](https://docs.github.com/en/rest/reference/issues#list-user-account-issues-assigned-to-the-authenticated-user)
    - [getOrganizationIssuesForAuthenticatedUser](https://docs.github.com/en/rest/reference/issues#list-organization-issues-assigned-to-the-authenticated-user)
    - [getRepositoryIssues](https://docs.github.com/en/rest/reference/issues#list-repository-issues)
    - [lockIssue](https://docs.github.com/en/rest/reference/issues#lock-an-issue)
    - [unlockIssue](https://docs.github.com/en/rest/reference/issues#unlock-an-issue)
    - [updateIssue](https://docs.github.com/en/rest/reference/issues#update-an-issue)
    - Assignee
        - [addAssignees](https://docs.github.com/en/rest/reference/issues#add-assignees-to-an-issue)
        - [canUserBeAssigned](https://docs.github.com/en/rest/reference/issues#check-if-a-user-can-be-assigned)
        - [getAssignees](https://docs.github.com/en/rest/reference/issues#list-assignees)
        - [removeAssignees](https://docs.github.com/en/rest/reference/issues#remove-assignees-from-an-issue)
    - Comment
        - [createComment](https://docs.github.com/en/rest/reference/issues#create-an-issue-comment)
        - [deleteComment](https://docs.github.com/en/rest/reference/issues#delete-an-issue-comment)
        - [getComment](https://docs.github.com/en/rest/reference/issues#get-an-issue-comment)
        - [getComments](https://docs.github.com/en/rest/reference/issues#list-issue-comments)
        - [getCommentsForRepository](https://docs.github.com/en/rest/reference/issues#list-issue-comments-for-a-repository)
        - [updateComment](https://docs.github.com/en/rest/reference/issues#update-an-issue-comment)
    - Event
        - [getEvent](https://docs.github.com/en/rest/reference/issues#get-an-issue-event)
        - [getEvents](https://docs.github.com/en/rest/reference/issues#list-issue-events)
        - [getEventsForRepository](https://docs.github.com/en/rest/reference/issues#list-issue-events-for-a-repository)
    - Label
        - [addLabelsToIssue](https://docs.github.com/en/rest/reference/issues#add-labels-to-an-issue)
        - [createLabel](https://docs.github.com/en/rest/reference/issues#create-a-label)
        - [deleteLabel](https://docs.github.com/en/rest/reference/issues#delete-a-label)
        - [getLabel](https://docs.github.com/en/rest/reference/issues#get-a-label)
        - [getLabels](https://docs.github.com/en/rest/reference/issues#list-labels-for-an-issue)
        - [getLabelsForIssuesInMilestone](https://docs.github.com/en/rest/reference/issues#list-labels-for-issues-in-a-milestone)
        - [getLabelsForRepository](https://docs.github.com/en/rest/reference/issues#list-labels-for-a-repository)
        - [removeLabelFromIssue](https://docs.github.com/en/rest/reference/issues#remove-a-label-from-an-issue)
        - [removeLabelsFromIssue](https://docs.github.com/en/rest/reference/issues#remove-all-labels-from-an-issue)
        - [setLabelsToIssue](https://docs.github.com/en/rest/reference/issues#set-labels-for-an-issue)
        - [updateLabel](https://docs.github.com/en/rest/reference/issues#update-a-label)
    - Milestone
        - [createMilestone](https://docs.github.com/en/rest/reference/issues#create-a-milestone)
        - [deleteMilestone](https://docs.github.com/en/rest/reference/issues#delete-a-milestone)
        - [getMilestone](https://docs.github.com/en/rest/reference/issues#get-a-milestone)
        - [getMilestones](https://docs.github.com/en/rest/reference/issues#list-milestones)
        - [updateMilestone](https://docs.github.com/en/rest/reference/issues#update-a-milestone)
- Organization
    - [getAuditLog](https://docs.github.com/en/rest/reference/orgs#get-the-audit-log-for-an-organization)
    - [getInstallations](https://docs.github.com/en/rest/reference/orgs#list-app-installations-for-an-organization)
    - [getOrganization](https://docs.github.com/en/rest/reference/orgs#get-an-organization)
    - [getOrganizations](https://docs.github.com/en/rest/reference/orgs#list-organizations)
    - [getOrganizationsForAuthenticatedUser](https://docs.github.com/en/rest/reference/orgs#list-organizations-for-the-authenticated-user)
    - [getOrganizationsForUser](https://docs.github.com/en/rest/reference/orgs#list-organizations-for-a-user)
    - [updateOrganization](https://docs.github.com/en/rest/reference/orgs#update-an-organization)
    - Member
        - [checkMembershipForUser](https://docs.github.com/en/rest/reference/orgs#check-organization-membership-for-a-user)
        - [getMembers](https://docs.github.com/en/rest/reference/orgs#list-organization-members)
        - [getMembershipForAuthenticatedUser](https://docs.github.com/en/rest/reference/orgs#get-an-organization-membership-for-the-authenticated-user)
        - [getMembershipForUser](https://docs.github.com/en/rest/reference/orgs#get-organization-membership-for-a-user)
        - [getMembershipsForAuthenticatedUser](https://docs.github.com/en/rest/reference/orgs#list-organization-memberships-for-the-authenticated-user)
        - [removeMember](https://docs.github.com/en/rest/reference/orgs#remove-an-organization-member)
        - [removeMembershipForUser](https://docs.github.com/en/rest/reference/orgs#remove-organization-membership-for-a-user)
        - [setMembershipForUser](https://docs.github.com/en/rest/reference/orgs#set-organization-membership-for-a-user)
        - [updateMembershipForAuthenticatedUser](https://docs.github.com/en/rest/reference/orgs#update-an-organization-membership-for-the-authenticated-user)
- Project
    - [createOrganizationProject](https://docs.github.com/en/rest/reference/projects#create-an-organization-project)
    - [createRepositoryProject](https://docs.github.com/en/rest/reference/projects#create-a-repository-project)
    - [createUserProject](https://docs.github.com/en/rest/reference/projects#create-a-user-project)
    - [deleteProject](https://docs.github.com/en/rest/reference/projects#delete-a-project)
    - [getOrganizationProjects](https://docs.github.com/en/rest/reference/projects#list-organization-projects)
    - [getProject](https://docs.github.com/en/rest/reference/projects#get-a-project)
    - [getRepositoryProjects](https://docs.github.com/en/rest/reference/projects#list-repository-projects)
    - [getUserProjects](https://docs.github.com/en/rest/reference/projects#list-user-projects)
    - [updateProject](https://docs.github.com/en/rest/reference/projects#update-a-project)
- Pull
    - [createPullRequest](https://docs.github.com/en/rest/reference/pulls#create-a-pull-request)
    - [getCommits](https://docs.github.com/en/rest/reference/pulls#list-commits-on-a-pull-request)
    - [getFiles](https://docs.github.com/en/rest/reference/pulls#list-pull-requests-files)
    - [getPullRequest](https://docs.github.com/en/rest/reference/pulls#get-a-pull-request)
    - [getPullRequests](https://docs.github.com/en/rest/reference/pulls#list-pull-requests)
    - [isMerged](https://docs.github.com/en/rest/reference/pulls#check-if-a-pull-request-has-been-merged)
    - [mergePullRequest](https://docs.github.com/en/rest/reference/pulls#merge-a-pull-request)
    - [updatePullRequest](https://docs.github.com/en/rest/reference/pulls#update-a-pull-request)
    - [updatePullRequestBranch](https://docs.github.com/en/rest/reference/pulls#update-a-pull-request-branch)
    - Review
        - [createReview](https://docs.github.com/en/rest/reference/pulls#create-a-review-for-a-pull-request)
        - [deletePendingReview](https://docs.github.com/en/rest/reference/pulls#delete-a-pending-review-for-a-pull-request)
        - [dismissReview](https://docs.github.com/en/rest/reference/pulls#dismiss-a-review-for-a-pull-request)
        - [getComments](https://docs.github.com/en/rest/reference/pulls#list-comments-for-a-pull-request-review)
        - [getReview](https://docs.github.com/en/rest/reference/pulls#get-a-review-for-a-pull-request)
        - [getReviews](https://docs.github.com/en/rest/reference/pulls#reviews)
        - [submitReview](https://docs.github.com/en/rest/reference/pulls#submit-a-review-for-a-pull-request)
        - [updateReview](https://docs.github.com/en/rest/reference/pulls#update-a-review-for-a-pull-request)
        - Comment
            - [createComment](https://docs.github.com/en/rest/reference/pulls#create-a-review-comment-for-a-pull-request)
            - [createReply](https://docs.github.com/en/rest/reference/pulls#create-a-reply-for-a-review-comment)
            - [deleteComment](https://docs.github.com/en/rest/reference/pulls#delete-a-review-comment-for-a-pull-request)
            - [getComment](https://docs.github.com/en/rest/reference/pulls#get-a-review-comment-for-a-pull-request)
            - [getComments](https://docs.github.com/en/rest/reference/pulls#list-review-comments-on-a-pull-request)
            - [getCommentsInRepository](https://docs.github.com/en/rest/reference/pulls#list-review-comments-in-a-repository)
            - [updateComment](https://docs.github.com/en/rest/reference/pulls#update-a-review-comment-for-a-pull-request)
        - Request
            - [getReviewers](https://docs.github.com/en/rest/reference/pulls#list-requested-reviewers-for-a-pull-request)
            - [removeReviewers](https://docs.github.com/en/rest/reference/pulls#remove-requested-reviewers-from-a-pull-request)
            - [requestReviewers](https://docs.github.com/en/rest/reference/pulls#request-reviewers-for-a-pull-request)
- Release
    - [createRelease](https://docs.github.com/en/rest/reference/releases#create-a-release)
    - [deleteRelease](https://docs.github.com/en/rest/reference/releases#delete-a-release)
    - [generateReleaseNotes](https://docs.github.com/en/rest/reference/releases#generate-release-notes-content-for-a-release)
    - [getLatestRelease](https://docs.github.com/en/rest/reference/releases#get-the-latest-release)
    - [getRelease](https://docs.github.com/en/rest/reference/releases#get-a-release)
    - [getReleaseByTagName](https://docs.github.com/en/rest/reference/releases#get-a-release-by-tag-name)
    - [getReleases](https://docs.github.com/en/rest/reference/releases#list-releases)
    - [updateRelease](https://docs.github.com/en/rest/reference/releases#update-a-release)
- Repository
    - [createDispatchEvent](https://docs.github.com/en/rest/reference/repos#create-a-repository-dispatch-event)
    - [createOrganizationRepository](https://docs.github.com/en/rest/reference/repos#create-an-organization-repository)
    - [createRepositoryForAuthenticatedUser](https://docs.github.com/en/rest/reference/repos#create-a-repository-for-the-authenticated-user)
    - [createRepositoryFromTemplate](https://docs.github.com/en/rest/reference/repos#create-a-repository-using-a-template)
    - [deleteRepository](https://docs.github.com/rest/reference/repos#delete-a-repository)
    - [disableAutomatedSecurityFixes](https://docs.github.com/en/rest/reference/repos#disable-automated-security-fixes)
    - [disableVulnerabilityAlerts](https://docs.github.com/en/rest/reference/repos#disable-vulnerability-alerts)
    - [enableAutomatedSecurityFixes](https://docs.github.com/en/rest/reference/repos#enable-automated-security-fixes)
    - [enableVulnerabilityAlerts](https://docs.github.com/en/rest/reference/repos#enable-vulnerability-alerts)
    - [getCodeOwnersErrors](https://docs.github.com/en/rest/reference/repos#list-codeowners-errors)
    - [getContributors](https://docs.github.com/en/rest/reference/repos#list-repository-contributors)
    - [getLanguages](https://docs.github.com/en/rest/reference/repos#list-repository-languages)
    - [getOrganizationRepositories](https://docs.github.com/en/rest/reference/repos#list-organization-repositories)
    - [getPublicRepositories](https://docs.github.com/en/rest/reference/repos#list-public-repositories)
    - [getRepositoriesForAuthenticatedUser](https://docs.github.com/en/rest/reference/repos#list-repositories-for-the-authenticated-user)
    - [getRepositoriesForUser](https://docs.github.com/en/rest/reference/repos#list-repositories-for-a-user)
    - [getRepository](https://docs.github.com/en/rest/reference/repos#get-a-repository)
    - [getTags](https://docs.github.com/en/rest/reference/repos#list-repository-tags)
    - [getTeams](https://docs.github.com/en/rest/reference/repos#list-repository-teams)
    - [getTopics](https://docs.github.com/en/rest/reference/repos#get-all-repository-topics)
    - [isVulnerabilityAlertsEnabled](https://docs.github.com/en/rest/reference/repos#check-if-vulnerability-alerts-are-enabled-for-a-repository)
    - [replaceTopics](https://docs.github.com/en/rest/reference/repos#replace-all-repository-topics)
    - [transferRepository](https://docs.github.com/en/rest/reference/repos#transfer-a-repository)
    - [updateRepository](https://docs.github.com/en/rest/reference/repos#update-a-repository)
    - Collaborator
        - [addCollaborator](https://docs.github.com/en/rest/reference/collaborators#add-a-repository-collaborator)
        - [getCollaborators](https://docs.github.com/en/rest/reference/collaborators#list-repository-collaborators)
        - [getPermissionsForUser](https://docs.github.com/en/rest/reference/collaborators#get-repository-permissions-for-a-user)
        - [isUserCollaborator](https://docs.github.com/en/rest/reference/collaborators#check-if-a-user-is-a-repository-collaborator)
        - [removeCollaborator](https://docs.github.com/en/rest/reference/collaborators#remove-a-repository-collaborator)
        - Invitation
            - [acceptInvitation](https://docs.github.com/en/rest/reference/collaborators#accept-a-repository-invitation)
            - [declineInvitation](https://docs.github.com/en/rest/reference/collaborators#decline-a-repository-invitation)
            - [deleteInvitation](https://docs.github.com/en/rest/reference/collaborators#delete-a-repository-invitation)
            - [getInvitations](https://docs.github.com/en/rest/reference/collaborators#list-repository-invitations)
            - [getInvitationsForAuthenticatedUser](https://docs.github.com/en/rest/reference/collaborators#list-repository-invitations-for-the-authenticated-user)
            - [updateInvitation](https://docs.github.com/en/rest/reference/collaborators#update-a-repository-invitation)
    - Content
        - [createOrUpdateFileContents](https://docs.github.com/en/rest/reference/repos#create-or-update-file-contents)
        - [deleteFile](https://docs.github.com/en/rest/reference/repos#delete-a-file)
        - [getContent](https://docs.github.com/en/rest/reference/repos#get-repository-content)
        - [getRepositoryReadme](https://docs.github.com/en/rest/reference/repos#get-a-repository-readme)
        - [getRepositoryReadmeForDirectory](https://docs.github.com/en/rest/reference/repos#get-a-repository-readme-for-a-directory)
    - Fork
        - [createFork](https://docs.github.com/en/rest/reference/repos#create-a-fork)
        - [getForks](https://docs.github.com/en/rest/reference/repos#list-forks)
- Search
    - [searchCode](https://docs.github.com/en/rest/reference/search#search-code)
    - [searchCommits](https://docs.github.com/en/rest/reference/search#search-commits)
    - [searchIssuesAndPullRequests](https://docs.github.com/en/rest/reference/search#search-issues-and-pull-requests)
    - [searchLabels](https://docs.github.com/en/rest/reference/search#search-labels)
    - [searchRepositories](https://docs.github.com/en/rest/reference/search#search-repositories)
    - [searchTopics](https://docs.github.com/en/rest/reference/search#search-topics)
    - [searchUsers](https://docs.github.com/en/rest/reference/search#search-users)
- User
    - [getAuthenticatedUser](https://docs.github.com/en/rest/reference/users#get-the-authenticated-user)
    - [getUser](https://docs.github.com/en/rest/reference/users#get-a-user)
    - [getUserContext](https://docs.github.com/en/rest/reference/users#get-contextual-information-for-a-user)
    - [getUsers](https://docs.github.com/en/rest/reference/users#list-users)
    - [updateAuthenticatedUser](https://docs.github.com/en/rest/reference/users#update-the-authenticated-user)
    - Block
        - [blockUser](https://docs.github.com/en/rest/reference/users#block-a-user)
        - [checkIfUserIsBlockedByAuthenticatedUser](https://docs.github.com/en/rest/reference/users#check-if-a-user-is-blocked-by-the-authenticated-user)
        - [getBlockedUsersByAuthenticatedUser](https://docs.github.com/en/rest/reference/users#list-users-blocked-by-the-authenticated-user)
        - [unblockUser](https://docs.github.com/en/rest/reference/users#unblock-a-user)


# Porting to other runtimes
While the primary reason for creating Managed APIs was to use them in [ScriptRunner Connect](https://scriptrunnerconnect.com) runtime, then you can easily port them to any runtime of your choosing.

You can do so by extending the `*Core` Managed API class where you'll be asked to provide implementation for `getPlatformImplementation` function. In this implementation you have to specify how to perform buffer encoding/decoding operations and how to perform HTTP calls:
```typescript
{
    buffer: {
        encode(input: string): ArrayBuffer;
        decode(input: ArrayBuffer): string;
    },
    performHttpCall(request: Request): Promise<Response>
}
```

Here is an example how to create a [Node](https://nodejs.org/en/) port of the Managed API:
```typescript
import { GitHubApiCore } from "@managed-api/github-core";
import { PlatformImplementation, Request, Response, Headers } from "@managed-api/commons-core";
import fetch from "node-fetch";

export class GitHubApi extends GitHubApiCore {
    constructor(private baseUrl: string, private authToken: string) {
        super();
    }

    protected getPlatformImplementation(): PlatformImplementation {
        return {
            buffer: {
                encode: (input) => Buffer.from(input, 'utf-8'),
                decode: (input) => Buffer.from(input).toString('utf-8')
            },
            performHttpCall: (request) => this.performHttpCall(request)
        };
    }
    
    private async performHttpCall(request: Request): Promise<Response> {
        const requestUrl = `${this.baseUrl}${request.url}`; // Substitute base URL
        request.headers.set('Authorization', `Basic ${this.authToken}`); // Substitute auth token
        const response = await fetch(requestUrl, {
            method: request.method,
            headers: request.headers as any,
            body: request.method.toLowerCase() !== 'get' ? Buffer.from((await request.arrayBuffer()) ?? new ArrayBuffer(0)) : undefined
        });

        const apiHeaders = new Headers();
        response.headers.forEach((value, key) => apiHeaders.append(key, value));

        const body = await response.arrayBuffer();

        return super.buildResponse(response.url, response.status, response.statusText, apiHeaders, body);
    }
}
```

Please note that the authentication handling details may not be accurate and serve as an example. If you wish to use these Managed APIs without having to concern yourself how to deal with and secure authentication details when working with APIs, then feel free to evaluate [ScriptRunner Connect](https://scriptrunnerconnect.com) platform.

# Contact
At this time Managed APIs are unlicensed and close sourced, but feel free to drop an email to [eknoll@adaptavist.com](mailto://eknoll@adaptavist.com) for ideas, suggestions and improvements.

 # Changelog
# 2.1.0

- Removed non-empty body from HEAD requests.

# 2.0.0

- # Breaking change: URL and query string parameters are now URL encoded, meaning if you encoded them explicitly before you have to remove your own encoding, otherwise they will get double encoded.

# 0.11.0

- * Updated OpenApi Specification.

- * Fields `sort` and `order` are deprecated in `Search.searchCode`.

# 0.9.0

# Added support for the following Organization.Member methods:

* [List organization members](https://docs.github.com/en/rest/reference/orgs#list-organization-members) that can be used as `Organization.Member.getMembers` or `All.getOrganizationMembers`.

* [Check organization membership for a user](https://docs.github.com/en/rest/reference/orgs#check-organization-membership-for-a-user) that can be used as `Organization.Member.checkMembershipForUser` or `All.checkOrganizationMembershipForUser`.

* [Remove an organization member](https://docs.github.com/en/rest/reference/orgs#remove-an-organization-member) that can be used as `Organization.Member.removeMember` or `All.removeOrganizationMember`.

* [Get organization membership for a user](https://docs.github.com/en/rest/reference/orgs#get-organization-membership-for-a-user) that can be used as `Organization.Member.getMembershipForUser` or `All.getOrganizationMembershipForUser`.

* [Set organization membership for a user](https://docs.github.com/en/rest/reference/orgs#set-organization-membership-for-a-user) that can be used as `Organization.Member.setMembershipForUser` or `All.setOrganizationMembershipForUser`.

* [Remove organization membership for a user](https://docs.github.com/en/rest/reference/orgs#remove-organization-membership-for-a-user) that can be used as `Organization.Member.removeMembershipForUser` or `All.removeOrganzationMembershipForUser`.

* [List organization memberships for the authenticated user](https://docs.github.com/en/rest/reference/orgs#list-organization-memberships-for-the-authenticated-user) that can be used as `Organization.Member.getMembershipsForAuthenticatedUser` or `All.getOrganizationMembershipsForAuthenticatedUser`.

* [Get an organization membership for the authenticated user](https://docs.github.com/en/rest/reference/orgs#get-an-organization-membership-for-the-authenticated-user) that can be used as `Organization.Member.getMembershipForAuthenticatedUser` or `All.getOrganizationMembershipForAuthenticatedUser`.

* [Update an organization membership for the authenticated user](https://docs.github.com/en/rest/reference/orgs#update-an-organization-membership-for-the-authenticated-user) that can be used as `Organization.Member.updateMembershipForAuthenticatedUser` or `All.updateOrganizationMembershipForAuthenticatedUser`.

# Added support for the following Organization methods:

* [List organizations](https://docs.github.com/en/rest/reference/orgs#list-organizations) that can be used as `Organization.getOrganizations` or `All.getOrganizations`.

* [Get an organization](https://docs.github.com/en/rest/reference/orgs#get-an-organization) that can be used as `Organization.getOrganization` or `All.getOrganization`.

* [Update an organization](https://docs.github.com/en/rest/reference/orgs#update-an-organization) that can be used as `Organization.updateOrganization` or `All.updateOrganization`.

* [Get the audit log for an organization](https://docs.github.com/en/rest/reference/orgs#get-the-audit-log-for-an-organization) that can be used as `Organization.getAuditLog` or `All.getAuditLogForOrganization`.

* [List app installations for an organization](https://docs.github.com/en/rest/reference/orgs#list-app-installations-for-an-organization) that can be used as `Organization.getInstallations` or `All.getInstallationsForOrganization`.

* [List organizations for the authenticated user](https://docs.github.com/en/rest/reference/orgs#list-organizations-for-the-authenticated-user) that can be used as `Organization.getOrganizationsForAuthenticatedUser` or `All.getOrganizationsForAuthenticatedUser`.

* [List organizations for a user](https://docs.github.com/en/rest/reference/orgs#list-organizations-for-a-user) that can be used as `Organization.getOrganizationsForUser` or `All.getOrganizationsForUser`.

# Added support for the following Search methods:

* [Search code](https://docs.github.com/en/rest/reference/search#search-code) that can be used as `Search.searchCode` or `All.searchCode`.

* [Search commits](https://docs.github.com/en/rest/reference/search#search-commits) that can be used as `Search.searchCommits` or `All.searchCommits`.

* [Search issues and pull requests](https://docs.github.com/en/rest/reference/search#search-issues-and-pull-requests) that can be used as `Search.searchIssuesAndPullRequests` or `All.searchIssuesAndPullRequests`.

* [Search labels](https://docs.github.com/en/rest/reference/search#search-labels) that can be used as `Search.searchLabels` or `All.searchLabels`.

* [Search repositories](https://docs.github.com/en/rest/reference/search#search-repositories) that can be used as `Search.searchRepositories` or `All.searchRepositories`.

* [Search topics](https://docs.github.com/en/rest/reference/search#search-topics) that can be used as `Search.searchTopics` or `All.searchTopics`.

* [Search users](https://docs.github.com/en/rest/reference/search#search-users) that can be used as `Search.searchUsers` or `All.searchUsers`.

# Added support for the following Release methods:

* [List releases](https://docs.github.com/en/rest/reference/releases#list-releases) that can be used as `Release.getReleases` or `All.getReleases`.

* [Create a release](https://docs.github.com/en/rest/reference/releases#create-a-release) that can be used as `Release.createRelease` or `All.createRelease`.

* [Generate release notes content for a release](https://docs.github.com/en/rest/reference/releases#generate-release-notes-content-for-a-release) that can be used as `Release.generateReleaseNotes` or `All.generateReleaseNotes`.

* [Get the latest release](https://docs.github.com/en/rest/reference/releases#get-the-latest-release) that can be used as `Release.getLatestRelease` or `All.getLatestRelease`.

* [Get a release by tag name](https://docs.github.com/en/rest/reference/releases#get-a-release-by-tag-name) that can be used as `Release.getReleaseByTagName` or `All.getReleaseByTagName`.

* [Get a release](https://docs.github.com/en/rest/reference/releases#get-a-release) that can be used as `Release.getRelease` or `All.getRelease`.

* [Update a release](https://docs.github.com/en/rest/reference/releases#update-a-release) that can be used as `Release.updateRelease` or `All.updateRelease`.

* [Delete a release](https://docs.github.com/en/rest/reference/releases#delete-a-release) that can be used as `Release.deleteRelease` or `All.deleteRelease`.

# Added support for the following User.Block methods:

* [List users blocked by the authenticated user](https://docs.github.com/en/rest/reference/users#list-users-blocked-by-the-authenticated-user) that can be used as `User.Block.getBlockedUsersByAuthenticatedUser` or `All.getBlockedUsersByAuthenticatedUser`.

* [Check if a user is blocked by the authenticated user](https://docs.github.com/en/rest/reference/users#check-if-a-user-is-blocked-by-the-authenticated-user) that can be used as `User.Block.checkIfUserIsBlockedByAuthenticatedUser` or `All.checkIfUserIsBlockedByAuthenticatedUser`.

* [Block a user](https://docs.github.com/en/rest/reference/users#block-a-user) that can be used as `User.Block.blockUser` or `All.blockUser`.

* [Unblock a user](https://docs.github.com/en/rest/reference/users#unblock-a-user) that can be used as `User.Block.unblockUser` or `All.unblockUser`.

# Added support for the following User methods:

* [Get the authenticated user](https://docs.github.com/en/rest/reference/users#get-the-authenticated-user) that can be used as `User.getAuthenticatedUser` or `All.getAuthenticatedUser`.

* [Update the authenticated user](https://docs.github.com/en/rest/reference/users#update-the-authenticated-user) that can be used as `User.updateAuthenticatedUser` or `All.updateAuthenticatedUser`.

* [List users](https://docs.github.com/en/rest/reference/users#list-users) that can be used as `User.getUsers` or `All.getUsers`.

* [Get a user](https://docs.github.com/en/rest/reference/users#get-a-user) that can be used as `User.getUser` or `All.getUser`.

* [Get contextual information for a user](https://docs.github.com/en/rest/reference/users#get-contextual-information-for-a-user) that can be used as `User.getUserContext` or `All.getUserContext`.

# Added support for the following Repository.Content methods:

* [Delete a file](https://docs.github.com/en/rest/reference/repos#delete-a-file) that can be used as `Repository.Content.deleteFile` or `All.deleteFile`.

* [Get a repository README](https://docs.github.com/en/rest/reference/repos#get-a-repository-readme) that can be used as `Repository.Content.getRepositoryReadme` or `All.getRepositoryReadme`.

* [Get a repository README for a directory](https://docs.github.com/en/rest/reference/repos#get-a-repository-readme-for-a-directory) that can be used as `Repository.Content.getRepositoryReadmeForDirectory` or `All.getRepositoryReadmeForDirectory`.

# Added support for the following Branch.Protection methods:

* [Get branch protection](https://docs.github.com/en/rest/reference/branches#get-branch-protection) that can be used as `Branch.Protection.getProtection` or `All.getBranchProtection`.

* [Update branch protection](https://docs.github.com/en/rest/reference/branches#update-branch-protection) that can be used as `Branch.Protection.updateProtection` or `All.updateBranchProtection`.

* [Delete branch protection](https://docs.github.com/en/rest/reference/branches#delete-branch-protection) that can be used as `Branch.Protection.deleteProtection` or `All.deleteBranchProtection`.

# Added support for the following Branch.Protection.Admin methods:

* [Get admin branch protection](https://docs.github.com/en/rest/reference/branches#get-admin-branch-protection) that can be used as `Branch.Protection.Admin.getProtection` or `All.getAdminBranchProtection`.

* [Set admin branch protection](https://docs.github.com/en/rest/reference/branches#set-admin-branch-protection) that can be used as `Branch.Protection.Admin.setProtection` or `All.setAdminBranchProtection`.

* [Delete admin branch protection](https://docs.github.com/en/rest/reference/branches#delete-admin-branch-protection) that can be used as `Branch.Protection.Admin.deleteProtection` or `All.deleteAdminBranchProtection`.

# Added support for the following Branch.Protection.Pull.Review methods:

* [Get pull request review protection](https://docs.github.com/en/rest/reference/branches#get-pull-request-review-protection) that can be used as `Branch.Protection.Pull.Review.getProtection` or `All.getBranchPullRequestReviewProtection`.

* [Update pull request review protection](https://docs.github.com/en/rest/reference/branches#update-pull-request-review-protection) that can be used as `Branch.Protection.Pull.Review.updateProtection` or `All.updateBranchPullRequestReviewProtection`.

# Added support for the following Branch.Protection.Commit.Signature methods:

* [Get commit signature protection](https://docs.github.com/en/rest/reference/branches#get-commit-signature-protection) that can be used as `Branch.Protection.Commit.Signature.getProtection` or `All.getBranchCommitSignatureProtection`.

* [Create commit signature protection](https://docs.github.com/en/rest/reference/branches#create-commit-signature-protection) that can be used as `Branch.Protection.Commit.Signature.createProtection` or `All.createBranchCommitSignatureProtection`.

* [Delete commit signature protection](https://docs.github.com/en/rest/reference/branches#delete-commit-signature-protection) that can be used as `Branch.Protection.Commit.Signature.deleteProtection` or `All.deleteBranchCommitSignatureProtection`.

# Added support for the following Branch.Protection.Status.Check methods:

* [Get status checks protection](https://docs.github.com/en/rest/reference/branches#get-status-checks-protection) that can be used as `Branch.Protection.Status.Check.getProtection` or `All.getBranchStatusCheckProtection`.

* [Update status checks protection](https://docs.github.com/en/rest/reference/branches#update-status-check-protection) that can be used as `Branch.Protection.Status.Check.updateProtection` or `All.updateBranchStatusCheckProtection`.

* [Remove status checks protection](https://docs.github.com/en/rest/reference/branches#remove-status-check-protection) that can be used as `Branch.Protection.Status.Check.removeProtection` or `All.removeBranchStatusCheckProtection`.

* [Get all status check contexts](https://docs.github.com/en/rest/reference/branches#get-all-status-check-contexts) that can be used as `Branch.Protection.Status.Check.getContexts` or `All.getBranchStatusCheckContexts`.

* [Add status check contexts](https://docs.github.com/en/rest/reference/branches#add-status-check-contexts) that can be used as `Branch.Protection.Status.Check.addContexts` or `All.addBranchStatusCheckContexts`.

* [Set status check contexts](https://docs.github.com/en/rest/reference/branches#set-status-check-contexts) that can be used as `Branch.Protection.Status.Check.setContexts` or `All.setBranchStatusCheckContexts`.

# Added support for the following Project methods:

* [List organization projects](https://docs.github.com/en/rest/reference/projects#list-organization-projects) that can be used as `Project.getOrganizationProjects` or `All.getOrganizationProjects`.

* [Create an organization project](https://docs.github.com/en/rest/reference/projects#create-an-organization-project) that can be used as `Project.createOrganizationProject` or `All.createOrganizationProject`.

* [Get a project](https://docs.github.com/en/rest/reference/projects#get-a-project) that can be used as `Project.getProject` or `All.getProject`.

* [Update a project](https://docs.github.com/en/rest/reference/projects#update-a-project) that can be used as `Project.updateProject` or `All.updateProject`.

* [Delete a project](https://docs.github.com/en/rest/reference/projects#delete-a-project) that can be used as `Project.deleteProject` or `All.deleteProject`.

* [List repository projects](https://docs.github.com/en/rest/reference/projects#list-repository-projects) that can be used as `Project.getRepositoryProjects` or `All.getRepositoryProjects`.

* [Create a repository project](https://docs.github.com/en/rest/reference/projects#create-a-repository-project) that can be used as `Project.createRepositoryProject` or `All.createRepositoryProject`.

* [List user projects](https://docs.github.com/en/rest/reference/projects#list-user-projects) that can be used as `Project.getUserProjects` or `All.getUserProjects`.

* [Create a user project](https://docs.github.com/en/rest/reference/projects#create-a-user-project) that can be used as `Project.createUserProject` or `All.createUserProject`.

# Added support for the following Search methods:

* [Search code](https://docs.github.com/en/rest/reference/search#search-code) that can be used as `Search.searchCode` or `All.searchCode`.

* [Search commits](https://docs.github.com/en/rest/reference/search#search-commits) that can be used as `Search.searchCommits` or `All.searchCommits`.

* [Search issues and pull requests](https://docs.github.com/en/rest/reference/search#search-issues-and-pull-requests) that can be used as `Search.searchIssuesAndPullRequests` or `All.searchIssuesAndPullRequests`.

* [Search labels](https://docs.github.com/en/rest/reference/search#search-labels) that can be used as `Search.searchLabels` or `All.searchLabels`.

* [Search repositories](https://docs.github.com/en/rest/reference/search#search-repositories) that can be used as `Search.searchRepositories` or `All.searchRepositories`.

* [Search topics](https://docs.github.com/en/rest/reference/search#search-topics) that can be used as `Search.searchTopics` or `All.searchTopics`.

* [Search users](https://docs.github.com/en/rest/reference/search#search-users) that can be used as `Search.searchUsers` or `All.searchUsers`.

Copyright Adaptavist 2025 (c) All rights reserved