UNPKG

@inboundemail/sdk

Version:

Official SDK for Inbound Email API

1 lines 22.2 kB
{"version":3,"sources":["../src/utils.ts","../src/client.ts","../src/webhook-types.ts","../src/index.ts"],"sourcesContent":["/**\n * Utility functions for the Inbound Email SDK\n */\n\n/**\n * Check if a string is a valid email address\n */\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\n/**\n * Build query string from parameters\n */\nexport function buildQueryString(params: Record<string, any>): string {\n const searchParams = new URLSearchParams()\n \n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value))\n }\n })\n \n const queryString = searchParams.toString()\n return queryString ? `?${queryString}` : ''\n} ","/**\n * Main client class for the Inbound Email SDK\n */\n\nimport type { \n // Mail API\n GetMailRequest, GetMailResponse, PostMailRequest, PostMailResponse, GetMailByIdResponse,\n // Endpoints API \n GetEndpointsRequest, GetEndpointsResponse, PostEndpointsRequest, PostEndpointsResponse,\n GetEndpointByIdResponse, PutEndpointByIdRequest, PutEndpointByIdResponse, DeleteEndpointByIdResponse,\n // Domains API\n GetDomainsRequest, GetDomainsResponse, PostDomainsRequest, PostDomainsResponse,\n GetDomainByIdResponse, PutDomainByIdRequest, PutDomainByIdResponse,\n // Email Addresses API\n GetEmailAddressesRequest, GetEmailAddressesResponse, PostEmailAddressesRequest, PostEmailAddressesResponse,\n GetEmailAddressByIdResponse, PutEmailAddressByIdRequest, PutEmailAddressByIdResponse, DeleteEmailAddressByIdResponse,\n // Emails API (sending)\n PostEmailsRequest, PostEmailsResponse, GetEmailByIdResponse,\n // Reply API\n PostEmailReplyRequest, PostEmailReplyResponse\n} from './types'\nimport type { InboundWebhookEmail } from './webhook-types'\nimport { buildQueryString } from './utils'\n\nexport class InboundEmailClient {\n private readonly apiKey: string\n private readonly baseUrl: string\n\n constructor(apiKey: string, baseUrl?: string) {\n this.apiKey = apiKey\n this.baseUrl = baseUrl || 'https://inbound.new/api/v2'\n \n if (!this.apiKey) {\n throw new Error('API key is required')\n }\n }\n\n /**\n * Make an authenticated request to the API\n */\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`\n \n const headers = {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n /**\n * Mail API - for managing received emails\n */\n mail = {\n /**\n * List all emails in the mailbox\n */\n list: async (params?: GetMailRequest): Promise<GetMailResponse> => {\n const queryString = params ? buildQueryString(params) : ''\n return this.request<GetMailResponse>(`/mail${queryString}`)\n },\n\n /**\n * Get a specific email by ID\n */\n get: async (id: string): Promise<GetMailByIdResponse> => {\n return this.request<GetMailByIdResponse>(`/mail/${id}`)\n },\n\n /**\n * Reply to an email\n */\n reply: async (params: PostMailRequest): Promise<PostMailResponse> => {\n return this.request<PostMailResponse>('/mail', {\n method: 'POST',\n body: JSON.stringify(params),\n })\n },\n }\n\n /**\n * Endpoints API - for managing webhook and email endpoints\n */\n endpoints = {\n /**\n * List all endpoints\n */\n list: async (params?: GetEndpointsRequest): Promise<GetEndpointsResponse> => {\n const queryString = params ? buildQueryString(params) : ''\n return this.request<GetEndpointsResponse>(`/endpoints${queryString}`)\n },\n\n /**\n * Create a new endpoint\n */\n create: async (params: PostEndpointsRequest): Promise<PostEndpointsResponse> => {\n return this.request<PostEndpointsResponse>('/endpoints', {\n method: 'POST',\n body: JSON.stringify(params),\n })\n },\n\n /**\n * Get a specific endpoint by ID\n */\n get: async (id: string): Promise<GetEndpointByIdResponse> => {\n return this.request<GetEndpointByIdResponse>(`/endpoints/${id}`)\n },\n\n /**\n * Update an endpoint\n */\n update: async (id: string, params: PutEndpointByIdRequest): Promise<PutEndpointByIdResponse> => {\n return this.request<PutEndpointByIdResponse>(`/endpoints/${id}`, {\n method: 'PUT',\n body: JSON.stringify(params),\n })\n },\n\n /**\n * Delete an endpoint\n */\n delete: async (id: string): Promise<DeleteEndpointByIdResponse> => {\n return this.request<DeleteEndpointByIdResponse>(`/endpoints/${id}`, {\n method: 'DELETE',\n })\n },\n }\n\n /**\n * Domains API - for managing email domains\n */\n domains = {\n /**\n * List all domains\n */\n list: async (params?: GetDomainsRequest): Promise<GetDomainsResponse> => {\n const queryString = params ? buildQueryString(params) : ''\n return this.request<GetDomainsResponse>(`/domains${queryString}`)\n },\n\n /**\n * Create a new domain\n */\n create: async (params: PostDomainsRequest): Promise<PostDomainsResponse> => {\n return this.request<PostDomainsResponse>('/domains', {\n method: 'POST',\n body: JSON.stringify(params),\n })\n },\n\n /**\n * Get a specific domain by ID\n */\n get: async (id: string): Promise<GetDomainByIdResponse> => {\n return this.request<GetDomainByIdResponse>(`/domains/${id}`)\n },\n\n /**\n * Update domain settings (catch-all configuration)\n */\n update: async (id: string, params: PutDomainByIdRequest): Promise<PutDomainByIdResponse> => {\n return this.request<PutDomainByIdResponse>(`/domains/${id}`, {\n method: 'PUT',\n body: JSON.stringify(params),\n })\n },\n }\n\n /**\n * Email Addresses API - for managing individual email addresses\n */\n emailAddresses = {\n /**\n * List all email addresses\n */\n list: async (params?: GetEmailAddressesRequest): Promise<GetEmailAddressesResponse> => {\n const queryString = params ? buildQueryString(params) : ''\n return this.request<GetEmailAddressesResponse>(`/email-addresses${queryString}`)\n },\n\n /**\n * Create a new email address\n */\n create: async (params: PostEmailAddressesRequest): Promise<PostEmailAddressesResponse> => {\n return this.request<PostEmailAddressesResponse>('/email-addresses', {\n method: 'POST',\n body: JSON.stringify(params),\n })\n },\n\n /**\n * Get a specific email address by ID\n */\n get: async (id: string): Promise<GetEmailAddressByIdResponse> => {\n return this.request<GetEmailAddressByIdResponse>(`/email-addresses/${id}`)\n },\n\n /**\n * Update an email address\n */\n update: async (id: string, params: PutEmailAddressByIdRequest): Promise<PutEmailAddressByIdResponse> => {\n return this.request<PutEmailAddressByIdResponse>(`/email-addresses/${id}`, {\n method: 'PUT',\n body: JSON.stringify(params),\n })\n },\n\n /**\n * Delete an email address\n */\n delete: async (id: string): Promise<DeleteEmailAddressByIdResponse> => {\n return this.request<DeleteEmailAddressByIdResponse>(`/email-addresses/${id}`, {\n method: 'DELETE',\n })\n },\n }\n\n /**\n * Emails API - for sending emails (Resend-compatible)\n */\n emails = {\n /**\n * Send an email\n */\n send: async (params: PostEmailsRequest): Promise<PostEmailsResponse> => {\n return this.request<PostEmailsResponse>('/emails', {\n method: 'POST',\n body: JSON.stringify(params),\n })\n },\n\n /**\n * Get a sent email by ID\n */\n get: async (id: string): Promise<GetEmailByIdResponse> => {\n return this.request<GetEmailByIdResponse>(`/emails/${id}`)\n },\n\n /**\n * Reply to an email by ID\n */\n reply: async (id: string, params: PostEmailReplyRequest): Promise<PostEmailReplyResponse> => {\n return this.request<PostEmailReplyResponse>(`/emails/${id}/reply`, {\n method: 'POST',\n body: JSON.stringify(params),\n })\n },\n }\n\n /**\n * Legacy send method for backwards compatibility (similar to Resend)\n */\n send = async (params: PostEmailsRequest): Promise<PostEmailsResponse> => {\n return this.emails.send(params)\n }\n\n /**\n * Streamlined reply method for webhook handlers\n * Works directly with webhook email objects for better DX\n * \n * Usage:\n * - inbound.reply(\"email-id\", { from: \"support@domain.com\", text: \"Thanks!\" })\n * - inbound.reply(email, { from: \"support@domain.com\", text: \"Thanks!\" })\n */\n reply = async (\n emailOrId: InboundWebhookEmail | string,\n replyParams: PostEmailReplyRequest\n ): Promise<PostEmailReplyResponse> => {\n // Determine email ID\n const emailId = typeof emailOrId === 'string' ? emailOrId : emailOrId.id\n\n // Validate that we have a from address\n if (!replyParams.from) {\n throw new Error('Reply requires a \"from\" address.')\n }\n\n return this.emails.reply(emailId, replyParams)\n }\n\n // Convenience aliases for better developer experience\n endpoint = this.endpoints\n domain = this.domains\n emailAddress = this.emailAddresses\n email = this.emails\n} ","/**\n * TypeScript types for Inbound Email webhook payloads\n * Use these types to add type safety to your webhook handlers\n */\n\n// Base email address structure\nexport interface InboundEmailAddress {\n text: string\n addresses: Array<{\n name: string | null\n address: string | null\n }>\n}\n\n// Email attachment structure\nexport interface InboundEmailAttachment {\n filename: string | undefined\n contentType: string | undefined\n size: number | undefined\n contentId: string | undefined\n contentDisposition: string | undefined\n}\n\n// Email headers structure with common headers typed\nexport interface InboundEmailHeaders extends Record<string, any> {\n 'return-path'?: {\n value?: Array<{ address: string; name: string }> | string\n html?: string\n text?: string\n params?: Record<string, string>\n }\n 'received'?: string | string[]\n 'received-spf'?: string\n 'authentication-results'?: string\n 'x-ses-receipt'?: string\n 'x-ses-dkim-signature'?: string\n 'dkim-signature'?: Array<{\n value: string\n params: Record<string, string>\n }> | {\n value?: Array<{ address: string; name: string }> | string\n html?: string\n text?: string\n params?: Record<string, string>\n }\n 'list'?: {\n unsubscribe?: { url: string }\n 'unsubscribe-post'?: { name: string }\n }\n 'x-entity-ref-id'?: string\n 'from'?: {\n value?: Array<{ address: string; name: string }> | string\n html?: string\n text?: string\n params?: Record<string, string>\n }\n 'to'?: {\n value?: Array<{ address: string; name: string }> | string\n html?: string\n text?: string\n params?: Record<string, string>\n }\n 'subject'?: string\n 'message-id'?: string\n 'date'?: string\n 'mime-version'?: string\n 'content-type'?: {\n value: string\n params: Record<string, string>\n }\n 'feedback-id'?: string\n 'x-ses-outgoing'?: string\n}\n\n// Complete parsed email data structure\nexport interface InboundParsedEmailData {\n messageId: string | undefined\n date: Date | undefined\n subject: string | undefined\n from: InboundEmailAddress | null\n to: InboundEmailAddress | null\n cc: InboundEmailAddress | null\n bcc: InboundEmailAddress | null\n replyTo: InboundEmailAddress | null\n inReplyTo: string | undefined\n references: string[] | undefined\n textBody: string | undefined\n htmlBody: string | undefined\n raw?: string\n attachments: InboundEmailAttachment[]\n headers: InboundEmailHeaders\n priority: string | false | undefined\n}\n\n// Email data structure in webhook\nexport interface InboundWebhookEmail {\n id: string // Structured email ID (compatible with v2 API reply endpoint)\n messageId: string | null\n from: InboundEmailAddress | null\n to: InboundEmailAddress | null\n recipient: string\n subject: string | null\n receivedAt: Date | string\n \n // Full parsed email data structure\n parsedData: InboundParsedEmailData\n \n // Cleaned content for backward compatibility\n cleanedContent: {\n html: string | null\n text: string | null\n hasHtml: boolean\n hasText: boolean\n attachments: InboundEmailAttachment[]\n headers: InboundEmailHeaders\n }\n}\n\n// Endpoint information in webhook\nexport interface InboundWebhookEndpoint {\n id: string\n name: string\n type: 'webhook' | 'email' | 'email_group'\n}\n\n// Main webhook payload structure\nexport interface InboundWebhookPayload {\n event: 'email.received'\n timestamp: string\n email: InboundWebhookEmail\n endpoint: InboundWebhookEndpoint\n}\n\n// Webhook headers that Inbound sends with each webhook request\nexport interface InboundWebhookHeaders {\n 'content-type': 'application/json'\n 'user-agent': 'InboundEmail-Webhook/1.0'\n 'x-webhook-event': 'email.received'\n 'x-endpoint-id': string\n 'x-webhook-timestamp': string\n 'x-email-id': string\n 'x-message-id': string\n [key: string]: string // Allow for custom headers configured in endpoint\n}\n\n// Complete webhook request structure for server frameworks\nexport interface InboundWebhookRequest {\n method: 'POST'\n headers: InboundWebhookHeaders\n body: InboundWebhookPayload\n}\n\n// Type guard to check if a request is an Inbound webhook\nexport function isInboundWebhook(payload: any): payload is InboundWebhookPayload {\n return (\n payload &&\n typeof payload === 'object' &&\n payload.event === 'email.received' &&\n typeof payload.timestamp === 'string' &&\n payload.email &&\n typeof payload.email === 'object' &&\n typeof payload.email.id === 'string' &&\n payload.endpoint &&\n typeof payload.endpoint === 'object' &&\n typeof payload.endpoint.id === 'string'\n )\n}\n\n// Utility type for extracting just the email content\nexport type InboundEmailContent = Pick<InboundWebhookEmail, 'subject' | 'parsedData' | 'cleanedContent'>\n\n// Utility type for extracting just attachment information\nexport type InboundAttachmentInfo = InboundEmailAttachment & {\n hasContent: boolean\n isImage: boolean\n isDocument: boolean\n}\n\n// Helper function to get attachment info with additional metadata\nexport function getAttachmentInfo(attachment: InboundEmailAttachment): InboundAttachmentInfo {\n const contentType = attachment.contentType?.toLowerCase() || ''\n \n return {\n ...attachment,\n hasContent: !!attachment.size && attachment.size > 0,\n isImage: contentType.startsWith('image/'),\n isDocument: contentType.includes('pdf') || \n contentType.includes('document') || \n contentType.includes('text/') ||\n contentType.includes('application/msword') ||\n contentType.includes('application/vnd.openxmlformats')\n }\n}\n\n// Helper function to extract plain text from email\nexport function getEmailText(email: InboundWebhookEmail): string {\n return email.cleanedContent.text || \n email.parsedData.textBody || \n (email.cleanedContent.html ? email.cleanedContent.html.replace(/<[^>]*>/g, '') : '') ||\n ''\n}\n\n// Helper function to extract HTML from email\nexport function getEmailHtml(email: InboundWebhookEmail): string {\n return email.cleanedContent.html || \n email.parsedData.htmlBody || \n (email.cleanedContent.text ? email.cleanedContent.text.replace(/\\n/g, '<br>') : '') ||\n ''\n}\n\n// Helper function to get sender information\nexport function getSenderInfo(email: InboundWebhookEmail): { name: string | null; address: string | null } {\n const from = email.from || email.parsedData.from\n if (!from || !from.addresses || from.addresses.length === 0) {\n return { name: null, address: null }\n }\n \n const firstAddress = from.addresses[0]\n return {\n name: firstAddress.name,\n address: firstAddress.address\n }\n}\n\n// Helper function to get all recipient addresses\nexport function getRecipientAddresses(email: InboundWebhookEmail): string[] {\n const to = email.to || email.parsedData.to\n if (!to || !to.addresses) {\n return [email.recipient] // Fallback to the main recipient\n }\n \n return to.addresses\n .map(addr => addr.address)\n .filter((addr): addr is string => addr !== null)\n}","/**\n * @inboundemail/sdk\n * Official SDK for Inbound Email API\n * Version 3.0.0\n */\n\n// Main SDK client\nexport { InboundEmailClient } from './client'\nexport { InboundEmailClient as Inbound } from './client'\n// Removed InboundEmailConfigExtended as part of v3.0.0 refactor\n\n// Type definitions\nexport * from './types'\n\n// Webhook types for incoming requests\nexport * from './webhook-types'\n\n// Utilities\nexport * from './utils'\n\n// Version\nexport const VERSION = '3.0.0'\n\n// Default export for convenience\nexport { InboundEmailClient as default } from './client' "],"mappings":"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","names":["isValidEmail","email","buildQueryString","params","searchParams","key","value","queryString","InboundEmailClient","apiKey","baseUrl","params","queryString","buildQueryString","id","emailOrId","replyParams","emailId","endpoint","options","url","headers","response","errorData","isInboundWebhook","payload","getAttachmentInfo","attachment","contentType","getEmailText","email","getEmailHtml","getSenderInfo","from","firstAddress","getRecipientAddresses","to","addr","VERSION"]}