Skip to content

Commit deefd69

Browse files
authored
feat(typescript): compile-time error when missing secret option (#461)
1 parent 437803c commit deefd69

File tree

6 files changed

+14
-14
lines changed

6 files changed

+14
-14
lines changed

src/index.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,12 @@ class Webhooks<TTransformed = unknown> {
4646
next?: (err?: any) => void
4747
) => void | Promise<void>;
4848

49-
constructor(options: Options<TTransformed>) {
49+
constructor(options: Options<TTransformed> & { secret: string }) {
5050
if (!options || !options.secret) {
5151
throw new Error("[@octokit/webhooks] options.secret required");
5252
}
5353

54-
const state: State = {
54+
const state: State & { secret: string } = {
5555
eventHandler: createEventHandler(options),
5656
path: options.path || "/",
5757
secret: options.secret,
@@ -88,7 +88,9 @@ class Webhooks<TTransformed = unknown> {
8888
}
8989

9090
/** @deprecated `createWebhooksApi()` is deprecated and will be removed in a future release of `@octokit/webhooks`, please use the `Webhooks` class instead */
91-
const createWebhooksApi = <TTransformed>(options: Options<TTransformed>) => {
91+
const createWebhooksApi = <TTransformed>(
92+
options: Options<TTransformed> & { secret: string }
93+
) => {
9294
const log = createLogger(options.log);
9395
log.warn(
9496
"[@octokit/webhooks] `createWebhooksApi()` is deprecated and will be removed in a future release of `@octokit/webhooks`, please use the `Webhooks` class instead"

src/middleware-legacy/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import { createEventHandler } from "../event-handler/index";
44
import { middleware } from "./middleware";
55
import { Options, State } from "../types";
66

7-
export function createMiddleware(options: Options) {
7+
export function createMiddleware(options: Options & { secret: string }) {
88
if (!options || !options.secret) {
99
throw new Error("[@octokit/webhooks] options.secret required");
1010
}
1111

12-
const state: State = {
12+
const state: State & { secret: string } = {
1313
eventHandler: createEventHandler(options),
1414
path: options.path || "/",
1515
secret: options.secret,

src/middleware-legacy/middleware.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { IncomingMessage, ServerResponse } from "http";
77
import { State, WebhookEventHandlerError } from "../types";
88

99
export function middleware(
10-
state: State,
10+
state: State & { secret: string },
1111
request: IncomingMessage,
1212
response: ServerResponse,
1313
next?: Function

src/middleware-legacy/verify-and-receive.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,11 @@ import { EmitterWebhookEvent, State } from "../types";
22
import { verify } from "../verify/index";
33

44
export function verifyAndReceive(
5-
state: State,
5+
state: State & { secret: string },
66
event: EmitterWebhookEvent & { signature: string }
77
): any {
88
// verify will validate that the secret is not undefined
9-
const matchesSignature = verify(
10-
state.secret!,
11-
event.payload,
12-
event.signature
13-
);
9+
const matchesSignature = verify(state.secret, event.payload, event.signature);
1410

1511
if (!matchesSignature) {
1612
const error = new Error(
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { createMiddleware as Middleware } from "../../src/middleware-legacy";
22

33
test("options: none", () => {
4+
// @ts-expect-error
45
expect(() => Middleware({})).toThrow();
56
});

test/unit/middleware-test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ test("next() callback", () => {
2020

2121
middleware(
2222
{
23+
secret: "mysecret",
2324
hooks: {},
2425
log: console,
2526
},
@@ -45,7 +46,7 @@ describe("when does a timeout on retrieving the payload", () => {
4546
mockVerifyAndReceive.mockResolvedValueOnce(undefined);
4647

4748
const promiseMiddleware = middleware(
48-
{ hooks: {}, path: "/foo", log: console },
49+
{ secret: "mysecret", hooks: {}, path: "/foo", log: console },
4950
({
5051
method: "POST",
5152
url: "/foo",
@@ -78,7 +79,7 @@ describe("when does a timeout on retrieving the payload", () => {
7879
mockVerifyAndReceive.mockRejectedValueOnce(new Error("random error"));
7980

8081
const promiseMiddleware = middleware(
81-
{ hooks: {}, path: "/foo", log: console },
82+
{ secret: "mysecret", hooks: {}, path: "/foo", log: console },
8283
({
8384
method: "POST",
8485
url: "/foo",

0 commit comments

Comments
 (0)