import { expectAssignable, expectNotAssignable, expectType } from 'tsd' import type { WebhookPayload, WebhookEvent, WebhookEventPayloadMap, BotCommandData } from './index' import type { Message, MessageRelationships } from '../apis/messages' import type { Ticket, TicketRelationships } from '../apis/tickets' // ── WebhookPayload (generic) ───────────────────────────────────────────────── // unparameterised — event can be any WebhookEvent expectAssignable('message.created' as WebhookEvent) // narrowed to a specific event declare const msgPayload: WebhookPayload<'message.created'> expectType<'message.created'>(msgPayload.event) expectType(msgPayload.data) expectAssignable<{ webhookId: string; timestamp: string }>(msgPayload) // ── data is stripped of relationships ──────────────────────────────────────── // message payload must NOT have relationship keys expectNotAssignable['data']>( {} as Pick, ) // ticket payload must NOT have relationship keys expectNotAssignable['data']>( {} as Pick, ) // ── event narrowing tightens data type ─────────────────────────────────────── declare const ticketPayload: WebhookPayload<'ticket.created'> expectType(ticketPayload.data) // ── bot.command uses BotCommandData ───────────────────────────────────────── declare const botPayload: WebhookPayload<'bot.command'> expectType(botPayload.data) expectAssignable<{ id: string; command: string }>(botPayload.data) // ── invalid events are rejected ────────────────────────────────────────────── expectNotAssignable('message.deleted') expectNotAssignable('unknown.event')