diff --git a/.changeset/thirty-tomatoes-brush.md b/.changeset/thirty-tomatoes-brush.md new file mode 100644 index 00000000000..a59a7027b5b --- /dev/null +++ b/.changeset/thirty-tomatoes-brush.md @@ -0,0 +1,23 @@ +--- +'@clerk/tanstack-start': minor +'@clerk/react-router': minor +'@clerk/backend': minor +'@clerk/nextjs': minor +'@clerk/astro': minor +'@clerk/remix': minor +'@clerk/express': minor +'@clerk/fastify': minor +'@clerk/nuxt': minor +--- + +Introduces `WebhookEventPayload`, a utility type that allows to infer webhook payloads based on event types. + +Usage: +```ts +type UserCreatedPayload = WebhookEventPayload<"user.created">; +// ^? { +// object: "event"; +// data: UserJSON; +// type: "user.created"; +// } +``` diff --git a/packages/astro/src/server/index.ts b/packages/astro/src/server/index.ts index cef1456a20e..bf1ed51ac6b 100644 --- a/packages/astro/src/server/index.ts +++ b/packages/astro/src/server/index.ts @@ -10,6 +10,7 @@ export type { OrganizationMembershipRole, // Webhook event types WebhookEvent, + WebhookEventPayload, WebhookEventType, // Resources AllowlistIdentifier, diff --git a/packages/backend/src/api/resources/Webhooks.ts b/packages/backend/src/api/resources/Webhooks.ts index ea0c0e6be97..711647468b5 100644 --- a/packages/backend/src/api/resources/Webhooks.ts +++ b/packages/backend/src/api/resources/Webhooks.ts @@ -64,4 +64,14 @@ export type WebhookEvent = | RoleWebhookEvent | PermissionWebhookEvent; +export type WebhookEventPayload = WebhookEvent extends infer U + ? U extends { type: infer K } + ? T extends K + ? Simplify & { type: T }> + : never + : never + : never; + export type WebhookEventType = WebhookEvent['type']; + +type Simplify = { [KeyType in keyof T]: T[KeyType] } & {}; diff --git a/packages/backend/src/api/resources/index.ts b/packages/backend/src/api/resources/index.ts index eb99325ca7f..94f02fe90b0 100644 --- a/packages/backend/src/api/resources/index.ts +++ b/packages/backend/src/api/resources/index.ts @@ -47,6 +47,7 @@ export type { SMSWebhookEvent, UserWebhookEvent, WebhookEvent, + WebhookEventPayload, WebhookEventType, } from './Webhooks'; diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index f772e66bdc9..4f28f8943c9 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -127,6 +127,7 @@ export type { SMSWebhookEvent, UserWebhookEvent, WebhookEvent, + WebhookEventPayload, WebhookEventType, } from './api/resources/Webhooks'; diff --git a/packages/nextjs/src/server/index.ts b/packages/nextjs/src/server/index.ts index 1d4e3482a29..a6a7906382a 100644 --- a/packages/nextjs/src/server/index.ts +++ b/packages/nextjs/src/server/index.ts @@ -21,6 +21,7 @@ export type { SMSMessageJSON, UserJSON, WebhookEvent, + WebhookEventPayload, WebhookEventType, UserWebhookEvent, EmailWebhookEvent, diff --git a/packages/react-router/src/ssr/index.ts b/packages/react-router/src/ssr/index.ts index fcd02aa9159..b9d79efe413 100644 --- a/packages/react-router/src/ssr/index.ts +++ b/packages/react-router/src/ssr/index.ts @@ -8,6 +8,7 @@ export type { OrganizationMembershipRole, // Webhook event types WebhookEvent, + WebhookEventPayload, WebhookEventType, // Resources AllowlistIdentifier, diff --git a/packages/remix/src/ssr/index.ts b/packages/remix/src/ssr/index.ts index fcd02aa9159..b9d79efe413 100644 --- a/packages/remix/src/ssr/index.ts +++ b/packages/remix/src/ssr/index.ts @@ -8,6 +8,7 @@ export type { OrganizationMembershipRole, // Webhook event types WebhookEvent, + WebhookEventPayload, WebhookEventType, // Resources AllowlistIdentifier, diff --git a/packages/tanstack-start/src/server/index.ts b/packages/tanstack-start/src/server/index.ts index 4a56c1e5c15..0eb9118a11f 100644 --- a/packages/tanstack-start/src/server/index.ts +++ b/packages/tanstack-start/src/server/index.ts @@ -10,6 +10,7 @@ export type { OrganizationMembershipRole, // Webhook event types WebhookEvent, + WebhookEventPayload, WebhookEventType, // Resources AllowlistIdentifier,