"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // pkg/dist-src/index.js var dist_src_exports = {}; __export(dist_src_exports, { Webhooks: () => Webhooks, createEventHandler: () => createEventHandler, createNodeMiddleware: () => createNodeMiddleware, emitterEventNames: () => emitterEventNames }); module.exports = __toCommonJS(dist_src_exports); // pkg/dist-src/createLogger.js var createLogger = (logger) => ({ debug: () => { }, info: () => { }, warn: console.warn.bind(console), error: console.error.bind(console), ...logger }); // pkg/dist-src/generated/webhook-names.js var emitterEventNames = [ "branch_protection_rule", "branch_protection_rule.created", "branch_protection_rule.deleted", "branch_protection_rule.edited", "check_run", "check_run.completed", "check_run.created", "check_run.requested_action", "check_run.rerequested", "check_suite", "check_suite.completed", "check_suite.requested", "check_suite.rerequested", "code_scanning_alert", "code_scanning_alert.appeared_in_branch", "code_scanning_alert.closed_by_user", "code_scanning_alert.created", "code_scanning_alert.fixed", "code_scanning_alert.reopened", "code_scanning_alert.reopened_by_user", "commit_comment", "commit_comment.created", "create", "delete", "dependabot_alert", "dependabot_alert.created", "dependabot_alert.dismissed", "dependabot_alert.fixed", "dependabot_alert.reintroduced", "dependabot_alert.reopened", "deploy_key", "deploy_key.created", "deploy_key.deleted", "deployment", "deployment.created", "deployment_status", "deployment_status.created", "discussion", "discussion.answered", "discussion.category_changed", "discussion.created", "discussion.deleted", "discussion.edited", "discussion.labeled", "discussion.locked", "discussion.pinned", "discussion.transferred", "discussion.unanswered", "discussion.unlabeled", "discussion.unlocked", "discussion.unpinned", "discussion_comment", "discussion_comment.created", "discussion_comment.deleted", "discussion_comment.edited", "fork", "github_app_authorization", "github_app_authorization.revoked", "gollum", "installation", "installation.created", "installation.deleted", "installation.new_permissions_accepted", "installation.suspend", "installation.unsuspend", "installation_repositories", "installation_repositories.added", "installation_repositories.removed", "installation_target", "installation_target.renamed", "issue_comment", "issue_comment.created", "issue_comment.deleted", "issue_comment.edited", "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", "label", "label.created", "label.deleted", "label.edited", "marketplace_purchase", "marketplace_purchase.cancelled", "marketplace_purchase.changed", "marketplace_purchase.pending_change", "marketplace_purchase.pending_change_cancelled", "marketplace_purchase.purchased", "member", "member.added", "member.edited", "member.removed", "membership", "membership.added", "membership.removed", "merge_group", "merge_group.checks_requested", "meta", "meta.deleted", "milestone", "milestone.closed", "milestone.created", "milestone.deleted", "milestone.edited", "milestone.opened", "org_block", "org_block.blocked", "org_block.unblocked", "organization", "organization.deleted", "organization.member_added", "organization.member_invited", "organization.member_removed", "organization.renamed", "package", "package.published", "package.updated", "page_build", "ping", "project", "project.closed", "project.created", "project.deleted", "project.edited", "project.reopened", "project_card", "project_card.converted", "project_card.created", "project_card.deleted", "project_card.edited", "project_card.moved", "project_column", "project_column.created", "project_column.deleted", "project_column.edited", "project_column.moved", "projects_v2_item", "projects_v2_item.archived", "projects_v2_item.converted", "projects_v2_item.created", "projects_v2_item.deleted", "projects_v2_item.edited", "projects_v2_item.reordered", "projects_v2_item.restored", "public", "pull_request", "pull_request.assigned", "pull_request.auto_merge_disabled", "pull_request.auto_merge_enabled", "pull_request.closed", "pull_request.converted_to_draft", "pull_request.demilestoned", "pull_request.dequeued", "pull_request.edited", "pull_request.labeled", "pull_request.locked", "pull_request.milestoned", "pull_request.opened", "pull_request.queued", "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", "pull_request_review", "pull_request_review.dismissed", "pull_request_review.edited", "pull_request_review.submitted", "pull_request_review_comment", "pull_request_review_comment.created", "pull_request_review_comment.deleted", "pull_request_review_comment.edited", "pull_request_review_thread", "pull_request_review_thread.resolved", "pull_request_review_thread.unresolved", "push", "registry_package", "registry_package.published", "registry_package.updated", "release", "release.created", "release.deleted", "release.edited", "release.prereleased", "release.published", "release.released", "release.unpublished", "repository", "repository.archived", "repository.created", "repository.deleted", "repository.edited", "repository.privatized", "repository.publicized", "repository.renamed", "repository.transferred", "repository.unarchived", "repository_dispatch", "repository_import", "repository_vulnerability_alert", "repository_vulnerability_alert.create", "repository_vulnerability_alert.dismiss", "repository_vulnerability_alert.reopen", "repository_vulnerability_alert.resolve", "secret_scanning_alert", "secret_scanning_alert.created", "secret_scanning_alert.reopened", "secret_scanning_alert.resolved", "security_advisory", "security_advisory.performed", "security_advisory.published", "security_advisory.updated", "security_advisory.withdrawn", "sponsorship", "sponsorship.cancelled", "sponsorship.created", "sponsorship.edited", "sponsorship.pending_cancellation", "sponsorship.pending_tier_change", "sponsorship.tier_changed", "star", "star.created", "star.deleted", "status", "team", "team.added_to_repository", "team.created", "team.deleted", "team.edited", "team.removed_from_repository", "team_add", "watch", "watch.started", "workflow_dispatch", "workflow_job", "workflow_job.completed", "workflow_job.in_progress", "workflow_job.queued", "workflow_run", "workflow_run.completed", "workflow_run.in_progress", "workflow_run.requested" ]; // pkg/dist-src/event-handler/on.js function handleEventHandlers(state, webhookName, handler) { if (!state.hooks[webhookName]) { state.hooks[webhookName] = []; } state.hooks[webhookName].push(handler); } function receiverOn(state, webhookNameOrNames, handler) { if (Array.isArray(webhookNameOrNames)) { webhookNameOrNames.forEach( (webhookName) => receiverOn(state, webhookName, handler) ); return; } if (["*", "error"].includes(webhookNameOrNames)) { const webhookName = webhookNameOrNames === "*" ? "any" : webhookNameOrNames; const message = `Using the "${webhookNameOrNames}" event with the regular Webhooks.on() function is not supported. Please use the Webhooks.on${webhookName.charAt(0).toUpperCase() + webhookName.slice(1)}() method instead`; throw new Error(message); } if (!emitterEventNames.includes(webhookNameOrNames)) { state.log.warn( `"${webhookNameOrNames}" is not a known webhook name (https://developer.github.com/v3/activity/events/types/)` ); } handleEventHandlers(state, webhookNameOrNames, handler); } function receiverOnAny(state, handler) { handleEventHandlers(state, "*", handler); } function receiverOnError(state, handler) { handleEventHandlers(state, "error", handler); } // pkg/dist-src/event-handler/receive.js var import_aggregate_error = __toESM(require("aggregate-error")); // pkg/dist-src/event-handler/wrap-error-handler.js function wrapErrorHandler(handler, error) { let returnValue; try { returnValue = handler(error); } catch (error2) { console.log('FATAL: Error occurred in "error" event handler'); console.log(error2); } if (returnValue && returnValue.catch) { returnValue.catch((error2) => { console.log('FATAL: Error occurred in "error" event handler'); console.log(error2); }); } } // pkg/dist-src/event-handler/receive.js function getHooks(state, eventPayloadAction, eventName) { const hooks = [state.hooks[eventName], state.hooks["*"]]; if (eventPayloadAction) { hooks.unshift(state.hooks[`${eventName}.${eventPayloadAction}`]); } return [].concat(...hooks.filter(Boolean)); } function receiverHandle(state, event) { const errorHandlers = state.hooks.error || []; if (event instanceof Error) { const error = Object.assign(new import_aggregate_error.default([event]), { event, errors: [event] }); errorHandlers.forEach((handler) => wrapErrorHandler(handler, error)); return Promise.reject(error); } if (!event || !event.name) { throw new import_aggregate_error.default(["Event name not passed"]); } if (!event.payload) { throw new import_aggregate_error.default(["Event payload not passed"]); } const hooks = getHooks( state, "action" in event.payload ? event.payload.action : null, event.name ); if (hooks.length === 0) { return Promise.resolve(); } const errors = []; const promises = hooks.map((handler) => { let promise = Promise.resolve(event); if (state.transform) { promise = promise.then(state.transform); } return promise.then((event2) => { return handler(event2); }).catch((error) => errors.push(Object.assign(error, { event }))); }); return Promise.all(promises).then(() => { if (errors.length === 0) { return; } const error = new import_aggregate_error.default(errors); Object.assign(error, { event, errors }); errorHandlers.forEach((handler) => wrapErrorHandler(handler, error)); throw error; }); } // pkg/dist-src/event-handler/remove-listener.js function removeListener(state, webhookNameOrNames, handler) { if (Array.isArray(webhookNameOrNames)) { webhookNameOrNames.forEach( (webhookName) => removeListener(state, webhookName, handler) ); return; } if (!state.hooks[webhookNameOrNames]) { return; } for (let i = state.hooks[webhookNameOrNames].length - 1; i >= 0; i--) { if (state.hooks[webhookNameOrNames][i] === handler) { state.hooks[webhookNameOrNames].splice(i, 1); return; } } } // pkg/dist-src/event-handler/index.js function createEventHandler(options) { const state = { hooks: {}, log: createLogger(options && options.log) }; if (options && options.transform) { state.transform = options.transform; } return { on: receiverOn.bind(null, state), onAny: receiverOnAny.bind(null, state), onError: receiverOnError.bind(null, state), removeListener: removeListener.bind(null, state), receive: receiverHandle.bind(null, state) }; } // pkg/dist-src/sign.js var import_webhooks_methods = require("@octokit/webhooks-methods"); // pkg/dist-src/to-normalized-json-string.js function toNormalizedJsonString(payload) { const payloadString = JSON.stringify(payload); return payloadString.replace(/[^\\]\\u[\da-f]{4}/g, (s) => { return s.substr(0, 3) + s.substr(3).toUpperCase(); }); } // pkg/dist-src/sign.js async function sign(secret, payload) { return (0, import_webhooks_methods.sign)( secret, typeof payload === "string" ? payload : toNormalizedJsonString(payload) ); } // pkg/dist-src/verify.js var import_webhooks_methods2 = require("@octokit/webhooks-methods"); async function verify(secret, payload, signature) { return (0, import_webhooks_methods2.verify)( secret, typeof payload === "string" ? payload : toNormalizedJsonString(payload), signature ); } // pkg/dist-src/verify-and-receive.js var import_webhooks_methods3 = require("@octokit/webhooks-methods"); async function verifyAndReceive(state, event) { const matchesSignature = await (0, import_webhooks_methods3.verify)( state.secret, typeof event.payload === "object" ? toNormalizedJsonString(event.payload) : event.payload, event.signature ).catch(() => false); if (!matchesSignature) { const error = new Error( "[@octokit/webhooks] signature does not match event payload and secret" ); return state.eventHandler.receive( Object.assign(error, { event, status: 400 }) ); } return state.eventHandler.receive({ id: event.id, name: event.name, payload: typeof event.payload === "string" ? JSON.parse(event.payload) : event.payload }); } // pkg/dist-src/middleware/node/get-missing-headers.js var WEBHOOK_HEADERS = [ "x-github-event", "x-hub-signature-256", "x-github-delivery" ]; function getMissingHeaders(request) { return WEBHOOK_HEADERS.filter((header) => !(header in request.headers)); } // pkg/dist-src/middleware/node/get-payload.js var import_aggregate_error2 = __toESM(require("aggregate-error")); function getPayload(request) { if (request.body) { if (typeof request.body !== "string") { console.warn( "[@octokit/webhooks] Passing the payload as a JSON object in `request.body` is deprecated and will be removed in a future release of `@octokit/webhooks`, please pass it as a a `string` instead." ); } return Promise.resolve(request.body); } return new Promise((resolve, reject) => { let data = ""; request.setEncoding("utf8"); request.on("error", (error) => reject(new import_aggregate_error2.default([error]))); request.on("data", (chunk) => data += chunk); request.on("end", () => { try { JSON.parse(data); resolve(data); } catch (error) { error.message = "Invalid JSON"; error.status = 400; reject(new import_aggregate_error2.default([error])); } }); }); } // pkg/dist-src/middleware/node/middleware.js async function middleware(webhooks, options, request, response, next) { let pathname; try { pathname = new URL(request.url, "http://localhost").pathname; } catch (error) { response.writeHead(422, { "content-type": "application/json" }); response.end( JSON.stringify({ error: `Request URL could not be parsed: ${request.url}` }) ); return; } const isUnknownRoute = request.method !== "POST" || pathname !== options.path; const isExpressMiddleware = typeof next === "function"; if (isUnknownRoute) { if (isExpressMiddleware) { return next(); } else { return options.onUnhandledRequest(request, response); } } if (!request.headers["content-type"] || !request.headers["content-type"].startsWith("application/json")) { response.writeHead(415, { "content-type": "application/json", accept: "application/json" }); response.end( JSON.stringify({ error: `Unsupported "Content-Type" header value. Must be "application/json"` }) ); return; } const missingHeaders = getMissingHeaders(request).join(", "); if (missingHeaders) { response.writeHead(400, { "content-type": "application/json" }); response.end( JSON.stringify({ error: `Required headers missing: ${missingHeaders}` }) ); return; } const eventName = request.headers["x-github-event"]; const signatureSHA256 = request.headers["x-hub-signature-256"]; const id = request.headers["x-github-delivery"]; options.log.debug(`${eventName} event received (id: ${id})`); let didTimeout = false; const timeout = setTimeout(() => { didTimeout = true; response.statusCode = 202; response.end("still processing\n"); }, 9e3).unref(); try { const payload = await getPayload(request); await webhooks.verifyAndReceive({ id, name: eventName, payload, signature: signatureSHA256 }); clearTimeout(timeout); if (didTimeout) return; response.end("ok\n"); } catch (error) { clearTimeout(timeout); if (didTimeout) return; const err = Array.from(error)[0]; const errorMessage = err.message ? `${err.name}: ${err.message}` : "Error: An Unspecified error occurred"; response.statusCode = typeof err.status !== "undefined" ? err.status : 500; options.log.error(error); response.end( JSON.stringify({ error: errorMessage }) ); } } // pkg/dist-src/middleware/node/on-unhandled-request-default.js function onUnhandledRequestDefault(request, response) { response.writeHead(404, { "content-type": "application/json" }); response.end( JSON.stringify({ error: `Unknown route: ${request.method} ${request.url}` }) ); } // pkg/dist-src/middleware/node/index.js function createNodeMiddleware(webhooks, { path = "/api/github/webhooks", onUnhandledRequest = onUnhandledRequestDefault, log = createLogger() } = {}) { const deprecateOnUnhandledRequest = (request, response) => { console.warn( "[@octokit/webhooks] `onUnhandledRequest()` is deprecated and will be removed in a future release of `@octokit/webhooks`" ); return onUnhandledRequest(request, response); }; return middleware.bind(null, webhooks, { path, onUnhandledRequest: deprecateOnUnhandledRequest, log }); } // pkg/dist-src/index.js var Webhooks = class { constructor(options) { if (!options || !options.secret) { throw new Error("[@octokit/webhooks] options.secret required"); } const state = { eventHandler: createEventHandler(options), secret: options.secret, hooks: {}, log: createLogger(options.log) }; this.sign = sign.bind(null, options.secret); this.verify = (eventPayload, signature) => { if (typeof eventPayload === "object") { console.warn( "[@octokit/webhooks] Passing a JSON payload object to `verify()` is deprecated and the functionality will be removed in a future release of `@octokit/webhooks`" ); } return verify(options.secret, eventPayload, signature); }; this.on = state.eventHandler.on; this.onAny = state.eventHandler.onAny; this.onError = state.eventHandler.onError; this.removeListener = state.eventHandler.removeListener; this.receive = state.eventHandler.receive; this.verifyAndReceive = (options2) => { if (typeof options2.payload === "object") { console.warn( "[@octokit/webhooks] Passing a JSON payload object to `verifyAndReceive()` is deprecated and the functionality will be removed in a future release of `@octokit/webhooks`" ); } return verifyAndReceive(state, options2); }; } }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Webhooks, createEventHandler, createNodeMiddleware, emitterEventNames });