Skip to content

Commit 720fa4b

Browse files
committed
✨ Add type guards for eventKey
1 parent 877b14e commit 720fa4b

File tree

7 files changed

+87
-31
lines changed

7 files changed

+87
-31
lines changed

Diff for: src/server/webhooks/events/event.ts

+15-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import type { PrEvent } from "./pr/event.js"
2-
import type { ProjectEvent } from "./project/event.js"
3-
import type { RepoEvent } from "./repo/event.js"
1+
import { prEventKeys, type PrEvent } from "./pr/event.js"
2+
import { projectEventKeys, type ProjectEvent } from "./project/event.js"
3+
import { repoEventKeys, type RepoEvent } from "./repo/event.js"
44

55
/**
66
* When you have a webhook with an event, Bitbucket Data Center sends the event
@@ -17,8 +17,16 @@ import type { RepoEvent } from "./repo/event.js"
1717
* event's user.
1818
*/
1919
export type Event = PrEvent | ProjectEvent | RepoEvent
20+
export type EventKey = Event["eventKey"]
2021

21-
export type EventKey =
22-
| PrEvent["eventKey"]
23-
| ProjectEvent["eventKey"]
24-
| RepoEvent["eventKey"]
22+
export function isEventKey(key: unknown): key is EventKey {
23+
return Object.values<unknown>(eventKeys).includes(key)
24+
}
25+
26+
const eventKeys = {
27+
...prEventKeys,
28+
...projectEventKeys,
29+
...repoEventKeys,
30+
} as const
31+
32+
eventKeys satisfies Record<EventKey, EventKey>

Diff for: src/server/webhooks/events/pr/event.test.ts

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { test } from "vitest"
2+
import { isPrEventKey } from "./event.js"
3+
4+
test("isPrEventKey", ({ expect }) => {
5+
const result = isPrEventKey("pr:comment:added")
6+
expect(result).toBe(true)
7+
})

Diff for: src/server/webhooks/events/pr/event.ts

+22-14
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,26 @@ export type PrEvent =
2727
| PRReviewerChangesRequested
2828
| PRReviewerUnapproved
2929
| PRReviewerUpdated
30+
export type PrEventKey = PrEvent["eventKey"]
3031

31-
export type PrEventKey =
32-
| PRCommentAdded["eventKey"]
33-
| PRCommentDeleted["eventKey"]
34-
| PRCommentEdited["eventKey"]
35-
| PRDeclined["eventKey"]
36-
| PRDeleted["eventKey"]
37-
| PRFromRefUpdated["eventKey"]
38-
| PRMerged["eventKey"]
39-
| PRModified["eventKey"]
40-
| PROpened["eventKey"]
41-
| PRReviewerApproved["eventKey"]
42-
| PRReviewerChangesRequested["eventKey"]
43-
| PRReviewerUnapproved["eventKey"]
44-
| PRReviewerUpdated["eventKey"]
32+
export function isPrEventKey(key: unknown): key is PrEventKey {
33+
return Object.values<unknown>(prEventKeys).includes(key)
34+
}
35+
36+
export const prEventKeys = {
37+
"pr:comment:added": "pr:comment:added",
38+
"pr:comment:deleted": "pr:comment:deleted",
39+
"pr:comment:edited": "pr:comment:edited",
40+
"pr:declined": "pr:declined",
41+
"pr:deleted": "pr:deleted",
42+
"pr:from_ref_updated": "pr:from_ref_updated",
43+
"pr:merged": "pr:merged",
44+
"pr:modified": "pr:modified",
45+
"pr:opened": "pr:opened",
46+
"pr:reviewer:approved": "pr:reviewer:approved",
47+
"pr:reviewer:changes_requested": "pr:reviewer:changes_requested",
48+
"pr:reviewer:unapproved": "pr:reviewer:unapproved",
49+
"pr:reviewer:updated": "pr:reviewer:updated",
50+
} as const
51+
52+
prEventKeys satisfies Record<PrEventKey, PrEventKey>

Diff for: src/server/webhooks/events/project/event.test.ts

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { test } from "vitest"
2+
import { isProjectEventKey } from "./event.js"
3+
4+
test("isProjectEventKey", ({ expect }) => {
5+
const result = isProjectEventKey("project:modified")
6+
expect(result).toBe(true)
7+
})

Diff for: src/server/webhooks/events/project/event.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,14 @@ import type { ProjectModified } from "./modified.js"
22

33
/** You can create webhooks for events that occur in a project. */
44
export type ProjectEvent = ProjectModified
5-
export type ProjectEventKey = ProjectModified["eventKey"]
5+
export type ProjectEventKey = ProjectEvent["eventKey"]
6+
7+
export function isProjectEventKey(key: unknown): key is ProjectEventKey {
8+
return Object.values<unknown>(projectEventKeys).includes(key)
9+
}
10+
11+
export const projectEventKeys = {
12+
"project:modified": "project:modified",
13+
} as const
14+
15+
projectEventKeys satisfies Record<ProjectEventKey, ProjectEventKey>

Diff for: src/server/webhooks/events/repo/event.test.ts

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { test } from "vitest"
2+
import { isRepoEventKey } from "./event.js"
3+
4+
test("isRepoEventKey", ({ expect }) => {
5+
const result = isRepoEventKey("mirror:repo_synchronized")
6+
expect(result).toBe(true)
7+
})

Diff for: src/server/webhooks/events/repo/event.ts

+18-9
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,21 @@ export type RepoEvent =
1717
| RepoModified
1818
| RepoRefsChanged
1919
| RepoSecretDetected
20-
export type RepoEventKey =
21-
| MirrorRepoSynchronized["eventKey"]
22-
| RepoCommentAdded["eventKey"]
23-
| RepoCommentDeleted["eventKey"]
24-
| RepoCommentEdited["eventKey"]
25-
| RepoForked["eventKey"]
26-
| RepoModified["eventKey"]
27-
| RepoRefsChanged["eventKey"]
28-
| RepoSecretDetected["eventKey"]
20+
export type RepoEventKey = RepoEvent["eventKey"]
21+
22+
export function isRepoEventKey(key: unknown): key is RepoEventKey {
23+
return Object.values<unknown>(repoEventKeys).includes(key)
24+
}
25+
26+
export const repoEventKeys = {
27+
"mirror:repo_synchronized": "mirror:repo_synchronized",
28+
"repo:comment:added": "repo:comment:added",
29+
"repo:comment:deleted": "repo:comment:deleted",
30+
"repo:comment:edited": "repo:comment:edited",
31+
"repo:forked": "repo:forked",
32+
"repo:modified": "repo:modified",
33+
"repo:refs_changed": "repo:refs_changed",
34+
"repo:secret_detected": "repo:secret_detected",
35+
} as const
36+
37+
repoEventKeys satisfies Record<RepoEventKey, RepoEventKey>

0 commit comments

Comments
 (0)