diff --git a/index.d.ts b/index.d.ts index 77733683..0a0765d7 100644 --- a/index.d.ts +++ b/index.d.ts @@ -4496,483 +4496,376 @@ declare namespace Webhooks { } } -declare class Webhooks { - constructor(options?: Options); - - public on(event: "error", callback: (event: Error) => void): void; - public on( - event: "*" | string[], - callback: (event: Webhooks.WebhookEvent) => Promise | void - ): void; - - public on( - event: - | "check_run" - | "check_run.completed" - | "check_run.created" - | "check_run.requested_action" - | "check_run.rerequested", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "check_suite" - | "check_suite.completed" - | "check_suite.requested" - | "check_suite.rerequested", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "commit_comment" | "commit_comment.created", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "content_reference" | "content_reference.created", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "create", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "delete", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "deploy_key" | "deploy_key.created" | "deploy_key.deleted", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "deployment" | "deployment.created", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "deployment_status" | "deployment_status.created", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "fork", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "github_app_authorization" | "github_app_authorization.revoked", - callback: ( - event: Webhooks.WebhookEvent< - Webhooks.WebhookPayloadGithubAppAuthorization - > - ) => Promise | void - ): void; - - public on( - event: "gollum", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "installation" - | "installation.created" - | "installation.deleted" - | "installation.new_permissions_accepted" - | "installation.suspend" - | "installation.unsuspend", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "installation_repositories" - | "installation_repositories.added" - | "installation_repositories.removed", - callback: ( - event: Webhooks.WebhookEvent< - Webhooks.WebhookPayloadInstallationRepositories - > - ) => Promise | void - ): void; - - public on( - event: - | "issue_comment" - | "issue_comment.created" - | "issue_comment.deleted" - | "issue_comment.edited", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "issues" - | "issues.assigned" - | "issues.closed" - | "issues.deleted" - | "issues.demilestoned" - | "issues.edited" - | "issues.labeled" - | "issues.locked" - | "issues.milestoned" - | "issues.opened" - | "issues.pinned" - | "issues.reopened" - | "issues.transferred" - | "issues.unassigned" - | "issues.unlabeled" - | "issues.unlocked" - | "issues.unpinned", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "label" | "label.created" | "label.deleted" | "label.edited", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "marketplace_purchase" - | "marketplace_purchase.cancelled" - | "marketplace_purchase.changed" - | "marketplace_purchase.pending_change" - | "marketplace_purchase.pending_change_cancelled" - | "marketplace_purchase.purchased", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "member" | "member.added" | "member.edited" | "member.removed", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "membership" | "membership.added" | "membership.removed", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "meta" | "meta.deleted", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "milestone" - | "milestone.closed" - | "milestone.created" - | "milestone.deleted" - | "milestone.edited" - | "milestone.opened", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "organization" - | "organization.deleted" - | "organization.member_added" - | "organization.member_invited" - | "organization.member_removed" - | "organization.renamed", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "org_block" | "org_block.blocked" | "org_block.unblocked", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; +type EventTypeError = "error"; +type AnyEvent = "*"; +type WebhookPayloadCheckRunEventTypeKeys = + | "check_run" + | "check_run.completed" + | "check_run.created" + | "check_run.requested_action" + | "check_run.rerequested"; +type WebhookPayloadCheckSuiteEventTypeKeys = + | "check_suite" + | "check_suite.completed" + | "check_suite.requested" + | "check_suite.rerequested"; +type WebhookPayloadCommitCommentEventTypeKeys = + | "commit_comment" + | "commit_comment.created"; +type WebhookPayloadContentReferenceEventTypeKeys = + | "content_reference" + | "content_reference.created"; +type WebhookPayloadCreateEventTypeKeys = "create"; +type WebhookPayloadDeleteEventTypeKeys = "delete"; +type WebhookPayloadDeployKeyEventTypeKeys = + | "deploy_key" + | "deploy_key.created" + | "deploy_key.deleted"; +type WebhookPayloadDeploymentEventTypeKeys = + | "deployment" + | "deployment.created"; +type WebhookPayloadDeploymentStatusEventTypeKeys = + | "deployment_status" + | "deployment_status.created"; +type WebhookPayloadForkEventTypeKeys = "fork"; +type WebhookPayloadGithubAppAuthorizationEventTypeKeys = + | "github_app_authorization" + | "github_app_authorization.revoked"; +type WebhookPayloadGollumEventTypeKeys = "gollum"; +type WebhookPayloadInstallationEventTypeKeys = + | "installation" + | "installation.created" + | "installation.deleted" + | "installation.new_permissions_accepted" + | "installation.suspend" + | "installation.unsuspend"; +type WebhookPayloadInstallationRepositoriesEventTypeKeys = + | "installation_repositories" + | "installation_repositories.added" + | "installation_repositories.removed"; +type WebhookPayloadIssueCommentEventTypeKeys = + | "issue_comment" + | "issue_comment.created" + | "issue_comment.deleted" + | "issue_comment.edited"; +type WebhookPayloadIssuesEventTypeKeys = + | "issues" + | "issues.assigned" + | "issues.closed" + | "issues.deleted" + | "issues.demilestoned" + | "issues.edited" + | "issues.labeled" + | "issues.locked" + | "issues.milestoned" + | "issues.opened" + | "issues.pinned" + | "issues.reopened" + | "issues.transferred" + | "issues.unassigned" + | "issues.unlabeled" + | "issues.unlocked" + | "issues.unpinned"; +type WebhookPayloadLabelEventTypeKeys = + | "label" + | "label.created" + | "label.deleted" + | "label.edited"; +type WebhookPayloadMarketplacePurchaseEventTypeKeys = + | "marketplace_purchase" + | "marketplace_purchase.cancelled" + | "marketplace_purchase.changed" + | "marketplace_purchase.pending_change" + | "marketplace_purchase.pending_change_cancelled" + | "marketplace_purchase.purchased"; +type WebhookPayloadMemberEventTypeKeys = + | "member" + | "member.added" + | "member.edited" + | "member.removed"; +type WebhookPayloadMembershipEventTypeKeys = + | "membership" + | "membership.added" + | "membership.removed"; +type WebhookPayloadMetaEventTypeKeys = "meta" | "meta.deleted"; +type WebhookPayloadMilestoneEventTypeKeys = + | "milestone" + | "milestone.closed" + | "milestone.created" + | "milestone.deleted" + | "milestone.edited" + | "milestone.opened"; +type WebhookPayloadOrganizationEventTypeKeys = + | "organization" + | "organization.deleted" + | "organization.member_added" + | "organization.member_invited" + | "organization.member_removed" + | "organization.renamed"; +type WebhookPayloadOrgBlockEventTypeKeys = + | "org_block" + | "org_block.blocked" + | "org_block.unblocked"; +type WebhookPayloadPackageEventTypeKeys = + | "package" + | "package.published" + | "package.updated"; +type WebhookPayloadPageBuildEventTypeKeys = "page_build"; +type WebhookPayloadProjectCardEventTypeKeys = + | "project_card" + | "project_card.converted" + | "project_card.created" + | "project_card.deleted" + | "project_card.edited" + | "project_card.moved"; +type WebhookPayloadProjectColumnEventTypeKeys = + | "project_column" + | "project_column.created" + | "project_column.deleted" + | "project_column.edited" + | "project_column.moved"; +type WebhookPayloadProjectEventTypeKeys = + | "project" + | "project.closed" + | "project.created" + | "project.deleted" + | "project.edited" + | "project.reopened"; +type WebhookPayloadPublicEventTypeKeys = "public"; +type WebhookPayloadPullRequestEventTypeKeys = + | "pull_request" + | "pull_request.assigned" + | "pull_request.closed" + | "pull_request.edited" + | "pull_request.labeled" + | "pull_request.locked" + | "pull_request.opened" + | "pull_request.ready_for_review" + | "pull_request.reopened" + | "pull_request.review_request_removed" + | "pull_request.review_requested" + | "pull_request.synchronize" + | "pull_request.unassigned" + | "pull_request.unlabeled" + | "pull_request.unlocked"; +type WebhookPayloadPullRequestReviewEventTypeKeys = + | "pull_request_review" + | "pull_request_review.dismissed" + | "pull_request_review.edited" + | "pull_request_review.submitted"; +type WebhookPayloadPullRequestReviewCommentEventTypeKeys = + | "pull_request_review_comment" + | "pull_request_review_comment.created" + | "pull_request_review_comment.deleted" + | "pull_request_review_comment.edited"; +type WebhookPayloadPushEventTypeKeys = "push"; +type WebhookPayloadReleaseEventTypeKeys = + | "release" + | "release.created" + | "release.deleted" + | "release.edited" + | "release.prereleased" + | "release.published" + | "release.unpublished"; +type WebhookPayloadRepositoryDispatchEventTypeKeys = + | "repository_dispatch" + | "repository_dispatch.on-demand-test"; +type WebhookPayloadRepositoryEventTypeKeys = + | "repository" + | "repository.archived" + | "repository.created" + | "repository.deleted" + | "repository.edited" + | "repository.privatized" + | "repository.publicized" + | "repository.renamed" + | "repository.transferred" + | "repository.unarchived"; +type WebhookPayloadRepositoryImportEventTypeKeys = "repository_import"; +type WebhookPayloadRepositoryVulnerabilityAlertEventTypeKeys = + | "repository_vulnerability_alert" + | "repository_vulnerability_alert.create" + | "repository_vulnerability_alert.dismiss" + | "repository_vulnerability_alert.resolve"; +type WebhookPayloadSecurityAdvisoryEventTypeKeys = + | "security_advisory" + | "security_advisory.performed" + | "security_advisory.published" + | "security_advisory.updated"; +type WebhookPayloadSponsorshipEventTypeKeys = + | "sponsorship" + | "sponsorship.created" + | "sponsorship.pending_tier_change"; +type WebhookPayloadStarEventTypeKeys = "star" | "star.created" | "star.deleted"; +type WebhookPayloadStatusEventTypeKeys = "status"; +type WebhookPayloadTeamEventTypeKeys = + | "team" + | "team.added_to_repository" + | "team.created" + | "team.deleted" + | "team.edited" + | "team.removed_from_repository"; +type WebhookPayloadTeamAddEventTypeKeys = "team_add"; +type WebhookPayloadWatchEventTypeKeys = "watch" | "watch.started"; +type WebhookPayloadPingEventTypeKeys = "ping"; - public on( - event: "package" | "package.published" | "package.updated", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; +type AllEventTypes = + | EventTypeError + | AnyEvent + | WebhookPayloadCheckRunEventTypeKeys + | WebhookPayloadCheckSuiteEventTypeKeys + | WebhookPayloadCommitCommentEventTypeKeys + | WebhookPayloadContentReferenceEventTypeKeys + | WebhookPayloadCreateEventTypeKeys + | WebhookPayloadDeleteEventTypeKeys + | WebhookPayloadDeployKeyEventTypeKeys + | WebhookPayloadDeploymentEventTypeKeys + | WebhookPayloadDeploymentStatusEventTypeKeys + | WebhookPayloadForkEventTypeKeys + | WebhookPayloadGithubAppAuthorizationEventTypeKeys + | WebhookPayloadGollumEventTypeKeys + | WebhookPayloadInstallationEventTypeKeys + | WebhookPayloadInstallationRepositoriesEventTypeKeys + | WebhookPayloadIssueCommentEventTypeKeys + | WebhookPayloadIssuesEventTypeKeys + | WebhookPayloadLabelEventTypeKeys + | WebhookPayloadMarketplacePurchaseEventTypeKeys + | WebhookPayloadMemberEventTypeKeys + | WebhookPayloadMembershipEventTypeKeys + | WebhookPayloadMetaEventTypeKeys + | WebhookPayloadMilestoneEventTypeKeys + | WebhookPayloadOrganizationEventTypeKeys + | WebhookPayloadOrgBlockEventTypeKeys + | WebhookPayloadPackageEventTypeKeys + | WebhookPayloadPageBuildEventTypeKeys + | WebhookPayloadProjectCardEventTypeKeys + | WebhookPayloadProjectColumnEventTypeKeys + | WebhookPayloadProjectEventTypeKeys + | WebhookPayloadPublicEventTypeKeys + | WebhookPayloadPullRequestEventTypeKeys + | WebhookPayloadPullRequestReviewEventTypeKeys + | WebhookPayloadPullRequestReviewCommentEventTypeKeys + | WebhookPayloadPushEventTypeKeys + | WebhookPayloadReleaseEventTypeKeys + | WebhookPayloadRepositoryDispatchEventTypeKeys + | WebhookPayloadRepositoryEventTypeKeys + | WebhookPayloadRepositoryImportEventTypeKeys + | WebhookPayloadRepositoryVulnerabilityAlertEventTypeKeys + | WebhookPayloadSecurityAdvisoryEventTypeKeys + | WebhookPayloadSponsorshipEventTypeKeys + | WebhookPayloadStarEventTypeKeys + | WebhookPayloadStatusEventTypeKeys + | WebhookPayloadTeamEventTypeKeys + | WebhookPayloadTeamAddEventTypeKeys + | WebhookPayloadWatchEventTypeKeys + | WebhookPayloadPingEventTypeKeys; - public on( - event: "page_build", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "project_card" - | "project_card.converted" - | "project_card.created" - | "project_card.deleted" - | "project_card.edited" - | "project_card.moved", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "project_column" - | "project_column.created" - | "project_column.deleted" - | "project_column.edited" - | "project_column.moved", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "project" - | "project.closed" - | "project.created" - | "project.deleted" - | "project.edited" - | "project.reopened", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "public", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "pull_request" - | "pull_request.assigned" - | "pull_request.closed" - | "pull_request.edited" - | "pull_request.labeled" - | "pull_request.locked" - | "pull_request.opened" - | "pull_request.ready_for_review" - | "pull_request.reopened" - | "pull_request.review_request_removed" - | "pull_request.review_requested" - | "pull_request.synchronize" - | "pull_request.unassigned" - | "pull_request.unlabeled" - | "pull_request.unlocked", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "pull_request_review" - | "pull_request_review.dismissed" - | "pull_request_review.edited" - | "pull_request_review.submitted", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "pull_request_review_comment" - | "pull_request_review_comment.created" - | "pull_request_review_comment.deleted" - | "pull_request_review_comment.edited", - callback: ( - event: Webhooks.WebhookEvent< - Webhooks.WebhookPayloadPullRequestReviewComment - > - ) => Promise | void - ): void; - - public on( - event: "push", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "release" - | "release.created" - | "release.deleted" - | "release.edited" - | "release.prereleased" - | "release.published" - | "release.unpublished", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "repository_dispatch" | "repository_dispatch.on-demand-test", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; +type GetWebhookPayloadTypeFromEvent = T extends EventTypeError + ? Error + : T extends AnyEvent + ? any + : T extends WebhookPayloadCheckRunEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadCheckSuiteEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadCommitCommentEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadContentReferenceEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadCreateEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadDeleteEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadDeployKeyEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadDeploymentEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadDeploymentStatusEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadForkEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadGithubAppAuthorizationEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadGollumEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadInstallationEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadInstallationRepositoriesEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadIssueCommentEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadIssuesEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadLabelEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadMarketplacePurchaseEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadMemberEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadMembershipEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadMetaEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadMilestoneEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadOrganizationEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadOrgBlockEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadPackageEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadPageBuildEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadProjectCardEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadProjectColumnEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadProjectEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadPublicEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadPullRequestEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadPullRequestReviewEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadPullRequestReviewCommentEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadPushEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadReleaseEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadRepositoryDispatchEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadRepositoryEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadRepositoryImportEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadRepositoryVulnerabilityAlertEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadSecurityAdvisoryEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadSponsorshipEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadStarEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadStatusEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadTeamEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadTeamAddEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadWatchEventTypeKeys + ? Webhooks.WebhookEvent + : T extends WebhookPayloadPingEventTypeKeys + ? Webhooks.WebhookEvent + : never; - public on( - event: - | "repository" - | "repository.archived" - | "repository.created" - | "repository.deleted" - | "repository.edited" - | "repository.privatized" - | "repository.publicized" - | "repository.renamed" - | "repository.transferred" - | "repository.unarchived", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "repository_import", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "repository_vulnerability_alert" - | "repository_vulnerability_alert.create" - | "repository_vulnerability_alert.dismiss" - | "repository_vulnerability_alert.resolve", - callback: ( - event: Webhooks.WebhookEvent< - Webhooks.WebhookPayloadRepositoryVulnerabilityAlert - > - ) => Promise | void - ): void; - - public on( - event: - | "security_advisory" - | "security_advisory.performed" - | "security_advisory.published" - | "security_advisory.updated", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "sponsorship" - | "sponsorship.created" - | "sponsorship.pending_tier_change", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "star" | "star.created" | "star.deleted", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "status", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: - | "team" - | "team.added_to_repository" - | "team.created" - | "team.deleted" - | "team.edited" - | "team.removed_from_repository", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "team_add", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "watch" | "watch.started", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void - ): void; - - public on( - event: "ping", - callback: ( - event: Webhooks.WebhookEvent - ) => Promise | void +declare class Webhooks { + constructor(options?: Options); + public on( + event: T | T[], + callback: (event: GetWebhookPayloadTypeFromEvent) => Promise | void ): void; - public sign(data: any): string; public verify(eventPayload: any, signature: string): boolean; public verifyAndReceive(options: { @@ -4986,13 +4879,9 @@ declare class Webhooks { name: string; payload: any; }): Promise; - public removeListener( - event: string | string[], - callback: (event: Webhooks.WebhookEvent) => void - ): void; - public removeListener( - event: string | string[], - callback: (event: Webhooks.WebhookEvent) => Promise + public removeListener( + event: T | T[], + callback: (event: GetWebhookPayloadTypeFromEvent) => Promise | void ): void; public middleware( request: http.IncomingMessage, diff --git a/scripts/generate-types.js b/scripts/generate-types.js index 67ea80e7..9fae0bee 100644 --- a/scripts/generate-types.js +++ b/scripts/generate-types.js @@ -5,7 +5,14 @@ const prettier = require("prettier"); const TypeWriter = require("@gimenete/type-writer"); const webhooks = require("@octokit/webhooks-definitions"); -const signatures = []; +const eventTypes = ['type EventTypeError = "error"', 'type AnyEvent = "*"']; + +const conditionalType = [ + `type GetWebhookPayloadTypeFromEvent = `, + `T extends EventTypeError ? Error :`, + `T extends AnyEvent ? any :`, +]; + const tw = new TypeWriter(); webhooks.forEach(({ name, actions, examples }) => { @@ -29,11 +36,15 @@ webhooks.forEach(({ name, actions, examples }) => { `'${name}'`, ...actions.map((action) => `'${name}.${action}'`), ].join(" | "); - signatures.push(` - public on (event: ${events}, callback: (event: Webhooks.WebhookEvent) => (Promise | void)): void - `); + const eventTypeName = `${typeName}EventTypeKeys`; + const type = `type ${eventTypeName} = ${events};`; + eventTypes.push(type); + conditionalType.push( + `T extends ${eventTypeName} ? Webhooks.WebhookEvent :` + ); }); +conditionalType.push(`never;`); const definition = ` // DO NOT EDIT THIS FILE DIRECTLY // make edits in scripts/generate-types.js @@ -59,19 +70,22 @@ declare namespace Webhooks { } } -declare class Webhooks { - constructor (options?: Options) +${eventTypes.join("\n")} - public on (event: 'error', callback: (event: Error) => void): void - public on (event: '*' | string[], callback: (event: Webhooks.WebhookEvent) => Promise | void): void - ${signatures.join("\n")} +type AllEventTypes = ${eventTypes + .map((event) => event.split(" ")[1]) + .join(" | ")}; +${conditionalType.join("\n")} + +declare class Webhooks { + constructor (options?: Options) + public on (event: T | T[], callback: (event: GetWebhookPayloadTypeFromEvent) => Promise | void): void public sign (data: any): string public verify (eventPayload: any, signature: string): boolean public verifyAndReceive (options: { id: string, name: string, payload: any, signature: string }): Promise public receive (options: { id: string, name: string, payload: any }): Promise - public removeListener (event: string | string[], callback: (event: Webhooks.WebhookEvent) => void): void - public removeListener (event: string | string[], callback: (event: Webhooks.WebhookEvent) => Promise): void + public removeListener (event: T | T[], callback: (event: GetWebhookPayloadTypeFromEvent) => Promise | void): void public middleware (request: http.IncomingMessage, response: http.ServerResponse, next?: (err?: any) => void): void | Promise } diff --git a/test/typescript-validate.ts b/test/typescript-validate.ts index 99857ee2..19745aea 100644 --- a/test/typescript-validate.ts +++ b/test/typescript-validate.ts @@ -27,5 +27,37 @@ export default async function () { webhooks.verify(payload, sig); }); + webhooks.on("check_run.completed", () => {}); + + webhooks.on( + ["check_run.completed", "commit_comment", "label"], + ({ name, payload }) => { + console.log(name); + if ("check_run" in payload) { + console.log(payload); + } + if ("comment" in payload) { + console.log(payload.comment); + } + } + ); + + webhooks.on(["check_run.completed", "check_run.created"], () => {}); + webhooks.on("check_run.created", ({ name, payload }) => { + console.log(payload.check_run.conclusion, name); + }); + + webhooks.removeListener("check_run.created", ({ name, payload }) => { + console.log(payload.check_run.conclusion, name); + }); + webhooks.removeListener(["commit_comment", "label"], ({ name, payload }) => { + console.log(name); + if ("label" in payload) { + console.log(payload.label.name); + } else { + console.log(payload.comment.body); + } + }); + createServer(webhooks.middleware).listen(3000); }