@hiveku-apps/email 1.0.0 → 1.0.1

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/README.md CHANGED
@@ -7,18 +7,18 @@ Send transactional emails, manage sending domains, and track delivery stats —
7
7
  ## Installation
8
8
 
9
9
  ```bash
10
- npm install @hiveku/email
10
+ npm install @hiveku-apps/email
11
11
  ```
12
12
 
13
13
  ## Quick start
14
14
 
15
15
  ```typescript
16
- import HivekuEmail from '@hiveku/email';
16
+ import HivekuEmail from '@hiveku-apps/email';
17
17
 
18
18
  const email = new HivekuEmail('hk_live_YOUR_KEY');
19
19
 
20
20
  await email.send({
21
- from: 'Acme <hello@acme.com>',
21
+ from: 'Acme <hello@notifications.acme.com>',
22
22
  to: 'user@example.com',
23
23
  subject: 'Welcome to Acme!',
24
24
  html: '<p>Thanks for signing up.</p>',
@@ -28,7 +28,7 @@ await email.send({
28
28
  Or set `HIVEKU_EMAIL_API_KEY` in your environment and call the module-level helper:
29
29
 
30
30
  ```typescript
31
- import { sendEmail } from '@hiveku/email';
31
+ import { sendEmail } from '@hiveku-apps/email';
32
32
 
33
33
  await sendEmail({
34
34
  from: 'hello@yourdomain.com',
@@ -45,10 +45,10 @@ curl -X POST https://api.hiveku.com/v1/email/send \
45
45
  -H "Authorization: Bearer hk_live_YOUR_KEY" \
46
46
  -H "Content-Type: application/json" \
47
47
  -d '{
48
- "from": "hello@yourdomain.com",
48
+ "from": "Acme <hello@notifications.acme.com>",
49
49
  "to": ["user@example.com"],
50
- "subject": "Hello World",
51
- "html": "<p>Welcome!</p>"
50
+ "subject": "Welcome to Acme!",
51
+ "html": "<p>Thanks for signing up.</p>"
52
52
  }'
53
53
  ```
54
54
 
package/dist/index.cjs CHANGED
@@ -15,11 +15,11 @@ var HivekuEmail = class {
15
15
  constructor(apiKeyOrConfig) {
16
16
  if (typeof apiKeyOrConfig === "string") {
17
17
  this.apiKey = apiKeyOrConfig;
18
- this.baseUrl = "https://api.hiveku.com";
18
+ this.baseUrl = "https://app.hiveku.com";
19
19
  this.timeout = 3e4;
20
20
  } else {
21
21
  this.apiKey = apiKeyOrConfig?.apiKey || (typeof process !== "undefined" ? process.env.HIVEKU_EMAIL_API_KEY ?? "" : "");
22
- this.baseUrl = apiKeyOrConfig?.baseUrl || (typeof process !== "undefined" ? process.env.HIVEKU_API_URL ?? "https://api.hiveku.com" : "https://api.hiveku.com");
22
+ this.baseUrl = apiKeyOrConfig?.baseUrl || (typeof process !== "undefined" ? process.env.HIVEKU_API_URL ?? "https://app.hiveku.com" : "https://app.hiveku.com");
23
23
  this.timeout = apiKeyOrConfig?.timeout ?? 3e4;
24
24
  }
25
25
  if (!this.apiKey) {
@@ -38,7 +38,7 @@ var HivekuEmail = class {
38
38
  headers: {
39
39
  Authorization: `Bearer ${this.apiKey}`,
40
40
  "Content-Type": "application/json",
41
- "User-Agent": `hiveku-email-sdk/1.0.0`
41
+ "User-Agent": `hiveku-email-sdk/1.0.1`
42
42
  },
43
43
  body: body !== void 0 ? JSON.stringify(body) : void 0,
44
44
  signal: controller.signal
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @hiveku/email — Official Hiveku Transactional Email SDK\n * https://hiveku.com\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SendEmailOptions {\n /** Sender address. Supports \"Name <email>\" format. */\n from: string;\n /** One or more recipient addresses. */\n to: string | string[];\n /** Email subject line. */\n subject: string;\n /** HTML body content. */\n html?: string;\n /** Plain text body content. */\n text?: string;\n /** Reply-to address. */\n replyTo?: string;\n /** CC recipients. */\n cc?: string[];\n /** BCC recipients. */\n bcc?: string[];\n /** Custom headers. */\n headers?: Record<string, string>;\n /** Tags for tracking / filtering (key-value pairs). */\n tags?: Record<string, string>;\n /** File attachments. */\n attachments?: Array<{\n filename: string;\n /** Base64-encoded file content. */\n content: string;\n contentType?: string;\n }>;\n /** Schedule delivery (ISO 8601). */\n scheduledAt?: string;\n}\n\nexport interface SendEmailResponse {\n id: string;\n status: 'queued' | 'sent' | 'failed';\n}\n\nexport interface BatchSendResponse {\n results: SendEmailResponse[];\n}\n\nexport interface EmailDomain {\n id: string;\n domain: string;\n status: 'pending' | 'verified' | 'failed';\n dnsRecords?: Array<{\n type: string;\n name: string;\n value: string;\n priority?: number;\n }>;\n createdAt: string;\n}\n\nexport interface UsageStats {\n sent: number;\n delivered: number;\n bounced: number;\n complained: number;\n opened: number;\n clicked: number;\n period: {\n start: string;\n end: string;\n };\n limits: {\n daily: number;\n monthly: number;\n dailyUsed: number;\n monthlyUsed: number;\n };\n}\n\nexport interface SmtpCredentials {\n host: string;\n port: number;\n username: string;\n password: string;\n secure: boolean;\n}\n\nexport interface HivekuEmailConfig {\n /** Your Hiveku API key (hk_live_... or hk_test_...). */\n apiKey?: string;\n /** Override the base URL (default: https://api.hiveku.com). */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000). */\n timeout?: number;\n}\n\nexport class HivekuEmailError extends Error {\n status: number;\n code: string;\n\n constructor(message: string, status: number, code: string) {\n super(message);\n this.name = 'HivekuEmailError';\n this.status = status;\n this.code = code;\n }\n}\n\n// ============================================================================\n// Client\n// ============================================================================\n\nexport class HivekuEmail {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n\n constructor(apiKeyOrConfig?: string | HivekuEmailConfig) {\n if (typeof apiKeyOrConfig === 'string') {\n this.apiKey = apiKeyOrConfig;\n this.baseUrl = 'https://api.hiveku.com';\n this.timeout = 30_000;\n } else {\n this.apiKey =\n apiKeyOrConfig?.apiKey ||\n (typeof process !== 'undefined' ? process.env.HIVEKU_EMAIL_API_KEY ?? '' : '');\n this.baseUrl =\n apiKeyOrConfig?.baseUrl ||\n (typeof process !== 'undefined'\n ? process.env.HIVEKU_API_URL ?? 'https://api.hiveku.com'\n : 'https://api.hiveku.com');\n this.timeout = apiKeyOrConfig?.timeout ?? 30_000;\n }\n\n if (!this.apiKey) {\n throw new Error(\n 'Hiveku Email API key is required. Pass it to the constructor or set the HIVEKU_EMAIL_API_KEY environment variable.'\n );\n }\n }\n\n // --------------------------------------------------------------------------\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const res = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `hiveku-email-sdk/1.0.0`,\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n throw new HivekuEmailError(\n (data.error as string) || `Request failed with status ${res.status}`,\n res.status,\n (data.code as string) || 'UNKNOWN_ERROR'\n );\n }\n\n return data as T;\n } finally {\n clearTimeout(timer);\n }\n }\n\n // ── Sending ──────────────────────────────────────────────────────────────\n\n /**\n * Send a single transactional email.\n *\n * @example\n * await email.send({\n * from: 'Acme <hello@acme.com>',\n * to: 'user@example.com',\n * subject: 'Welcome!',\n * html: '<p>Thanks for signing up.</p>',\n * });\n */\n async send(options: SendEmailOptions): Promise<SendEmailResponse> {\n return this.request<SendEmailResponse>('POST', '/api/v1/email/send', {\n from: options.from,\n to: Array.isArray(options.to) ? options.to : [options.to],\n subject: options.subject,\n html: options.html,\n text: options.text,\n reply_to: options.replyTo,\n cc: options.cc,\n bcc: options.bcc,\n headers: options.headers,\n tags: options.tags,\n attachments: options.attachments,\n scheduled_at: options.scheduledAt,\n });\n }\n\n /**\n * Send up to 50 emails in a single request.\n */\n async sendBatch(emails: SendEmailOptions[]): Promise<BatchSendResponse> {\n if (emails.length > 50) throw new Error('Maximum 50 emails per batch.');\n\n return this.request<BatchSendResponse>('POST', '/api/v1/email/batch', {\n emails: emails.map((e) => ({\n from: e.from,\n to: Array.isArray(e.to) ? e.to : [e.to],\n subject: e.subject,\n html: e.html,\n text: e.text,\n reply_to: e.replyTo,\n cc: e.cc,\n bcc: e.bcc,\n tags: e.tags,\n attachments: e.attachments,\n scheduled_at: e.scheduledAt,\n })),\n });\n }\n\n // ── Domains ───────────────────────────────────────────────────────────────\n\n /** List all domains on this account. */\n async listDomains(): Promise<{ domains: EmailDomain[] }> {\n return this.request('GET', '/api/v1/email/domains');\n }\n\n /** Add a domain and get the DNS records to configure. */\n async addDomain(domain: string): Promise<EmailDomain> {\n return this.request('POST', '/api/v1/email/domains', { domain });\n }\n\n /** Trigger re-verification of a domain's DNS records. */\n async verifyDomain(domainId: string): Promise<EmailDomain> {\n return this.request('POST', `/api/v1/email/domains/${domainId}`);\n }\n\n /** Remove a domain from the account. */\n async deleteDomain(domainId: string): Promise<{ success: boolean }> {\n return this.request('DELETE', `/api/v1/email/domains/${domainId}`);\n }\n\n // ── Usage ─────────────────────────────────────────────────────────────────\n\n /** Get send/delivery stats for a date range. */\n async getUsage(options?: { startDate?: string; endDate?: string }): Promise<UsageStats> {\n const params = new URLSearchParams();\n if (options?.startDate) params.set('start_date', options.startDate);\n if (options?.endDate) params.set('end_date', options.endDate);\n const qs = params.toString();\n return this.request('GET', `/api/v1/email/usage${qs ? `?${qs}` : ''}`);\n }\n\n // ── SMTP ──────────────────────────────────────────────────────────────────\n\n /**\n * Generate SMTP credentials — useful for services like Supabase Auth or\n * any system that only supports SMTP.\n */\n async generateSmtpCredentials(): Promise<SmtpCredentials> {\n return this.request('POST', '/api/v1/email/smtp-credentials');\n }\n}\n\n// ============================================================================\n// Module-level convenience\n// ============================================================================\n\nlet _defaultClient: HivekuEmail | null = null;\n\n/** Initialize the default module-level client. */\nexport function init(apiKey: string, config?: Omit<HivekuEmailConfig, 'apiKey'>): void {\n _defaultClient = new HivekuEmail({ apiKey, ...config });\n}\n\nfunction getDefault(): HivekuEmail {\n if (!_defaultClient) {\n _defaultClient = new HivekuEmail();\n }\n return _defaultClient;\n}\n\n/** Send an email using the module-level default client. */\nexport function sendEmail(options: SendEmailOptions): Promise<SendEmailResponse> {\n return getDefault().send(options);\n}\n\nexport default HivekuEmail;\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @hiveku/email — Official Hiveku Transactional Email SDK\n * https://hiveku.com\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SendEmailOptions {\n /** Sender address. Supports \"Name <email>\" format. */\n from: string;\n /** One or more recipient addresses. */\n to: string | string[];\n /** Email subject line. */\n subject: string;\n /** HTML body content. */\n html?: string;\n /** Plain text body content. */\n text?: string;\n /** Reply-to address. */\n replyTo?: string;\n /** CC recipients. */\n cc?: string[];\n /** BCC recipients. */\n bcc?: string[];\n /** Custom headers. */\n headers?: Record<string, string>;\n /** Tags for tracking / filtering (key-value pairs). */\n tags?: Record<string, string>;\n /** File attachments. */\n attachments?: Array<{\n filename: string;\n /** Base64-encoded file content. */\n content: string;\n contentType?: string;\n }>;\n /** Schedule delivery (ISO 8601). */\n scheduledAt?: string;\n}\n\nexport interface SendEmailResponse {\n id: string;\n status: 'queued' | 'sent' | 'failed';\n}\n\nexport interface BatchSendResponse {\n results: SendEmailResponse[];\n}\n\nexport interface EmailDomain {\n id: string;\n domain: string;\n status: 'pending' | 'verified' | 'failed';\n dnsRecords?: Array<{\n type: string;\n name: string;\n value: string;\n priority?: number;\n }>;\n createdAt: string;\n}\n\nexport interface UsageStats {\n sent: number;\n delivered: number;\n bounced: number;\n complained: number;\n opened: number;\n clicked: number;\n period: {\n start: string;\n end: string;\n };\n limits: {\n daily: number;\n monthly: number;\n dailyUsed: number;\n monthlyUsed: number;\n };\n}\n\nexport interface SmtpCredentials {\n host: string;\n port: number;\n username: string;\n password: string;\n secure: boolean;\n}\n\nexport interface HivekuEmailConfig {\n /** Your Hiveku API key (hk_live_... or hk_test_...). */\n apiKey?: string;\n /** Override the base URL (default: https://app.hiveku.com). */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000). */\n timeout?: number;\n}\n\nexport class HivekuEmailError extends Error {\n status: number;\n code: string;\n\n constructor(message: string, status: number, code: string) {\n super(message);\n this.name = 'HivekuEmailError';\n this.status = status;\n this.code = code;\n }\n}\n\n// ============================================================================\n// Client\n// ============================================================================\n\nexport class HivekuEmail {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n\n constructor(apiKeyOrConfig?: string | HivekuEmailConfig) {\n if (typeof apiKeyOrConfig === 'string') {\n this.apiKey = apiKeyOrConfig;\n this.baseUrl = 'https://app.hiveku.com';\n this.timeout = 30_000;\n } else {\n this.apiKey =\n apiKeyOrConfig?.apiKey ||\n (typeof process !== 'undefined' ? process.env.HIVEKU_EMAIL_API_KEY ?? '' : '');\n this.baseUrl =\n apiKeyOrConfig?.baseUrl ||\n (typeof process !== 'undefined'\n ? process.env.HIVEKU_API_URL ?? 'https://app.hiveku.com'\n : 'https://app.hiveku.com');\n this.timeout = apiKeyOrConfig?.timeout ?? 30_000;\n }\n\n if (!this.apiKey) {\n throw new Error(\n 'Hiveku Email API key is required. Pass it to the constructor or set the HIVEKU_EMAIL_API_KEY environment variable.'\n );\n }\n }\n\n // --------------------------------------------------------------------------\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const res = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `hiveku-email-sdk/1.0.1`,\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n throw new HivekuEmailError(\n (data.error as string) || `Request failed with status ${res.status}`,\n res.status,\n (data.code as string) || 'UNKNOWN_ERROR'\n );\n }\n\n return data as T;\n } finally {\n clearTimeout(timer);\n }\n }\n\n // ── Sending ──────────────────────────────────────────────────────────────\n\n /**\n * Send a single transactional email.\n *\n * @example\n * await email.send({\n * from: 'Acme <hello@acme.com>',\n * to: 'user@example.com',\n * subject: 'Welcome!',\n * html: '<p>Thanks for signing up.</p>',\n * });\n */\n async send(options: SendEmailOptions): Promise<SendEmailResponse> {\n return this.request<SendEmailResponse>('POST', '/api/v1/email/send', {\n from: options.from,\n to: Array.isArray(options.to) ? options.to : [options.to],\n subject: options.subject,\n html: options.html,\n text: options.text,\n reply_to: options.replyTo,\n cc: options.cc,\n bcc: options.bcc,\n headers: options.headers,\n tags: options.tags,\n attachments: options.attachments,\n scheduled_at: options.scheduledAt,\n });\n }\n\n /**\n * Send up to 50 emails in a single request.\n */\n async sendBatch(emails: SendEmailOptions[]): Promise<BatchSendResponse> {\n if (emails.length > 50) throw new Error('Maximum 50 emails per batch.');\n\n return this.request<BatchSendResponse>('POST', '/api/v1/email/batch', {\n emails: emails.map((e) => ({\n from: e.from,\n to: Array.isArray(e.to) ? e.to : [e.to],\n subject: e.subject,\n html: e.html,\n text: e.text,\n reply_to: e.replyTo,\n cc: e.cc,\n bcc: e.bcc,\n tags: e.tags,\n attachments: e.attachments,\n scheduled_at: e.scheduledAt,\n })),\n });\n }\n\n // ── Domains ───────────────────────────────────────────────────────────────\n\n /** List all domains on this account. */\n async listDomains(): Promise<{ domains: EmailDomain[] }> {\n return this.request('GET', '/api/v1/email/domains');\n }\n\n /** Add a domain and get the DNS records to configure. */\n async addDomain(domain: string): Promise<EmailDomain> {\n return this.request('POST', '/api/v1/email/domains', { domain });\n }\n\n /** Trigger re-verification of a domain's DNS records. */\n async verifyDomain(domainId: string): Promise<EmailDomain> {\n return this.request('POST', `/api/v1/email/domains/${domainId}`);\n }\n\n /** Remove a domain from the account. */\n async deleteDomain(domainId: string): Promise<{ success: boolean }> {\n return this.request('DELETE', `/api/v1/email/domains/${domainId}`);\n }\n\n // ── Usage ─────────────────────────────────────────────────────────────────\n\n /** Get send/delivery stats for a date range. */\n async getUsage(options?: { startDate?: string; endDate?: string }): Promise<UsageStats> {\n const params = new URLSearchParams();\n if (options?.startDate) params.set('start_date', options.startDate);\n if (options?.endDate) params.set('end_date', options.endDate);\n const qs = params.toString();\n return this.request('GET', `/api/v1/email/usage${qs ? `?${qs}` : ''}`);\n }\n\n // ── SMTP ──────────────────────────────────────────────────────────────────\n\n /**\n * Generate SMTP credentials — useful for services like Supabase Auth or\n * any system that only supports SMTP.\n */\n async generateSmtpCredentials(): Promise<SmtpCredentials> {\n return this.request('POST', '/api/v1/email/smtp-credentials');\n }\n}\n\n// ============================================================================\n// Module-level convenience\n// ============================================================================\n\nlet _defaultClient: HivekuEmail | null = null;\n\n/** Initialize the default module-level client. */\nexport function init(apiKey: string, config?: Omit<HivekuEmailConfig, 'apiKey'>): void {\n _defaultClient = new HivekuEmail({ apiKey, ...config });\n}\n\nfunction getDefault(): HivekuEmail {\n if (!_defaultClient) {\n _defaultClient = new HivekuEmail();\n }\n return _defaultClient;\n}\n\n/** Send an email using the module-level default client. */\nexport function sendEmail(options: SendEmailOptions): Promise<SendEmailResponse> {\n return getDefault().send(options);\n}\n\nexport default HivekuEmail;\n"]}
package/dist/index.d.cts CHANGED
@@ -80,7 +80,7 @@ interface SmtpCredentials {
80
80
  interface HivekuEmailConfig {
81
81
  /** Your Hiveku API key (hk_live_... or hk_test_...). */
82
82
  apiKey?: string;
83
- /** Override the base URL (default: https://api.hiveku.com). */
83
+ /** Override the base URL (default: https://app.hiveku.com). */
84
84
  baseUrl?: string;
85
85
  /** Request timeout in milliseconds (default: 30000). */
86
86
  timeout?: number;
package/dist/index.d.ts CHANGED
@@ -80,7 +80,7 @@ interface SmtpCredentials {
80
80
  interface HivekuEmailConfig {
81
81
  /** Your Hiveku API key (hk_live_... or hk_test_...). */
82
82
  apiKey?: string;
83
- /** Override the base URL (default: https://api.hiveku.com). */
83
+ /** Override the base URL (default: https://app.hiveku.com). */
84
84
  baseUrl?: string;
85
85
  /** Request timeout in milliseconds (default: 30000). */
86
86
  timeout?: number;
package/dist/index.js CHANGED
@@ -11,11 +11,11 @@ var HivekuEmail = class {
11
11
  constructor(apiKeyOrConfig) {
12
12
  if (typeof apiKeyOrConfig === "string") {
13
13
  this.apiKey = apiKeyOrConfig;
14
- this.baseUrl = "https://api.hiveku.com";
14
+ this.baseUrl = "https://app.hiveku.com";
15
15
  this.timeout = 3e4;
16
16
  } else {
17
17
  this.apiKey = apiKeyOrConfig?.apiKey || (typeof process !== "undefined" ? process.env.HIVEKU_EMAIL_API_KEY ?? "" : "");
18
- this.baseUrl = apiKeyOrConfig?.baseUrl || (typeof process !== "undefined" ? process.env.HIVEKU_API_URL ?? "https://api.hiveku.com" : "https://api.hiveku.com");
18
+ this.baseUrl = apiKeyOrConfig?.baseUrl || (typeof process !== "undefined" ? process.env.HIVEKU_API_URL ?? "https://app.hiveku.com" : "https://app.hiveku.com");
19
19
  this.timeout = apiKeyOrConfig?.timeout ?? 3e4;
20
20
  }
21
21
  if (!this.apiKey) {
@@ -34,7 +34,7 @@ var HivekuEmail = class {
34
34
  headers: {
35
35
  Authorization: `Bearer ${this.apiKey}`,
36
36
  "Content-Type": "application/json",
37
- "User-Agent": `hiveku-email-sdk/1.0.0`
37
+ "User-Agent": `hiveku-email-sdk/1.0.1`
38
38
  },
39
39
  body: body !== void 0 ? JSON.stringify(body) : void 0,
40
40
  signal: controller.signal
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @hiveku/email — Official Hiveku Transactional Email SDK\n * https://hiveku.com\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SendEmailOptions {\n /** Sender address. Supports \"Name <email>\" format. */\n from: string;\n /** One or more recipient addresses. */\n to: string | string[];\n /** Email subject line. */\n subject: string;\n /** HTML body content. */\n html?: string;\n /** Plain text body content. */\n text?: string;\n /** Reply-to address. */\n replyTo?: string;\n /** CC recipients. */\n cc?: string[];\n /** BCC recipients. */\n bcc?: string[];\n /** Custom headers. */\n headers?: Record<string, string>;\n /** Tags for tracking / filtering (key-value pairs). */\n tags?: Record<string, string>;\n /** File attachments. */\n attachments?: Array<{\n filename: string;\n /** Base64-encoded file content. */\n content: string;\n contentType?: string;\n }>;\n /** Schedule delivery (ISO 8601). */\n scheduledAt?: string;\n}\n\nexport interface SendEmailResponse {\n id: string;\n status: 'queued' | 'sent' | 'failed';\n}\n\nexport interface BatchSendResponse {\n results: SendEmailResponse[];\n}\n\nexport interface EmailDomain {\n id: string;\n domain: string;\n status: 'pending' | 'verified' | 'failed';\n dnsRecords?: Array<{\n type: string;\n name: string;\n value: string;\n priority?: number;\n }>;\n createdAt: string;\n}\n\nexport interface UsageStats {\n sent: number;\n delivered: number;\n bounced: number;\n complained: number;\n opened: number;\n clicked: number;\n period: {\n start: string;\n end: string;\n };\n limits: {\n daily: number;\n monthly: number;\n dailyUsed: number;\n monthlyUsed: number;\n };\n}\n\nexport interface SmtpCredentials {\n host: string;\n port: number;\n username: string;\n password: string;\n secure: boolean;\n}\n\nexport interface HivekuEmailConfig {\n /** Your Hiveku API key (hk_live_... or hk_test_...). */\n apiKey?: string;\n /** Override the base URL (default: https://api.hiveku.com). */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000). */\n timeout?: number;\n}\n\nexport class HivekuEmailError extends Error {\n status: number;\n code: string;\n\n constructor(message: string, status: number, code: string) {\n super(message);\n this.name = 'HivekuEmailError';\n this.status = status;\n this.code = code;\n }\n}\n\n// ============================================================================\n// Client\n// ============================================================================\n\nexport class HivekuEmail {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n\n constructor(apiKeyOrConfig?: string | HivekuEmailConfig) {\n if (typeof apiKeyOrConfig === 'string') {\n this.apiKey = apiKeyOrConfig;\n this.baseUrl = 'https://api.hiveku.com';\n this.timeout = 30_000;\n } else {\n this.apiKey =\n apiKeyOrConfig?.apiKey ||\n (typeof process !== 'undefined' ? process.env.HIVEKU_EMAIL_API_KEY ?? '' : '');\n this.baseUrl =\n apiKeyOrConfig?.baseUrl ||\n (typeof process !== 'undefined'\n ? process.env.HIVEKU_API_URL ?? 'https://api.hiveku.com'\n : 'https://api.hiveku.com');\n this.timeout = apiKeyOrConfig?.timeout ?? 30_000;\n }\n\n if (!this.apiKey) {\n throw new Error(\n 'Hiveku Email API key is required. Pass it to the constructor or set the HIVEKU_EMAIL_API_KEY environment variable.'\n );\n }\n }\n\n // --------------------------------------------------------------------------\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const res = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `hiveku-email-sdk/1.0.0`,\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n throw new HivekuEmailError(\n (data.error as string) || `Request failed with status ${res.status}`,\n res.status,\n (data.code as string) || 'UNKNOWN_ERROR'\n );\n }\n\n return data as T;\n } finally {\n clearTimeout(timer);\n }\n }\n\n // ── Sending ──────────────────────────────────────────────────────────────\n\n /**\n * Send a single transactional email.\n *\n * @example\n * await email.send({\n * from: 'Acme <hello@acme.com>',\n * to: 'user@example.com',\n * subject: 'Welcome!',\n * html: '<p>Thanks for signing up.</p>',\n * });\n */\n async send(options: SendEmailOptions): Promise<SendEmailResponse> {\n return this.request<SendEmailResponse>('POST', '/api/v1/email/send', {\n from: options.from,\n to: Array.isArray(options.to) ? options.to : [options.to],\n subject: options.subject,\n html: options.html,\n text: options.text,\n reply_to: options.replyTo,\n cc: options.cc,\n bcc: options.bcc,\n headers: options.headers,\n tags: options.tags,\n attachments: options.attachments,\n scheduled_at: options.scheduledAt,\n });\n }\n\n /**\n * Send up to 50 emails in a single request.\n */\n async sendBatch(emails: SendEmailOptions[]): Promise<BatchSendResponse> {\n if (emails.length > 50) throw new Error('Maximum 50 emails per batch.');\n\n return this.request<BatchSendResponse>('POST', '/api/v1/email/batch', {\n emails: emails.map((e) => ({\n from: e.from,\n to: Array.isArray(e.to) ? e.to : [e.to],\n subject: e.subject,\n html: e.html,\n text: e.text,\n reply_to: e.replyTo,\n cc: e.cc,\n bcc: e.bcc,\n tags: e.tags,\n attachments: e.attachments,\n scheduled_at: e.scheduledAt,\n })),\n });\n }\n\n // ── Domains ───────────────────────────────────────────────────────────────\n\n /** List all domains on this account. */\n async listDomains(): Promise<{ domains: EmailDomain[] }> {\n return this.request('GET', '/api/v1/email/domains');\n }\n\n /** Add a domain and get the DNS records to configure. */\n async addDomain(domain: string): Promise<EmailDomain> {\n return this.request('POST', '/api/v1/email/domains', { domain });\n }\n\n /** Trigger re-verification of a domain's DNS records. */\n async verifyDomain(domainId: string): Promise<EmailDomain> {\n return this.request('POST', `/api/v1/email/domains/${domainId}`);\n }\n\n /** Remove a domain from the account. */\n async deleteDomain(domainId: string): Promise<{ success: boolean }> {\n return this.request('DELETE', `/api/v1/email/domains/${domainId}`);\n }\n\n // ── Usage ─────────────────────────────────────────────────────────────────\n\n /** Get send/delivery stats for a date range. */\n async getUsage(options?: { startDate?: string; endDate?: string }): Promise<UsageStats> {\n const params = new URLSearchParams();\n if (options?.startDate) params.set('start_date', options.startDate);\n if (options?.endDate) params.set('end_date', options.endDate);\n const qs = params.toString();\n return this.request('GET', `/api/v1/email/usage${qs ? `?${qs}` : ''}`);\n }\n\n // ── SMTP ──────────────────────────────────────────────────────────────────\n\n /**\n * Generate SMTP credentials — useful for services like Supabase Auth or\n * any system that only supports SMTP.\n */\n async generateSmtpCredentials(): Promise<SmtpCredentials> {\n return this.request('POST', '/api/v1/email/smtp-credentials');\n }\n}\n\n// ============================================================================\n// Module-level convenience\n// ============================================================================\n\nlet _defaultClient: HivekuEmail | null = null;\n\n/** Initialize the default module-level client. */\nexport function init(apiKey: string, config?: Omit<HivekuEmailConfig, 'apiKey'>): void {\n _defaultClient = new HivekuEmail({ apiKey, ...config });\n}\n\nfunction getDefault(): HivekuEmail {\n if (!_defaultClient) {\n _defaultClient = new HivekuEmail();\n }\n return _defaultClient;\n}\n\n/** Send an email using the module-level default client. */\nexport function sendEmail(options: SendEmailOptions): Promise<SendEmailResponse> {\n return getDefault().send(options);\n}\n\nexport default HivekuEmail;\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @hiveku/email — Official Hiveku Transactional Email SDK\n * https://hiveku.com\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SendEmailOptions {\n /** Sender address. Supports \"Name <email>\" format. */\n from: string;\n /** One or more recipient addresses. */\n to: string | string[];\n /** Email subject line. */\n subject: string;\n /** HTML body content. */\n html?: string;\n /** Plain text body content. */\n text?: string;\n /** Reply-to address. */\n replyTo?: string;\n /** CC recipients. */\n cc?: string[];\n /** BCC recipients. */\n bcc?: string[];\n /** Custom headers. */\n headers?: Record<string, string>;\n /** Tags for tracking / filtering (key-value pairs). */\n tags?: Record<string, string>;\n /** File attachments. */\n attachments?: Array<{\n filename: string;\n /** Base64-encoded file content. */\n content: string;\n contentType?: string;\n }>;\n /** Schedule delivery (ISO 8601). */\n scheduledAt?: string;\n}\n\nexport interface SendEmailResponse {\n id: string;\n status: 'queued' | 'sent' | 'failed';\n}\n\nexport interface BatchSendResponse {\n results: SendEmailResponse[];\n}\n\nexport interface EmailDomain {\n id: string;\n domain: string;\n status: 'pending' | 'verified' | 'failed';\n dnsRecords?: Array<{\n type: string;\n name: string;\n value: string;\n priority?: number;\n }>;\n createdAt: string;\n}\n\nexport interface UsageStats {\n sent: number;\n delivered: number;\n bounced: number;\n complained: number;\n opened: number;\n clicked: number;\n period: {\n start: string;\n end: string;\n };\n limits: {\n daily: number;\n monthly: number;\n dailyUsed: number;\n monthlyUsed: number;\n };\n}\n\nexport interface SmtpCredentials {\n host: string;\n port: number;\n username: string;\n password: string;\n secure: boolean;\n}\n\nexport interface HivekuEmailConfig {\n /** Your Hiveku API key (hk_live_... or hk_test_...). */\n apiKey?: string;\n /** Override the base URL (default: https://app.hiveku.com). */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000). */\n timeout?: number;\n}\n\nexport class HivekuEmailError extends Error {\n status: number;\n code: string;\n\n constructor(message: string, status: number, code: string) {\n super(message);\n this.name = 'HivekuEmailError';\n this.status = status;\n this.code = code;\n }\n}\n\n// ============================================================================\n// Client\n// ============================================================================\n\nexport class HivekuEmail {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n\n constructor(apiKeyOrConfig?: string | HivekuEmailConfig) {\n if (typeof apiKeyOrConfig === 'string') {\n this.apiKey = apiKeyOrConfig;\n this.baseUrl = 'https://app.hiveku.com';\n this.timeout = 30_000;\n } else {\n this.apiKey =\n apiKeyOrConfig?.apiKey ||\n (typeof process !== 'undefined' ? process.env.HIVEKU_EMAIL_API_KEY ?? '' : '');\n this.baseUrl =\n apiKeyOrConfig?.baseUrl ||\n (typeof process !== 'undefined'\n ? process.env.HIVEKU_API_URL ?? 'https://app.hiveku.com'\n : 'https://app.hiveku.com');\n this.timeout = apiKeyOrConfig?.timeout ?? 30_000;\n }\n\n if (!this.apiKey) {\n throw new Error(\n 'Hiveku Email API key is required. Pass it to the constructor or set the HIVEKU_EMAIL_API_KEY environment variable.'\n );\n }\n }\n\n // --------------------------------------------------------------------------\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const res = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `hiveku-email-sdk/1.0.1`,\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n throw new HivekuEmailError(\n (data.error as string) || `Request failed with status ${res.status}`,\n res.status,\n (data.code as string) || 'UNKNOWN_ERROR'\n );\n }\n\n return data as T;\n } finally {\n clearTimeout(timer);\n }\n }\n\n // ── Sending ──────────────────────────────────────────────────────────────\n\n /**\n * Send a single transactional email.\n *\n * @example\n * await email.send({\n * from: 'Acme <hello@acme.com>',\n * to: 'user@example.com',\n * subject: 'Welcome!',\n * html: '<p>Thanks for signing up.</p>',\n * });\n */\n async send(options: SendEmailOptions): Promise<SendEmailResponse> {\n return this.request<SendEmailResponse>('POST', '/api/v1/email/send', {\n from: options.from,\n to: Array.isArray(options.to) ? options.to : [options.to],\n subject: options.subject,\n html: options.html,\n text: options.text,\n reply_to: options.replyTo,\n cc: options.cc,\n bcc: options.bcc,\n headers: options.headers,\n tags: options.tags,\n attachments: options.attachments,\n scheduled_at: options.scheduledAt,\n });\n }\n\n /**\n * Send up to 50 emails in a single request.\n */\n async sendBatch(emails: SendEmailOptions[]): Promise<BatchSendResponse> {\n if (emails.length > 50) throw new Error('Maximum 50 emails per batch.');\n\n return this.request<BatchSendResponse>('POST', '/api/v1/email/batch', {\n emails: emails.map((e) => ({\n from: e.from,\n to: Array.isArray(e.to) ? e.to : [e.to],\n subject: e.subject,\n html: e.html,\n text: e.text,\n reply_to: e.replyTo,\n cc: e.cc,\n bcc: e.bcc,\n tags: e.tags,\n attachments: e.attachments,\n scheduled_at: e.scheduledAt,\n })),\n });\n }\n\n // ── Domains ───────────────────────────────────────────────────────────────\n\n /** List all domains on this account. */\n async listDomains(): Promise<{ domains: EmailDomain[] }> {\n return this.request('GET', '/api/v1/email/domains');\n }\n\n /** Add a domain and get the DNS records to configure. */\n async addDomain(domain: string): Promise<EmailDomain> {\n return this.request('POST', '/api/v1/email/domains', { domain });\n }\n\n /** Trigger re-verification of a domain's DNS records. */\n async verifyDomain(domainId: string): Promise<EmailDomain> {\n return this.request('POST', `/api/v1/email/domains/${domainId}`);\n }\n\n /** Remove a domain from the account. */\n async deleteDomain(domainId: string): Promise<{ success: boolean }> {\n return this.request('DELETE', `/api/v1/email/domains/${domainId}`);\n }\n\n // ── Usage ─────────────────────────────────────────────────────────────────\n\n /** Get send/delivery stats for a date range. */\n async getUsage(options?: { startDate?: string; endDate?: string }): Promise<UsageStats> {\n const params = new URLSearchParams();\n if (options?.startDate) params.set('start_date', options.startDate);\n if (options?.endDate) params.set('end_date', options.endDate);\n const qs = params.toString();\n return this.request('GET', `/api/v1/email/usage${qs ? `?${qs}` : ''}`);\n }\n\n // ── SMTP ──────────────────────────────────────────────────────────────────\n\n /**\n * Generate SMTP credentials — useful for services like Supabase Auth or\n * any system that only supports SMTP.\n */\n async generateSmtpCredentials(): Promise<SmtpCredentials> {\n return this.request('POST', '/api/v1/email/smtp-credentials');\n }\n}\n\n// ============================================================================\n// Module-level convenience\n// ============================================================================\n\nlet _defaultClient: HivekuEmail | null = null;\n\n/** Initialize the default module-level client. */\nexport function init(apiKey: string, config?: Omit<HivekuEmailConfig, 'apiKey'>): void {\n _defaultClient = new HivekuEmail({ apiKey, ...config });\n}\n\nfunction getDefault(): HivekuEmail {\n if (!_defaultClient) {\n _defaultClient = new HivekuEmail();\n }\n return _defaultClient;\n}\n\n/** Send an email using the module-level default client. */\nexport function sendEmail(options: SendEmailOptions): Promise<SendEmailResponse> {\n return getDefault().send(options);\n}\n\nexport default HivekuEmail;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hiveku-apps/email",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Official Node.js SDK for the Hiveku Transactional Email Service",
5
5
  "keywords": ["email", "transactional", "hiveku", "sdk", "smtp"],
6
6
  "homepage": "https://hiveku.com",