Skip to content
← Public packages

@kentcdodds/kit

Kit.com helpers for subscribers, tags, forms, sequences, and broadcasts.

src/named.d.ts

353 lines · 8.2 KB · TypeScript
/**
 * Named Kit.com helpers (HTML, broadcasts, subscribers, sequences, constants).
 * Prefer focused paths when one exists; root `.` is draft-only createBroadcastDraft.
 */
export const KIT_API_BASE_URL: string
export const KIT_SECRET_NAME: string

export const KIT_TEMPLATES: {
	textOnly: number
	epePodcast: number
	betterWithKent: number
}

export const KIT_MUTE_TAGS: {
	betterWithKentYoutube: number
}

export const BWK_YOUTUBE_BROADCAST_DEFAULTS: {
	email_address: string
	email_template_id: number
	public: boolean
	subscriber_filter: Array<{
		none: Array<{ type: 'tag'; ids: number[] }>
	}>
}

export const EPE_SEQUENCE_ID: number

export class KitApiError extends Error {
	status?: number
	body?: unknown
	method?: string
	path?: string
}

export function parseOkJson(
	response: Response,
	meta?: { method?: string; path?: string },
): Promise<unknown>

export function callParsed(
	fn: (input?: Record<string, unknown>, options?: { fetchImpl?: typeof fetch }) => Promise<Response>,
	input?: Record<string, unknown>,
	meta?: { method?: string; path?: string },
): Promise<unknown>

export function listAll(
	fn: (input?: Record<string, unknown>) => Promise<Response>,
	itemKey: string,
	query?: Record<string, string | number | boolean | null | undefined>,
	options?: { maxItems?: number },
): Promise<unknown[]>

export type KitQuery = Record<string, string | number | boolean | null | undefined>

export type BroadcastSummary = {
	id: number
	subject?: string
	status?: string
	editUrl: string
}

export type SubscriberFilterClause = {
	none?: Array<{ type: 'tag' | string; ids: number[] }>
	any?: Array<{ type: 'tag' | string; ids: number[] }>
	all?: Array<{ type: 'tag' | string; ids: number[] }>
}

export type BroadcastDraftInput = {
	/** Required email subject. */
	subject: string
	/** Required HTML body. */
	content: string
	preview_text?: string
	description?: string
	thumbnail_url?: string
	thumbnail_alt?: string
	email_address?: string
	email_template_id?: number
	public?: boolean
	send_at?: string | null
	subscriber_filter?: SubscriberFilterClause[]
}

export type BroadcastDetail = BroadcastSummary & {
	preview_text?: unknown
	description?: unknown
	content?: unknown
	thumbnail_url?: unknown
	thumbnail_alt?: unknown
	email_address?: unknown
	email_template?: unknown
	public?: unknown
	send_at?: unknown
	subscriber_filter?: unknown
	public_url?: unknown
}

export type SequenceEmailSummary = {
	id: number
	sequenceId?: number
	subject?: string
	published?: boolean
}

export type SequenceCreateInput = {
	name: string
	email_address?: string
	email_template_id?: number
	active?: boolean
	repeat?: boolean
}

export type SequenceEmailCreateInput = {
	subject: string
	content?: string
	published?: boolean
}

export type FormSummary = {
	id?: number
	name?: string
	created_at?: string
	[key: string]: unknown
}

export type SegmentSummary = {
	id?: number
	name?: string
	[key: string]: unknown
}

export type SequenceSummary = {
	id?: number
	name?: string
	active?: boolean
	email_address?: string
	[key: string]: unknown
}

export function broadcastSummary(
	broadcast: { id?: number; subject?: string; status?: string } | null | undefined,
): BroadcastSummary | null

export function sequenceEmailSummary(
	email:
		| {
				id?: number
				sequence_id?: number
				subject?: string
				published?: boolean
		  }
		| null
		| undefined,
): SequenceEmailSummary | null

export function getCurrentAccount(query?: KitQuery): Promise<unknown>

export function getAccountEmailStats(query?: KitQuery): Promise<unknown>

export function getAccountGrowthStats(query?: KitQuery): Promise<unknown>

export function getBroadcastStats(
	broadcastId: number | string,
	query?: KitQuery,
): Promise<unknown>

export function getBroadcastsStats(query?: KitQuery): Promise<unknown>

export function listSequences(
	query?: KitQuery & { maxItems?: number },
): Promise<SequenceSummary[]>

export function getSequence(
	id: number | string,
	query?: KitQuery,
): Promise<unknown>

export function listSequenceEmails(
	sequenceId: number | string,
	query?: KitQuery & { maxItems?: number },
): Promise<unknown[]>

export function buildLiquidGreeting(options: {
	withName: string
	withoutName: string
}): string

export function buildParagraph(html: string): string

export function buildLinkedImage(options: {
	href: string
	src: string
	alt?: string
}): string

export function buildWorkshopImageBlock(options: {
	href: string
	src: string
	alt?: string
	caption?: string
}): string

export function buildUnorderedList(items: string[]): string

export function joinEmailBlocks(
	blocks: string[],
	options?: { separator?: string },
): string

export function createBroadcastDraft(
	input: BroadcastDraftInput,
): Promise<BroadcastDetail>

export function createBwkYoutubeBroadcastDraft(
	input: BroadcastDraftInput,
): Promise<BroadcastDetail>

export function updateBroadcast(
	id: number,
	input: Partial<BroadcastDraftInput> & Record<string, unknown>,
): Promise<BroadcastDetail>

export function getBroadcast(id: number): Promise<BroadcastDetail>

export function listBroadcasts(query?: {
	status?: string
	per_page?: number
	maxItems?: number
}): Promise<BroadcastSummary[]>

export function deleteBroadcast(id: number): Promise<BroadcastSummary>

export type SubscriberSummary = {
	id: number
	email_address?: string
	first_name?: string
	state?: string
	created_at?: string
	fields?: Record<string, unknown>
}

export function subscriberSummary(
	subscriber: Record<string, unknown> | null | undefined,
): SubscriberSummary | null

export function createSubscriber(input: {
	email_address: string
	first_name?: string
	state?: string
	fields?: Record<string, string>
}): Promise<SubscriberSummary>

export function getSubscriber(id: number | string): Promise<SubscriberSummary>

export function getSubscriberByEmail(
	emailAddress: string,
): Promise<SubscriberSummary | null>

export function updateSubscriber(
	id: number | string,
	fields: Record<string, unknown>,
): Promise<SubscriberSummary>

export function unsubscribeSubscriber(
	id: number | string,
): Promise<{ id: number | string; unsubscribed: true }>

export function listSubscribers(
	query?: KitQuery & { maxItems?: number },
): Promise<SubscriberSummary[]>

export function listSubscriberTags(
	subscriberId: number | string,
): Promise<Array<{ id: number; name: string }>>

export function listTags(query?: {
	maxItems?: number
}): Promise<Array<{ id: number; name: string }>>

export function createTag(name: string): Promise<{ id: number; name: string }>

export function ensureTag(name: string): Promise<{ id: number; name: string }>

export function tagSubscriberByEmail(
	tagId: number | string,
	emailAddress: string,
): Promise<SubscriberSummary | null>

export function untagSubscriber(
	tagId: number | string,
	subscriberId: number | string,
): Promise<{ tagId: number | string; subscriberId: number | string; untagged: true }>

export function listTagSubscribers(
	tagId: number | string,
	query?: KitQuery & { maxItems?: number },
): Promise<SubscriberSummary[]>

export function subscribeAndTag(input: {
	email_address: string
	first_name?: string
	fields?: Record<string, string>
	tagName?: string
	tagId?: number | string
}): Promise<{
	subscriber: SubscriberSummary
	tag: { id: number; name?: string }
}>

export function listForms(
	query?: KitQuery & { maxItems?: number },
): Promise<FormSummary[]>

export function addSubscriberToForm(
	formId: number | string,
	emailAddress: string,
	options?: { referrer?: string },
): Promise<SubscriberSummary | null>

export function listSegments(query?: {
	maxItems?: number
}): Promise<SegmentSummary[]>

export function createSequence(
	input: SequenceCreateInput,
): Promise<SequenceSummary>

export function createSequenceEmail(
	sequenceId: number | string,
	input: SequenceEmailCreateInput,
): Promise<unknown>

export function addSubscriberToSequence(
	sequenceId: number | string,
	emailAddress: string,
): Promise<SubscriberSummary | null>

export function getSequenceEmail(
	sequenceId: number,
	emailId: number,
): Promise<unknown>

export function updateSequenceEmail(
	sequenceId: number,
	emailId: number,
	fields: Partial<SequenceEmailCreateInput> & Record<string, unknown>,
): Promise<unknown>

export function publishSequenceEmail(
	sequenceId: number,
	emailId: number,
): Promise<unknown>