@topmail/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +640 -0
- package/dist/index.d.ts +640 -0
- package/dist/index.js +614 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +565 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts","../src/resources/contacts.ts","../src/resources/lists.ts","../src/resources/campaigns.ts","../src/resources/templates.ts","../src/resources/email.ts","../src/resources/suppressions.ts","../src/resources/webhooks.ts","../src/resources/tracking.ts","../src/resources/conversions.ts","../src/resources/segments.ts","../src/resources/tags.ts","../src/resources/automations.ts","../src/resources/domains.ts","../src/resources/health.ts"],"sourcesContent":["import { HttpClient } from './client';\nimport { Contacts } from './resources/contacts';\nimport { Lists } from './resources/lists';\nimport { Campaigns } from './resources/campaigns';\nimport { Templates } from './resources/templates';\nimport { Email } from './resources/email';\nimport { Suppressions } from './resources/suppressions';\nimport { Webhooks } from './resources/webhooks';\nimport { Tracking } from './resources/tracking';\nimport { Conversions } from './resources/conversions';\nimport { Segments } from './resources/segments';\nimport { Tags } from './resources/tags';\nimport { Automations } from './resources/automations';\nimport { Domains } from './resources/domains';\nimport { Health } from './resources/health';\n\nexport interface TopMailOptions {\n baseUrl?: string;\n}\n\nconst DEFAULT_BASE_URL = 'https://api.topmail.so/api';\n\nexport class TopMail {\n readonly contacts: Contacts;\n readonly lists: Lists;\n readonly campaigns: Campaigns;\n readonly templates: Templates;\n readonly email: Email;\n readonly suppressions: Suppressions;\n readonly webhooks: Webhooks;\n readonly tracking: Tracking;\n readonly conversions: Conversions;\n readonly segments: Segments;\n readonly tags: Tags;\n readonly automations: Automations;\n readonly domains: Domains;\n readonly health: Health;\n\n /**\n * True if the API key starts with `tm_test_`, indicating sandbox mode.\n */\n readonly isSandbox: boolean;\n\n constructor(apiKey: string, options?: TopMailOptions) {\n if (!apiKey) {\n throw new Error('API key is required');\n }\n\n this.isSandbox = apiKey.startsWith('tm_test_');\n\n const client = new HttpClient({\n baseUrl: options?.baseUrl ?? DEFAULT_BASE_URL,\n apiKey,\n });\n\n this.contacts = new Contacts(client);\n this.lists = new Lists(client);\n this.campaigns = new Campaigns(client);\n this.templates = new Templates(client);\n this.email = new Email(client);\n this.suppressions = new Suppressions(client);\n this.webhooks = new Webhooks(client);\n this.tracking = new Tracking(client);\n this.conversions = new Conversions(client);\n this.segments = new Segments(client);\n this.tags = new Tags(client);\n this.automations = new Automations(client);\n this.domains = new Domains(client);\n this.health = new Health(client);\n }\n}\n\n// Re-export everything\nexport { HttpClient } from './client';\nexport type { ClientOptions } from './client';\nexport * from './types';\nexport * from './errors';\nexport { Contacts } from './resources/contacts';\nexport { Lists } from './resources/lists';\nexport { Campaigns } from './resources/campaigns';\nexport { Templates } from './resources/templates';\nexport { Email } from './resources/email';\nexport { Suppressions } from './resources/suppressions';\nexport { Webhooks } from './resources/webhooks';\nexport { Tracking } from './resources/tracking';\nexport { Conversions } from './resources/conversions';\nexport { Segments } from './resources/segments';\nexport { Tags } from './resources/tags';\nexport { Automations } from './resources/automations';\nexport { Domains } from './resources/domains';\nexport { Health } from './resources/health';\n","export class TopMailError extends Error {\n readonly code: string;\n readonly statusCode: number;\n\n constructor(message: string, code: string, statusCode: number) {\n super(message);\n this.name = 'TopMailError';\n this.code = code;\n this.statusCode = statusCode;\n }\n}\n\nexport class ValidationError extends TopMailError {\n constructor(message: string, code = 'validation_error') {\n super(message, code, 400);\n this.name = 'ValidationError';\n }\n}\n\nexport class AuthenticationError extends TopMailError {\n constructor(message: string, code = 'authentication_error') {\n super(message, code, 401);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class ForbiddenError extends TopMailError {\n constructor(message: string, code = 'forbidden') {\n super(message, code, 403);\n this.name = 'ForbiddenError';\n }\n}\n\nexport class NotFoundError extends TopMailError {\n constructor(message: string, code = 'not_found') {\n super(message, code, 404);\n this.name = 'NotFoundError';\n }\n}\n\nexport class RateLimitError extends TopMailError {\n readonly retryAfter: number | null;\n\n constructor(message: string, retryAfter: number | null = null, code = 'rate_limit_exceeded') {\n super(message, code, 429);\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\nexport class ServerError extends TopMailError {\n constructor(message: string, statusCode = 500, code = 'server_error') {\n super(message, code, statusCode);\n this.name = 'ServerError';\n }\n}\n","import {\n TopMailError,\n ValidationError,\n AuthenticationError,\n ForbiddenError,\n NotFoundError,\n RateLimitError,\n ServerError,\n} from './errors';\nimport type { ErrorResponse } from './types';\n\nexport interface ClientOptions {\n baseUrl: string;\n apiKey: string;\n maxRetries?: number;\n}\n\nconst DEFAULT_MAX_RETRIES = 3;\nconst INITIAL_RETRY_DELAY_MS = 1000;\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly maxRetries: number;\n\n constructor(options: ClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.apiKey = options.apiKey;\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n }\n\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = this.buildUrl(path, params);\n return this.request<T>(url, { method: 'GET' });\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n const url = this.buildUrl(path);\n return this.request<T>(url, {\n method: 'POST',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n }\n\n async put<T>(path: string, body?: unknown): Promise<T> {\n const url = this.buildUrl(path);\n return this.request<T>(url, {\n method: 'PUT',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n }\n\n async patch<T>(path: string, body?: unknown): Promise<T> {\n const url = this.buildUrl(path);\n return this.request<T>(url, {\n method: 'PATCH',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n }\n\n async delete<T>(path: string, body?: unknown): Promise<T> {\n const url = this.buildUrl(path);\n return this.request<T>(url, {\n method: 'DELETE',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n }\n\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n const url = new URL(`${this.baseUrl}${path}`);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n private async request<T>(url: string, init: RequestInit): Promise<T> {\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n };\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const delay = this.getRetryDelay(attempt, lastError);\n await this.sleep(delay);\n }\n\n let response: Response;\n try {\n response = await fetch(url, { ...init, headers });\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n continue;\n }\n\n if (response.ok) {\n if (response.status === 204) {\n return undefined as T;\n }\n return (await response.json()) as T;\n }\n\n // Parse error body\n let errorBody: ErrorResponse | undefined;\n try {\n errorBody = (await response.json()) as ErrorResponse;\n } catch {\n // ignore parse failures\n }\n\n const errorMessage = errorBody?.error?.message ?? response.statusText;\n const errorCode = errorBody?.error?.code ?? 'unknown_error';\n\n // Retryable: 429 and 5xx\n if (response.status === 429 || response.status >= 500) {\n if (response.status === 429) {\n const retryAfter = this.parseRetryAfter(response);\n lastError = new RateLimitError(errorMessage, retryAfter, errorCode);\n } else {\n lastError = new ServerError(errorMessage, response.status, errorCode);\n }\n\n if (attempt < this.maxRetries) {\n continue;\n }\n throw lastError;\n }\n\n // Non-retryable errors\n throw this.createError(response.status, errorMessage, errorCode);\n }\n\n throw lastError ?? new TopMailError('Request failed', 'unknown_error', 0);\n }\n\n private createError(status: number, message: string, code: string): TopMailError {\n switch (status) {\n case 400:\n return new ValidationError(message, code);\n case 401:\n return new AuthenticationError(message, code);\n case 403:\n return new ForbiddenError(message, code);\n case 404:\n return new NotFoundError(message, code);\n case 429:\n return new RateLimitError(message, null, code);\n default:\n if (status >= 500) {\n return new ServerError(message, status, code);\n }\n return new TopMailError(message, code, status);\n }\n }\n\n private getRetryDelay(attempt: number, lastError?: Error): number {\n // Respect Retry-After header for rate limits\n if (lastError instanceof RateLimitError && lastError.retryAfter !== null) {\n return lastError.retryAfter * 1000;\n }\n // Exponential backoff: 1s, 2s, 4s\n return INITIAL_RETRY_DELAY_MS * Math.pow(2, attempt - 1);\n }\n\n private parseRetryAfter(response: Response): number | null {\n const header = response.headers.get('retry-after');\n if (!header) return null;\n const seconds = Number(header);\n return isNaN(seconds) ? null : seconds;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Contact,\n ContactListParams,\n ContactCreateParams,\n ContactUpdateParams,\n ListResponse,\n SingleResponse,\n} from '../types';\n\nexport class Contacts {\n constructor(private readonly client: HttpClient) {}\n\n async list(params?: ContactListParams): Promise<ListResponse<Contact>> {\n return this.client.get<ListResponse<Contact>>('/v1/contacts', params as Record<string, unknown>);\n }\n\n async get(id: string): Promise<SingleResponse<Contact>> {\n return this.client.get<SingleResponse<Contact>>(`/v1/contacts/${id}`);\n }\n\n async create(data: ContactCreateParams): Promise<SingleResponse<Contact>> {\n return this.client.post<SingleResponse<Contact>>('/v1/contacts', data);\n }\n\n async update(id: string, data: ContactUpdateParams): Promise<SingleResponse<Contact>> {\n return this.client.patch<SingleResponse<Contact>>(`/v1/contacts/${id}`, data);\n }\n\n async delete(id: string): Promise<void> {\n await this.client.delete<void>(`/v1/contacts/${id}`);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n ContactList,\n ListCreateParams,\n ListUpdateParams,\n ListMember,\n ListMembersParams,\n ListResponse,\n SingleResponse,\n PaginationParams,\n} from '../types';\n\nclass ListMembers {\n constructor(private readonly client: HttpClient) {}\n\n async list(listId: string, params?: ListMembersParams): Promise<ListResponse<ListMember>> {\n return this.client.get<ListResponse<ListMember>>(\n `/v1/lists/${listId}/members`,\n params as Record<string, unknown>,\n );\n }\n\n async add(listId: string, contactIds: string[]): Promise<SingleResponse<{ added: number }>> {\n return this.client.post<SingleResponse<{ added: number }>>(\n `/v1/lists/${listId}/members`,\n { contact_ids: contactIds },\n );\n }\n\n async remove(listId: string, contactIds: string[]): Promise<void> {\n await this.client.delete<void>(`/v1/lists/${listId}/members`, { contact_ids: contactIds });\n }\n}\n\nexport class Lists {\n readonly members: ListMembers;\n\n constructor(private readonly client: HttpClient) {\n this.members = new ListMembers(client);\n }\n\n async list(params?: PaginationParams): Promise<ListResponse<ContactList>> {\n return this.client.get<ListResponse<ContactList>>('/v1/lists', params as Record<string, unknown>);\n }\n\n async get(id: string): Promise<SingleResponse<ContactList>> {\n return this.client.get<SingleResponse<ContactList>>(`/v1/lists/${id}`);\n }\n\n async create(data: ListCreateParams): Promise<SingleResponse<ContactList>> {\n return this.client.post<SingleResponse<ContactList>>('/v1/lists', data);\n }\n\n async update(id: string, data: ListUpdateParams): Promise<SingleResponse<ContactList>> {\n return this.client.patch<SingleResponse<ContactList>>(`/v1/lists/${id}`, data);\n }\n\n async delete(id: string): Promise<void> {\n await this.client.delete<void>(`/v1/lists/${id}`);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Campaign,\n CampaignListParams,\n ListResponse,\n SingleResponse,\n} from '../types';\n\nexport class Campaigns {\n constructor(private readonly client: HttpClient) {}\n\n async list(params?: CampaignListParams): Promise<ListResponse<Campaign>> {\n return this.client.get<ListResponse<Campaign>>('/v1/campaigns', params as Record<string, unknown>);\n }\n\n async get(id: string): Promise<SingleResponse<Campaign>> {\n return this.client.get<SingleResponse<Campaign>>(`/v1/campaigns/${id}`);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Template,\n TemplateListParams,\n TemplateCreateParams,\n ListResponse,\n SingleResponse,\n} from '../types';\n\nexport class Templates {\n constructor(private readonly client: HttpClient) {}\n\n async list(params?: TemplateListParams): Promise<ListResponse<Template>> {\n return this.client.get<ListResponse<Template>>('/v1/templates', params as Record<string, unknown>);\n }\n\n async get(id: string): Promise<SingleResponse<Template>> {\n return this.client.get<SingleResponse<Template>>(`/v1/templates/${id}`);\n }\n\n async create(data: TemplateCreateParams): Promise<SingleResponse<Template>> {\n return this.client.post<SingleResponse<Template>>('/v1/templates', data);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n EmailSendParams,\n EmailSendResponse,\n EmailBatchParams,\n EmailBatchResponse,\n EmailBatchStatus,\n EmailMessageStatus,\n SingleResponse,\n} from '../types';\n\nexport class Email {\n constructor(private readonly client: HttpClient) {}\n\n async send(data: EmailSendParams): Promise<SingleResponse<EmailSendResponse>> {\n return this.client.post<SingleResponse<EmailSendResponse>>('/v1/email/send', data);\n }\n\n async batch(data: EmailBatchParams): Promise<SingleResponse<EmailBatchResponse>> {\n return this.client.post<SingleResponse<EmailBatchResponse>>('/v1/email/batch', data);\n }\n\n async batchStatus(batchId: string): Promise<SingleResponse<EmailBatchStatus>> {\n return this.client.get<SingleResponse<EmailBatchStatus>>(`/v1/email/batch/${batchId}`);\n }\n\n async messageStatus(messageId: string): Promise<SingleResponse<EmailMessageStatus>> {\n return this.client.get<SingleResponse<EmailMessageStatus>>(`/v1/email/${messageId}/status`);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Suppression,\n SuppressionListParams,\n SuppressionAddParams,\n ListResponse,\n SingleResponse,\n} from '../types';\n\nexport class Suppressions {\n constructor(private readonly client: HttpClient) {}\n\n async list(params?: SuppressionListParams): Promise<ListResponse<Suppression>> {\n return this.client.get<ListResponse<Suppression>>('/v1/suppressions', params as Record<string, unknown>);\n }\n\n async add(data: SuppressionAddParams): Promise<SingleResponse<Suppression>> {\n return this.client.post<SingleResponse<Suppression>>('/v1/suppressions', data);\n }\n\n async remove(email: string): Promise<void> {\n await this.client.delete<void>(`/v1/suppressions/${encodeURIComponent(email)}`);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Webhook,\n WebhookSubscribeParams,\n WebhookTestResponse,\n SingleResponse,\n} from '../types';\n\nexport class Webhooks {\n constructor(private readonly client: HttpClient) {}\n\n async subscribe(data: WebhookSubscribeParams): Promise<SingleResponse<Webhook>> {\n return this.client.post<SingleResponse<Webhook>>('/v1/webhooks/triggers', data);\n }\n\n async unsubscribe(id: string): Promise<void> {\n await this.client.delete<void>(`/v1/webhooks/triggers?id=${id}`);\n }\n\n async test(id: string): Promise<SingleResponse<WebhookTestResponse>> {\n return this.client.post<SingleResponse<WebhookTestResponse>>(`/v1/webhooks/${id}/test`);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n ProductViewParams,\n ProductViewResponse,\n SingleResponse,\n} from '../types';\n\nexport class Tracking {\n constructor(private readonly client: HttpClient) {}\n\n async productView(data: ProductViewParams): Promise<SingleResponse<ProductViewResponse>> {\n return this.client.post<SingleResponse<ProductViewResponse>>('/v1/track/product-view', data);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Conversion,\n ConversionCreateParams,\n ConversionListParams,\n ListResponse,\n SingleResponse,\n} from '../types';\n\nexport class Conversions {\n constructor(private readonly client: HttpClient) {}\n\n async list(params?: ConversionListParams): Promise<ListResponse<Conversion>> {\n return this.client.get<ListResponse<Conversion>>('/v1/conversions', params as Record<string, unknown>);\n }\n\n async create(data: ConversionCreateParams): Promise<SingleResponse<Conversion>> {\n return this.client.post<SingleResponse<Conversion>>('/v1/conversions', data);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Segment,\n SegmentListParams,\n SegmentCreateParams,\n SegmentUpdateParams,\n SegmentEstimate,\n Contact,\n ListResponse,\n SingleResponse,\n PaginationParams,\n} from '../types';\n\nexport class Segments {\n constructor(private readonly client: HttpClient) {}\n\n async list(params?: SegmentListParams): Promise<ListResponse<Segment>> {\n return this.client.get<ListResponse<Segment>>('/v1/segments', params as Record<string, unknown>);\n }\n\n async get(id: string): Promise<SingleResponse<Segment>> {\n return this.client.get<SingleResponse<Segment>>(`/v1/segments/${id}`);\n }\n\n async create(data: SegmentCreateParams): Promise<SingleResponse<Segment>> {\n return this.client.post<SingleResponse<Segment>>('/v1/segments', data);\n }\n\n async update(id: string, data: SegmentUpdateParams): Promise<SingleResponse<Segment>> {\n return this.client.patch<SingleResponse<Segment>>(`/v1/segments/${id}`, data);\n }\n\n async delete(id: string): Promise<void> {\n await this.client.delete<void>(`/v1/segments/${id}`);\n }\n\n async estimateCount(id: string): Promise<SingleResponse<SegmentEstimate>> {\n return this.client.post<SingleResponse<SegmentEstimate>>(`/v1/segments/${id}/estimate`);\n }\n\n async listContacts(id: string, params?: PaginationParams): Promise<ListResponse<Contact>> {\n return this.client.get<ListResponse<Contact>>(`/v1/segments/${id}/contacts`, params as Record<string, unknown>);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Tag,\n TagListParams,\n TagCreateParams,\n TagUpdateParams,\n TagAssignResult,\n TagRemoveResult,\n Contact,\n ListResponse,\n SingleResponse,\n PaginationParams,\n} from '../types';\n\nclass TagContacts {\n constructor(private readonly client: HttpClient) {}\n\n async list(tagId: string, params?: PaginationParams): Promise<ListResponse<Contact>> {\n return this.client.get<ListResponse<Contact>>(\n `/v1/tags/${tagId}/contacts`,\n params as Record<string, unknown>,\n );\n }\n\n async assign(tagId: string, contactIds: string[]): Promise<SingleResponse<TagAssignResult>> {\n return this.client.post<SingleResponse<TagAssignResult>>(\n `/v1/tags/${tagId}/contacts`,\n { contact_ids: contactIds },\n );\n }\n\n async remove(tagId: string, contactIds: string[]): Promise<SingleResponse<TagRemoveResult>> {\n return this.client.delete<SingleResponse<TagRemoveResult>>(\n `/v1/tags/${tagId}/contacts`,\n { contact_ids: contactIds },\n );\n }\n}\n\nexport class Tags {\n readonly contacts: TagContacts;\n\n constructor(private readonly client: HttpClient) {\n this.contacts = new TagContacts(client);\n }\n\n async list(params?: TagListParams): Promise<ListResponse<Tag>> {\n return this.client.get<ListResponse<Tag>>('/v1/tags', params as Record<string, unknown>);\n }\n\n async get(id: string): Promise<SingleResponse<Tag>> {\n return this.client.get<SingleResponse<Tag>>(`/v1/tags/${id}`);\n }\n\n async create(data: TagCreateParams): Promise<SingleResponse<Tag>> {\n return this.client.post<SingleResponse<Tag>>('/v1/tags', data);\n }\n\n async update(id: string, data: TagUpdateParams): Promise<SingleResponse<Tag>> {\n return this.client.patch<SingleResponse<Tag>>(`/v1/tags/${id}`, data);\n }\n\n async delete(id: string): Promise<void> {\n await this.client.delete<void>(`/v1/tags/${id}`);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Automation,\n AutomationWithSteps,\n AutomationStep,\n AutomationListParams,\n AutomationCreateParams,\n AutomationUpdateParams,\n AutomationAddStepParams,\n AutomationUpdateStepParams,\n AutomationBatchUpdateStepsParams,\n AutomationTriggerParams,\n AutomationTriggerResult,\n AutomationRun,\n AutomationRunListParams,\n ListResponse,\n SingleResponse,\n} from '../types';\n\nexport class Automations {\n constructor(private readonly client: HttpClient) {}\n\n async create(data: AutomationCreateParams): Promise<SingleResponse<AutomationWithSteps>> {\n return this.client.post<SingleResponse<AutomationWithSteps>>('/v1/automations', data);\n }\n\n async list(params?: AutomationListParams): Promise<ListResponse<Automation>> {\n return this.client.get<ListResponse<Automation>>('/v1/automations', params as Record<string, unknown>);\n }\n\n async get(id: string): Promise<SingleResponse<AutomationWithSteps>> {\n return this.client.get<SingleResponse<AutomationWithSteps>>(`/v1/automations/${id}`);\n }\n\n async update(id: string, data: AutomationUpdateParams): Promise<SingleResponse<Automation>> {\n return this.client.patch<SingleResponse<Automation>>(`/v1/automations/${id}`, data);\n }\n\n async activate(id: string): Promise<SingleResponse<Automation>> {\n return this.update(id, { status: 'active' });\n }\n\n async pause(id: string): Promise<SingleResponse<Automation>> {\n return this.update(id, { status: 'paused' });\n }\n\n async delete(id: string): Promise<void> {\n await this.client.delete(`/v1/automations/${id}`);\n }\n\n async addStep(id: string, data: AutomationAddStepParams): Promise<SingleResponse<AutomationStep>> {\n return this.client.post<SingleResponse<AutomationStep>>(`/v1/automations/${id}/steps`, data);\n }\n\n async updateStep(automationId: string, stepId: string, data: AutomationUpdateStepParams): Promise<SingleResponse<AutomationStep>> {\n return this.client.patch<SingleResponse<AutomationStep>>(`/v1/automations/${automationId}/steps/${stepId}`, data);\n }\n\n async deleteStep(automationId: string, stepId: string): Promise<void> {\n await this.client.delete(`/v1/automations/${automationId}/steps/${stepId}`);\n }\n\n async batchUpdateSteps(id: string, data: AutomationBatchUpdateStepsParams): Promise<SingleResponse<{ success: boolean }>> {\n return this.client.put<SingleResponse<{ success: boolean }>>(`/v1/automations/${id}/steps`, data);\n }\n\n async trigger(id: string, data: AutomationTriggerParams): Promise<SingleResponse<AutomationTriggerResult>> {\n return this.client.post<SingleResponse<AutomationTriggerResult>>(`/v1/automations/${id}/trigger`, data);\n }\n\n async listRuns(id: string, params?: AutomationRunListParams): Promise<ListResponse<AutomationRun>> {\n return this.client.get<ListResponse<AutomationRun>>(\n `/v1/automations/${id}/runs`,\n params as Record<string, unknown>,\n );\n }\n\n async cancelRun(automationId: string, runId: string): Promise<SingleResponse<{ id: string; status: string; completed_at: string | null }>> {\n return this.client.post<SingleResponse<{ id: string; status: string; completed_at: string | null }>>(\n `/v1/automations/${automationId}/runs/${runId}/cancel`,\n {},\n );\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n DomainWithDnsRecords,\n DomainCreateParams,\n DomainVerifyResult,\n Domain,\n ListResponse,\n SingleResponse,\n} from '../types';\n\nexport class Domains {\n constructor(private readonly client: HttpClient) {}\n\n async list(): Promise<ListResponse<Domain>> {\n return this.client.get<ListResponse<Domain>>('/v1/domains');\n }\n\n async get(id: string): Promise<SingleResponse<DomainWithDnsRecords>> {\n return this.client.get<SingleResponse<DomainWithDnsRecords>>(`/v1/domains/${id}`);\n }\n\n async create(data: DomainCreateParams): Promise<SingleResponse<DomainWithDnsRecords>> {\n return this.client.post<SingleResponse<DomainWithDnsRecords>>('/v1/domains', data);\n }\n\n async delete(id: string): Promise<void> {\n await this.client.delete<void>(`/v1/domains/${id}`);\n }\n\n async verify(id: string): Promise<SingleResponse<DomainVerifyResult>> {\n return this.client.post<SingleResponse<DomainVerifyResult>>(`/v1/domains/${id}/verify`);\n }\n}\n","import type { HttpClient } from '../client';\nimport type { HealthResponse } from '../types';\n\nexport class Health {\n constructor(private readonly client: HttpClient) {}\n\n async check(): Promise<HealthResponse> {\n return this.client.get<HealthResponse>('/v1/health');\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
// src/errors.ts
|
|
2
|
+
var TopMailError = class extends Error {
|
|
3
|
+
constructor(message, code, statusCode) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "TopMailError";
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.statusCode = statusCode;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var ValidationError = class extends TopMailError {
|
|
11
|
+
constructor(message, code = "validation_error") {
|
|
12
|
+
super(message, code, 400);
|
|
13
|
+
this.name = "ValidationError";
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
var AuthenticationError = class extends TopMailError {
|
|
17
|
+
constructor(message, code = "authentication_error") {
|
|
18
|
+
super(message, code, 401);
|
|
19
|
+
this.name = "AuthenticationError";
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
var ForbiddenError = class extends TopMailError {
|
|
23
|
+
constructor(message, code = "forbidden") {
|
|
24
|
+
super(message, code, 403);
|
|
25
|
+
this.name = "ForbiddenError";
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
var NotFoundError = class extends TopMailError {
|
|
29
|
+
constructor(message, code = "not_found") {
|
|
30
|
+
super(message, code, 404);
|
|
31
|
+
this.name = "NotFoundError";
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
var RateLimitError = class extends TopMailError {
|
|
35
|
+
constructor(message, retryAfter = null, code = "rate_limit_exceeded") {
|
|
36
|
+
super(message, code, 429);
|
|
37
|
+
this.name = "RateLimitError";
|
|
38
|
+
this.retryAfter = retryAfter;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
var ServerError = class extends TopMailError {
|
|
42
|
+
constructor(message, statusCode = 500, code = "server_error") {
|
|
43
|
+
super(message, code, statusCode);
|
|
44
|
+
this.name = "ServerError";
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// src/client.ts
|
|
49
|
+
var DEFAULT_MAX_RETRIES = 3;
|
|
50
|
+
var INITIAL_RETRY_DELAY_MS = 1e3;
|
|
51
|
+
var HttpClient = class {
|
|
52
|
+
constructor(options) {
|
|
53
|
+
this.baseUrl = options.baseUrl.replace(/\/+$/, "");
|
|
54
|
+
this.apiKey = options.apiKey;
|
|
55
|
+
this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
56
|
+
}
|
|
57
|
+
async get(path, params) {
|
|
58
|
+
const url = this.buildUrl(path, params);
|
|
59
|
+
return this.request(url, { method: "GET" });
|
|
60
|
+
}
|
|
61
|
+
async post(path, body) {
|
|
62
|
+
const url = this.buildUrl(path);
|
|
63
|
+
return this.request(url, {
|
|
64
|
+
method: "POST",
|
|
65
|
+
body: body !== void 0 ? JSON.stringify(body) : void 0
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async put(path, body) {
|
|
69
|
+
const url = this.buildUrl(path);
|
|
70
|
+
return this.request(url, {
|
|
71
|
+
method: "PUT",
|
|
72
|
+
body: body !== void 0 ? JSON.stringify(body) : void 0
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async patch(path, body) {
|
|
76
|
+
const url = this.buildUrl(path);
|
|
77
|
+
return this.request(url, {
|
|
78
|
+
method: "PATCH",
|
|
79
|
+
body: body !== void 0 ? JSON.stringify(body) : void 0
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async delete(path, body) {
|
|
83
|
+
const url = this.buildUrl(path);
|
|
84
|
+
return this.request(url, {
|
|
85
|
+
method: "DELETE",
|
|
86
|
+
body: body !== void 0 ? JSON.stringify(body) : void 0
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
buildUrl(path, params) {
|
|
90
|
+
const url = new URL(`${this.baseUrl}${path}`);
|
|
91
|
+
if (params) {
|
|
92
|
+
for (const [key, value] of Object.entries(params)) {
|
|
93
|
+
if (value !== void 0 && value !== null) {
|
|
94
|
+
url.searchParams.set(key, String(value));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return url.toString();
|
|
99
|
+
}
|
|
100
|
+
async request(url, init) {
|
|
101
|
+
const headers = {
|
|
102
|
+
"Authorization": `Bearer ${this.apiKey}`,
|
|
103
|
+
"Content-Type": "application/json"
|
|
104
|
+
};
|
|
105
|
+
let lastError;
|
|
106
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
107
|
+
if (attempt > 0) {
|
|
108
|
+
const delay = this.getRetryDelay(attempt, lastError);
|
|
109
|
+
await this.sleep(delay);
|
|
110
|
+
}
|
|
111
|
+
let response;
|
|
112
|
+
try {
|
|
113
|
+
response = await fetch(url, { ...init, headers });
|
|
114
|
+
} catch (err) {
|
|
115
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (response.ok) {
|
|
119
|
+
if (response.status === 204) {
|
|
120
|
+
return void 0;
|
|
121
|
+
}
|
|
122
|
+
return await response.json();
|
|
123
|
+
}
|
|
124
|
+
let errorBody;
|
|
125
|
+
try {
|
|
126
|
+
errorBody = await response.json();
|
|
127
|
+
} catch {
|
|
128
|
+
}
|
|
129
|
+
const errorMessage = errorBody?.error?.message ?? response.statusText;
|
|
130
|
+
const errorCode = errorBody?.error?.code ?? "unknown_error";
|
|
131
|
+
if (response.status === 429 || response.status >= 500) {
|
|
132
|
+
if (response.status === 429) {
|
|
133
|
+
const retryAfter = this.parseRetryAfter(response);
|
|
134
|
+
lastError = new RateLimitError(errorMessage, retryAfter, errorCode);
|
|
135
|
+
} else {
|
|
136
|
+
lastError = new ServerError(errorMessage, response.status, errorCode);
|
|
137
|
+
}
|
|
138
|
+
if (attempt < this.maxRetries) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
throw lastError;
|
|
142
|
+
}
|
|
143
|
+
throw this.createError(response.status, errorMessage, errorCode);
|
|
144
|
+
}
|
|
145
|
+
throw lastError ?? new TopMailError("Request failed", "unknown_error", 0);
|
|
146
|
+
}
|
|
147
|
+
createError(status, message, code) {
|
|
148
|
+
switch (status) {
|
|
149
|
+
case 400:
|
|
150
|
+
return new ValidationError(message, code);
|
|
151
|
+
case 401:
|
|
152
|
+
return new AuthenticationError(message, code);
|
|
153
|
+
case 403:
|
|
154
|
+
return new ForbiddenError(message, code);
|
|
155
|
+
case 404:
|
|
156
|
+
return new NotFoundError(message, code);
|
|
157
|
+
case 429:
|
|
158
|
+
return new RateLimitError(message, null, code);
|
|
159
|
+
default:
|
|
160
|
+
if (status >= 500) {
|
|
161
|
+
return new ServerError(message, status, code);
|
|
162
|
+
}
|
|
163
|
+
return new TopMailError(message, code, status);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
getRetryDelay(attempt, lastError) {
|
|
167
|
+
if (lastError instanceof RateLimitError && lastError.retryAfter !== null) {
|
|
168
|
+
return lastError.retryAfter * 1e3;
|
|
169
|
+
}
|
|
170
|
+
return INITIAL_RETRY_DELAY_MS * Math.pow(2, attempt - 1);
|
|
171
|
+
}
|
|
172
|
+
parseRetryAfter(response) {
|
|
173
|
+
const header = response.headers.get("retry-after");
|
|
174
|
+
if (!header) return null;
|
|
175
|
+
const seconds = Number(header);
|
|
176
|
+
return isNaN(seconds) ? null : seconds;
|
|
177
|
+
}
|
|
178
|
+
sleep(ms) {
|
|
179
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
// src/resources/contacts.ts
|
|
184
|
+
var Contacts = class {
|
|
185
|
+
constructor(client) {
|
|
186
|
+
this.client = client;
|
|
187
|
+
}
|
|
188
|
+
async list(params) {
|
|
189
|
+
return this.client.get("/v1/contacts", params);
|
|
190
|
+
}
|
|
191
|
+
async get(id) {
|
|
192
|
+
return this.client.get(`/v1/contacts/${id}`);
|
|
193
|
+
}
|
|
194
|
+
async create(data) {
|
|
195
|
+
return this.client.post("/v1/contacts", data);
|
|
196
|
+
}
|
|
197
|
+
async update(id, data) {
|
|
198
|
+
return this.client.patch(`/v1/contacts/${id}`, data);
|
|
199
|
+
}
|
|
200
|
+
async delete(id) {
|
|
201
|
+
await this.client.delete(`/v1/contacts/${id}`);
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
// src/resources/lists.ts
|
|
206
|
+
var ListMembers = class {
|
|
207
|
+
constructor(client) {
|
|
208
|
+
this.client = client;
|
|
209
|
+
}
|
|
210
|
+
async list(listId, params) {
|
|
211
|
+
return this.client.get(
|
|
212
|
+
`/v1/lists/${listId}/members`,
|
|
213
|
+
params
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
async add(listId, contactIds) {
|
|
217
|
+
return this.client.post(
|
|
218
|
+
`/v1/lists/${listId}/members`,
|
|
219
|
+
{ contact_ids: contactIds }
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
async remove(listId, contactIds) {
|
|
223
|
+
await this.client.delete(`/v1/lists/${listId}/members`, { contact_ids: contactIds });
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
var Lists = class {
|
|
227
|
+
constructor(client) {
|
|
228
|
+
this.client = client;
|
|
229
|
+
this.members = new ListMembers(client);
|
|
230
|
+
}
|
|
231
|
+
async list(params) {
|
|
232
|
+
return this.client.get("/v1/lists", params);
|
|
233
|
+
}
|
|
234
|
+
async get(id) {
|
|
235
|
+
return this.client.get(`/v1/lists/${id}`);
|
|
236
|
+
}
|
|
237
|
+
async create(data) {
|
|
238
|
+
return this.client.post("/v1/lists", data);
|
|
239
|
+
}
|
|
240
|
+
async update(id, data) {
|
|
241
|
+
return this.client.patch(`/v1/lists/${id}`, data);
|
|
242
|
+
}
|
|
243
|
+
async delete(id) {
|
|
244
|
+
await this.client.delete(`/v1/lists/${id}`);
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
// src/resources/campaigns.ts
|
|
249
|
+
var Campaigns = class {
|
|
250
|
+
constructor(client) {
|
|
251
|
+
this.client = client;
|
|
252
|
+
}
|
|
253
|
+
async list(params) {
|
|
254
|
+
return this.client.get("/v1/campaigns", params);
|
|
255
|
+
}
|
|
256
|
+
async get(id) {
|
|
257
|
+
return this.client.get(`/v1/campaigns/${id}`);
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
// src/resources/templates.ts
|
|
262
|
+
var Templates = class {
|
|
263
|
+
constructor(client) {
|
|
264
|
+
this.client = client;
|
|
265
|
+
}
|
|
266
|
+
async list(params) {
|
|
267
|
+
return this.client.get("/v1/templates", params);
|
|
268
|
+
}
|
|
269
|
+
async get(id) {
|
|
270
|
+
return this.client.get(`/v1/templates/${id}`);
|
|
271
|
+
}
|
|
272
|
+
async create(data) {
|
|
273
|
+
return this.client.post("/v1/templates", data);
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
// src/resources/email.ts
|
|
278
|
+
var Email = class {
|
|
279
|
+
constructor(client) {
|
|
280
|
+
this.client = client;
|
|
281
|
+
}
|
|
282
|
+
async send(data) {
|
|
283
|
+
return this.client.post("/v1/email/send", data);
|
|
284
|
+
}
|
|
285
|
+
async batch(data) {
|
|
286
|
+
return this.client.post("/v1/email/batch", data);
|
|
287
|
+
}
|
|
288
|
+
async batchStatus(batchId) {
|
|
289
|
+
return this.client.get(`/v1/email/batch/${batchId}`);
|
|
290
|
+
}
|
|
291
|
+
async messageStatus(messageId) {
|
|
292
|
+
return this.client.get(`/v1/email/${messageId}/status`);
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
// src/resources/suppressions.ts
|
|
297
|
+
var Suppressions = class {
|
|
298
|
+
constructor(client) {
|
|
299
|
+
this.client = client;
|
|
300
|
+
}
|
|
301
|
+
async list(params) {
|
|
302
|
+
return this.client.get("/v1/suppressions", params);
|
|
303
|
+
}
|
|
304
|
+
async add(data) {
|
|
305
|
+
return this.client.post("/v1/suppressions", data);
|
|
306
|
+
}
|
|
307
|
+
async remove(email) {
|
|
308
|
+
await this.client.delete(`/v1/suppressions/${encodeURIComponent(email)}`);
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
// src/resources/webhooks.ts
|
|
313
|
+
var Webhooks = class {
|
|
314
|
+
constructor(client) {
|
|
315
|
+
this.client = client;
|
|
316
|
+
}
|
|
317
|
+
async subscribe(data) {
|
|
318
|
+
return this.client.post("/v1/webhooks/triggers", data);
|
|
319
|
+
}
|
|
320
|
+
async unsubscribe(id) {
|
|
321
|
+
await this.client.delete(`/v1/webhooks/triggers?id=${id}`);
|
|
322
|
+
}
|
|
323
|
+
async test(id) {
|
|
324
|
+
return this.client.post(`/v1/webhooks/${id}/test`);
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
// src/resources/tracking.ts
|
|
329
|
+
var Tracking = class {
|
|
330
|
+
constructor(client) {
|
|
331
|
+
this.client = client;
|
|
332
|
+
}
|
|
333
|
+
async productView(data) {
|
|
334
|
+
return this.client.post("/v1/track/product-view", data);
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
// src/resources/conversions.ts
|
|
339
|
+
var Conversions = class {
|
|
340
|
+
constructor(client) {
|
|
341
|
+
this.client = client;
|
|
342
|
+
}
|
|
343
|
+
async list(params) {
|
|
344
|
+
return this.client.get("/v1/conversions", params);
|
|
345
|
+
}
|
|
346
|
+
async create(data) {
|
|
347
|
+
return this.client.post("/v1/conversions", data);
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
// src/resources/segments.ts
|
|
352
|
+
var Segments = class {
|
|
353
|
+
constructor(client) {
|
|
354
|
+
this.client = client;
|
|
355
|
+
}
|
|
356
|
+
async list(params) {
|
|
357
|
+
return this.client.get("/v1/segments", params);
|
|
358
|
+
}
|
|
359
|
+
async get(id) {
|
|
360
|
+
return this.client.get(`/v1/segments/${id}`);
|
|
361
|
+
}
|
|
362
|
+
async create(data) {
|
|
363
|
+
return this.client.post("/v1/segments", data);
|
|
364
|
+
}
|
|
365
|
+
async update(id, data) {
|
|
366
|
+
return this.client.patch(`/v1/segments/${id}`, data);
|
|
367
|
+
}
|
|
368
|
+
async delete(id) {
|
|
369
|
+
await this.client.delete(`/v1/segments/${id}`);
|
|
370
|
+
}
|
|
371
|
+
async estimateCount(id) {
|
|
372
|
+
return this.client.post(`/v1/segments/${id}/estimate`);
|
|
373
|
+
}
|
|
374
|
+
async listContacts(id, params) {
|
|
375
|
+
return this.client.get(`/v1/segments/${id}/contacts`, params);
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
|
|
379
|
+
// src/resources/tags.ts
|
|
380
|
+
var TagContacts = class {
|
|
381
|
+
constructor(client) {
|
|
382
|
+
this.client = client;
|
|
383
|
+
}
|
|
384
|
+
async list(tagId, params) {
|
|
385
|
+
return this.client.get(
|
|
386
|
+
`/v1/tags/${tagId}/contacts`,
|
|
387
|
+
params
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
async assign(tagId, contactIds) {
|
|
391
|
+
return this.client.post(
|
|
392
|
+
`/v1/tags/${tagId}/contacts`,
|
|
393
|
+
{ contact_ids: contactIds }
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
async remove(tagId, contactIds) {
|
|
397
|
+
return this.client.delete(
|
|
398
|
+
`/v1/tags/${tagId}/contacts`,
|
|
399
|
+
{ contact_ids: contactIds }
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
var Tags = class {
|
|
404
|
+
constructor(client) {
|
|
405
|
+
this.client = client;
|
|
406
|
+
this.contacts = new TagContacts(client);
|
|
407
|
+
}
|
|
408
|
+
async list(params) {
|
|
409
|
+
return this.client.get("/v1/tags", params);
|
|
410
|
+
}
|
|
411
|
+
async get(id) {
|
|
412
|
+
return this.client.get(`/v1/tags/${id}`);
|
|
413
|
+
}
|
|
414
|
+
async create(data) {
|
|
415
|
+
return this.client.post("/v1/tags", data);
|
|
416
|
+
}
|
|
417
|
+
async update(id, data) {
|
|
418
|
+
return this.client.patch(`/v1/tags/${id}`, data);
|
|
419
|
+
}
|
|
420
|
+
async delete(id) {
|
|
421
|
+
await this.client.delete(`/v1/tags/${id}`);
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
// src/resources/automations.ts
|
|
426
|
+
var Automations = class {
|
|
427
|
+
constructor(client) {
|
|
428
|
+
this.client = client;
|
|
429
|
+
}
|
|
430
|
+
async create(data) {
|
|
431
|
+
return this.client.post("/v1/automations", data);
|
|
432
|
+
}
|
|
433
|
+
async list(params) {
|
|
434
|
+
return this.client.get("/v1/automations", params);
|
|
435
|
+
}
|
|
436
|
+
async get(id) {
|
|
437
|
+
return this.client.get(`/v1/automations/${id}`);
|
|
438
|
+
}
|
|
439
|
+
async update(id, data) {
|
|
440
|
+
return this.client.patch(`/v1/automations/${id}`, data);
|
|
441
|
+
}
|
|
442
|
+
async activate(id) {
|
|
443
|
+
return this.update(id, { status: "active" });
|
|
444
|
+
}
|
|
445
|
+
async pause(id) {
|
|
446
|
+
return this.update(id, { status: "paused" });
|
|
447
|
+
}
|
|
448
|
+
async delete(id) {
|
|
449
|
+
await this.client.delete(`/v1/automations/${id}`);
|
|
450
|
+
}
|
|
451
|
+
async addStep(id, data) {
|
|
452
|
+
return this.client.post(`/v1/automations/${id}/steps`, data);
|
|
453
|
+
}
|
|
454
|
+
async updateStep(automationId, stepId, data) {
|
|
455
|
+
return this.client.patch(`/v1/automations/${automationId}/steps/${stepId}`, data);
|
|
456
|
+
}
|
|
457
|
+
async deleteStep(automationId, stepId) {
|
|
458
|
+
await this.client.delete(`/v1/automations/${automationId}/steps/${stepId}`);
|
|
459
|
+
}
|
|
460
|
+
async batchUpdateSteps(id, data) {
|
|
461
|
+
return this.client.put(`/v1/automations/${id}/steps`, data);
|
|
462
|
+
}
|
|
463
|
+
async trigger(id, data) {
|
|
464
|
+
return this.client.post(`/v1/automations/${id}/trigger`, data);
|
|
465
|
+
}
|
|
466
|
+
async listRuns(id, params) {
|
|
467
|
+
return this.client.get(
|
|
468
|
+
`/v1/automations/${id}/runs`,
|
|
469
|
+
params
|
|
470
|
+
);
|
|
471
|
+
}
|
|
472
|
+
async cancelRun(automationId, runId) {
|
|
473
|
+
return this.client.post(
|
|
474
|
+
`/v1/automations/${automationId}/runs/${runId}/cancel`,
|
|
475
|
+
{}
|
|
476
|
+
);
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
// src/resources/domains.ts
|
|
481
|
+
var Domains = class {
|
|
482
|
+
constructor(client) {
|
|
483
|
+
this.client = client;
|
|
484
|
+
}
|
|
485
|
+
async list() {
|
|
486
|
+
return this.client.get("/v1/domains");
|
|
487
|
+
}
|
|
488
|
+
async get(id) {
|
|
489
|
+
return this.client.get(`/v1/domains/${id}`);
|
|
490
|
+
}
|
|
491
|
+
async create(data) {
|
|
492
|
+
return this.client.post("/v1/domains", data);
|
|
493
|
+
}
|
|
494
|
+
async delete(id) {
|
|
495
|
+
await this.client.delete(`/v1/domains/${id}`);
|
|
496
|
+
}
|
|
497
|
+
async verify(id) {
|
|
498
|
+
return this.client.post(`/v1/domains/${id}/verify`);
|
|
499
|
+
}
|
|
500
|
+
};
|
|
501
|
+
|
|
502
|
+
// src/resources/health.ts
|
|
503
|
+
var Health = class {
|
|
504
|
+
constructor(client) {
|
|
505
|
+
this.client = client;
|
|
506
|
+
}
|
|
507
|
+
async check() {
|
|
508
|
+
return this.client.get("/v1/health");
|
|
509
|
+
}
|
|
510
|
+
};
|
|
511
|
+
|
|
512
|
+
// src/index.ts
|
|
513
|
+
var DEFAULT_BASE_URL = "https://api.topmail.so/api";
|
|
514
|
+
var TopMail = class {
|
|
515
|
+
constructor(apiKey, options) {
|
|
516
|
+
if (!apiKey) {
|
|
517
|
+
throw new Error("API key is required");
|
|
518
|
+
}
|
|
519
|
+
this.isSandbox = apiKey.startsWith("tm_test_");
|
|
520
|
+
const client = new HttpClient({
|
|
521
|
+
baseUrl: options?.baseUrl ?? DEFAULT_BASE_URL,
|
|
522
|
+
apiKey
|
|
523
|
+
});
|
|
524
|
+
this.contacts = new Contacts(client);
|
|
525
|
+
this.lists = new Lists(client);
|
|
526
|
+
this.campaigns = new Campaigns(client);
|
|
527
|
+
this.templates = new Templates(client);
|
|
528
|
+
this.email = new Email(client);
|
|
529
|
+
this.suppressions = new Suppressions(client);
|
|
530
|
+
this.webhooks = new Webhooks(client);
|
|
531
|
+
this.tracking = new Tracking(client);
|
|
532
|
+
this.conversions = new Conversions(client);
|
|
533
|
+
this.segments = new Segments(client);
|
|
534
|
+
this.tags = new Tags(client);
|
|
535
|
+
this.automations = new Automations(client);
|
|
536
|
+
this.domains = new Domains(client);
|
|
537
|
+
this.health = new Health(client);
|
|
538
|
+
}
|
|
539
|
+
};
|
|
540
|
+
export {
|
|
541
|
+
AuthenticationError,
|
|
542
|
+
Automations,
|
|
543
|
+
Campaigns,
|
|
544
|
+
Contacts,
|
|
545
|
+
Conversions,
|
|
546
|
+
Domains,
|
|
547
|
+
Email,
|
|
548
|
+
ForbiddenError,
|
|
549
|
+
Health,
|
|
550
|
+
HttpClient,
|
|
551
|
+
Lists,
|
|
552
|
+
NotFoundError,
|
|
553
|
+
RateLimitError,
|
|
554
|
+
Segments,
|
|
555
|
+
ServerError,
|
|
556
|
+
Suppressions,
|
|
557
|
+
Tags,
|
|
558
|
+
Templates,
|
|
559
|
+
TopMail,
|
|
560
|
+
TopMailError,
|
|
561
|
+
Tracking,
|
|
562
|
+
ValidationError,
|
|
563
|
+
Webhooks
|
|
564
|
+
};
|
|
565
|
+
//# sourceMappingURL=index.mjs.map
|