diff --git a/src/context.ts b/src/context.ts index 4c3ca0deae..2c21caec2c 100644 --- a/src/context.ts +++ b/src/context.ts @@ -12,6 +12,42 @@ import { EmitterWebhookEventName as WebhookEvents } from "@octokit/webhooks/dist export type MergeOptions = merge.Options; +/** Repo owner type, either string or never depending on the context */ +type RepoOwnerType = + WebhookEvent["payload"] extends { + repository: { owner: { login: string } }; + } + ? string + : never | WebhookEvent["payload"] extends { + repository: { owner: { name: string } }; + } + ? string + : never; + +/** Repo name type, either string or never depending on the context */ +type RepoNameType = + WebhookEvent["payload"] extends { repository: { name: string } } + ? string + : never; + +/** Issue type (also pull request number), either number or never depending on the context */ +type RepoIssueNumberType = + WebhookEvent["payload"] extends { issue: { number: number } } + ? number + : never | WebhookEvent["payload"] extends { + pull_request: { number: number }; + } + ? number + : never | WebhookEvent["payload"] extends { number: number } + ? number + : never; + +/** Context.repo return type */ +type RepoResultType = { + owner: RepoOwnerType; + repo: RepoNameType; +}; + /** * The context of the event that was triggered, including the payload and * helpers for extracting information can be passed to GitHub API calls. @@ -61,7 +97,7 @@ export class Context { * @param object - Params to be merged with the repo params. * */ - public repo(object?: T) { + public repo(object?: T): RepoResultType & T { // @ts-ignore `repository` is not always present in this.payload const repo = this.payload.repository; @@ -92,7 +128,9 @@ export class Context { * * @param object - Params to be merged with the issue params. */ - public issue(object?: T) { + public issue( + object?: T + ): RepoResultType & { issue_number: RepoIssueNumberType } & T { return Object.assign( { issue_number: @@ -116,7 +154,9 @@ export class Context { * * @param object - Params to be merged with the pull request params. */ - public pullRequest(object?: T) { + public pullRequest( + object?: T + ): RepoResultType & { pull_number: RepoIssueNumberType } & T { const payload = this.payload; return Object.assign( {