Skip to content

Commit 9f91213

Browse files
authored
✨ Add type guards for eventKey (#5)
* ✨ Add type guards for eventKey * ♻️ Refactor import statements in event.ts * ♻️ Refactor event test files to use describe and test functions
1 parent 877b14e commit 9f91213

File tree

7 files changed

+108
-28
lines changed

7 files changed

+108
-28
lines changed

src/server/webhooks/events/event.ts

+15-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import type { PrEvent } from "./pr/event.js"
2+
import { prEventKeys } from "./pr/event.js"
23
import type { ProjectEvent } from "./project/event.js"
4+
import { projectEventKeys } from "./project/event.js"
35
import type { RepoEvent } from "./repo/event.js"
6+
import { repoEventKeys } from "./repo/event.js"
47

58
/**
69
* When you have a webhook with an event, Bitbucket Data Center sends the event
@@ -17,8 +20,16 @@ import type { RepoEvent } from "./repo/event.js"
1720
* event's user.
1821
*/
1922
export type Event = PrEvent | ProjectEvent | RepoEvent
23+
export type EventKey = Event["eventKey"]
2024

21-
export type EventKey =
22-
| PrEvent["eventKey"]
23-
| ProjectEvent["eventKey"]
24-
| RepoEvent["eventKey"]
25+
export function isEventKey(key: unknown): key is EventKey {
26+
return Object.values<unknown>(eventKeys).includes(key)
27+
}
28+
29+
const eventKeys = {
30+
...prEventKeys,
31+
...projectEventKeys,
32+
...repoEventKeys,
33+
} as const
34+
35+
eventKeys satisfies Record<EventKey, EventKey>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { describe, test } from "vitest"
2+
import { isPrEventKey } from "./event.js"
3+
4+
describe("isPrEventKey", () => {
5+
test("pr:comment:added", ({ expect }) => {
6+
const result = isPrEventKey("pr:comment:added")
7+
expect(result).toBe(true)
8+
})
9+
10+
test("project:modified", ({ expect }) => {
11+
const result = isPrEventKey("project:modified")
12+
expect(result).toBe(false)
13+
})
14+
})

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>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { describe, test } from "vitest"
2+
import { isProjectEventKey } from "./event.js"
3+
4+
describe("isProjectEventKey", () => {
5+
test("project:modified", ({ expect }) => {
6+
const result = isProjectEventKey("project:modified")
7+
expect(result).toBe(true)
8+
})
9+
10+
test("mirror:repo_synchronized", ({ expect }) => {
11+
const result = isProjectEventKey("mirror:repo_synchronized")
12+
expect(result).toBe(false)
13+
})
14+
})

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>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { describe, test } from "vitest"
2+
import { isRepoEventKey } from "./event.js"
3+
4+
describe("isRepoEventKey", () => {
5+
test("mirror:repo_synchronized", ({ expect }) => {
6+
const result = isRepoEventKey("mirror:repo_synchronized")
7+
expect(result).toBe(true)
8+
})
9+
10+
test("project:modified", ({ expect }) => {
11+
const result = isRepoEventKey("project:modified")
12+
expect(result).toBe(false)
13+
})
14+
})

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)