Skip to content

Commit 358af1c

Browse files
authored
✨ Add type guards for events (#6)
1 parent 77a1b91 commit 358af1c

File tree

6 files changed

+60
-3
lines changed

6 files changed

+60
-3
lines changed

src/server/webhooks/events/pr/event.test.ts

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { describe, test } from "vitest"
2-
import { isPrEventKey } from "./event.js"
2+
import type { Event } from "../event.js"
3+
import { isPrEvent, isPrEventKey } from "./event.js"
34

45
describe("isPrEventKey", () => {
56
test("pr:comment:added", ({ expect }) => {
@@ -12,3 +13,15 @@ describe("isPrEventKey", () => {
1213
expect(result).toBe(false)
1314
})
1415
})
16+
17+
describe("isPrEvent", () => {
18+
test("pr:comment:added", ({ expect }) => {
19+
const result = isPrEvent({ eventKey: "pr:comment:added" } as Event)
20+
expect(result).toBe(true)
21+
})
22+
23+
test("project:modified", ({ expect }) => {
24+
const result = isPrEvent({ eventKey: "project:modified" } as Event)
25+
expect(result).toBe(false)
26+
})
27+
})

src/server/webhooks/events/pr/event.ts

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { Event } from "../event.js"
12
import type { PRCommentAdded } from "./comment_added.js"
23
import type { PRCommentDeleted } from "./comment_deleted.js"
34
import type { PRCommentEdited } from "./comment_edited.js"
@@ -29,6 +30,10 @@ export type PrEvent =
2930
| PRReviewerUpdated
3031
export type PrEventKey = PrEvent["eventKey"]
3132

33+
export function isPrEvent(event: Event): event is PrEvent {
34+
return isPrEventKey(event.eventKey)
35+
}
36+
3237
export function isPrEventKey(key: unknown): key is PrEventKey {
3338
return Object.values<unknown>(prEventKeys).includes(key)
3439
}

src/server/webhooks/events/project/event.test.ts

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { describe, test } from "vitest"
2-
import { isProjectEventKey } from "./event.js"
2+
import type { Event } from "../event.js"
3+
import { isProjectEvent, isProjectEventKey } from "./event.js"
34

45
describe("isProjectEventKey", () => {
56
test("project:modified", ({ expect }) => {
@@ -12,3 +13,17 @@ describe("isProjectEventKey", () => {
1213
expect(result).toBe(false)
1314
})
1415
})
16+
17+
describe("isProjectEvent", () => {
18+
test("project:modified", ({ expect }) => {
19+
const result = isProjectEvent({ eventKey: "project:modified" } as Event)
20+
expect(result).toBe(true)
21+
})
22+
23+
test("mirror:repo_synchronized", ({ expect }) => {
24+
const result = isProjectEvent({
25+
eventKey: "mirror:repo_synchronized",
26+
} as Event)
27+
expect(result).toBe(false)
28+
})
29+
})

src/server/webhooks/events/project/event.ts

+5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1+
import type { Event } from "../event.js"
12
import type { ProjectModified } from "./modified.js"
23

34
/** You can create webhooks for events that occur in a project. */
45
export type ProjectEvent = ProjectModified
56
export type ProjectEventKey = ProjectEvent["eventKey"]
67

8+
export function isProjectEvent(event: Event): event is ProjectEvent {
9+
return isProjectEventKey(event.eventKey)
10+
}
11+
712
export function isProjectEventKey(key: unknown): key is ProjectEventKey {
813
return Object.values<unknown>(projectEventKeys).includes(key)
914
}

src/server/webhooks/events/repo/event.test.ts

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { describe, test } from "vitest"
2-
import { isRepoEventKey } from "./event.js"
2+
import type { Event } from "../event.js"
3+
import { isRepoEvent, isRepoEventKey } from "./event.js"
34

45
describe("isRepoEventKey", () => {
56
test("mirror:repo_synchronized", ({ expect }) => {
@@ -12,3 +13,16 @@ describe("isRepoEventKey", () => {
1213
expect(result).toBe(false)
1314
})
1415
})
16+
describe("isRepoEvent", () => {
17+
test("mirror:repo_synchronized", ({ expect }) => {
18+
const result = isRepoEvent({
19+
eventKey: "mirror:repo_synchronized",
20+
} as Event)
21+
expect(result).toBe(true)
22+
})
23+
24+
test("project:modified", ({ expect }) => {
25+
const result = isRepoEvent({ eventKey: "project:modified" } as Event)
26+
expect(result).toBe(false)
27+
})
28+
})

src/server/webhooks/events/repo/event.ts

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { Event } from "../event.js"
12
import type { RepoCommentAdded } from "./comment_added.js"
23
import type { RepoCommentDeleted } from "./comment_deleted.js"
34
import type { RepoCommentEdited } from "./comment_edited.js"
@@ -19,6 +20,10 @@ export type RepoEvent =
1920
| RepoSecretDetected
2021
export type RepoEventKey = RepoEvent["eventKey"]
2122

23+
export function isRepoEvent(event: Event): event is RepoEvent {
24+
return isRepoEventKey(event.eventKey)
25+
}
26+
2227
export function isRepoEventKey(key: unknown): key is RepoEventKey {
2328
return Object.values<unknown>(repoEventKeys).includes(key)
2429
}

0 commit comments

Comments
 (0)