@visulima/email
Version:
A comprehensive email library with multi-provider support, crypto utilities, and template engines
2 lines (1 loc) • 4.84 kB
JavaScript
var P=Object.defineProperty;var h=(o,a)=>P(o,"name",{value:a,configurable:!0});import{createRequire as A}from"node:module";import d from"./EmailError-zm2ffVav.js";import S from"./RequiredOptionError-CevW3u2K.js";import _ from"./generateMessageId-11Ls5JsR.js";import k from"./headersToRecord-BKUTr40L.js";import{makeRequest as p}from"./makeRequest-DwxHX0xo.js";import y from"./retry-D1MBqS49.js";import E from"./validateEmailOptions-BzlJECG5.js";import{defineProvider as $}from"./defineProvider-B9rSklAJ.js";import{c as B,P as q,h as b}from"./provider-base-_hbWXBdK.js";import{f,a as v}from"./address-formatter-Cm_E_ZMa.js";const j=A(import.meta.url),m=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,T=h(o=>{if(typeof m<"u"&&m.versions&&m.versions.node){const[a,c]=m.versions.node.split(".").map(Number);if(a>22||a===22&&c>=3||a===20&&c>=16)return m.getBuiltinModule(o)}return j(o)},"__cjs_getBuiltinModule"),{Buffer:C}=T("node:buffer"),i="brevo",z="https://api.brevo.com/v3",K=3e4,x=3,V=$((o={})=>{if(!o.apiKey)throw new S(i,"apiKey");const a={apiKey:o.apiKey,debug:o.debug||!1,endpoint:o.endpoint||z,retries:o.retries||x,timeout:o.timeout||K,...o.logger&&{logger:o.logger}},c=new q,n=B(i,o.logger);return{endpoint:a.endpoint,features:{attachments:!0,batchSending:!0,customHeaders:!0,html:!0,replyTo:!0,scheduling:!0,tagging:!0,templates:!0,tracking:!0},async getEmail(e){try{if(!e)return{error:new d(i,"Email ID is required to retrieve email details"),success:!1};await c.ensureInitialized(()=>this.initialize(),i);const r={"api-key":a.apiKey,"Content-Type":"application/json"};n.debug("Retrieving email details",{id:e});const t=await y(async()=>p(`${a.endpoint}/smtp/emails/${e}`,{headers:r,method:"GET",timeout:a.timeout}),a.retries);return t.success?(n.debug("Email details retrieved successfully"),{data:t.data?.body,success:!0}):(n.debug("API request failed when retrieving email",t.error),{error:new d(i,`Failed to retrieve email: ${t.error instanceof Error?t.error.message:"Unknown error"}`,{cause:t.error}),success:!1})}catch(r){return{error:b(i,"retrieve email",r,n),success:!1}}},async initialize(){await c.ensureInitialized(async()=>{if(!await this.isAvailable())throw new d(i,"Brevo API not available or invalid API key");n.debug("Provider initialized successfully")},i)},async isAvailable(){try{const e={"api-key":a.apiKey,"Content-Type":"application/json"};n.debug("Checking Brevo API availability");const r=await p(`${a.endpoint}/account`,{headers:e,method:"GET",timeout:a.timeout});return n.debug("Brevo API availability check response:",{error:r.error instanceof Error?r.error.message:void 0,statusCode:r.data?.statusCode,success:r.success}),!!(r.success&&r.data&&typeof r.data=="object"&&"statusCode"in r.data&&typeof r.data.statusCode=="number"&&r.data.statusCode>=200&&r.data.statusCode<300)}catch(e){return n.debug("Error checking availability:",e),!1}},name:i,options:a,async sendEmail(e){try{const r=E(e);if(r.length>0)return{error:new d(i,`Invalid email options: ${r.join(", ")}`),success:!1};await c.ensureInitialized(()=>this.initialize(),i);const t={sender:v(e.from),subject:e.subject,to:f(e.to)};if(e.html&&(t.htmlContent=e.html),e.text&&(t.textContent=e.text),e.cc&&(t.cc=f(e.cc)),e.bcc&&(t.bcc=f(e.bcc)),e.replyTo&&(t.replyTo=v(e.replyTo)),e.templateId&&(t.templateId=e.templateId,e.templateParams&&(t.params=e.templateParams)),e.tags&&e.tags.length>0&&(t.tags=e.tags),e.scheduledAt){const s=typeof e.scheduledAt=="number"?new Date(e.scheduledAt*1e3).toISOString():e.scheduledAt;t.scheduledAt=s}if(e.batchId&&(t.batchId=e.batchId),e.headers){const s=k(e.headers);t.headers=s}e.attachments&&e.attachments.length>0&&(t.attachment=await Promise.all(e.attachments.map(async s=>{let u;if(s.content)if(typeof s.content=="string")u=s.content;else if(s.content instanceof Promise){const I=await s.content;u=C.from(I).toString("base64")}else u=s.content.toString("base64");else if(s.raw)u=typeof s.raw=="string"?s.raw:s.raw.toString("base64");else throw new d(i,`Attachment ${s.filename} has no content`);return{content:u,name:s.filename,...s.contentType&&{type:s.contentType}}}))),n.debug("Sending email via Brevo API",{subject:t.subject,to:t.to});const w={"api-key":a.apiKey,"Content-Type":"application/json"},l=await y(async()=>p(`${a.endpoint}/smtp/email`,{headers:w,method:"POST",timeout:a.timeout},JSON.stringify(t)),a.retries);if(!l.success)return n.debug("API request failed when sending email",l.error),{error:l.error||new d(i,"Failed to send email"),success:!1};const g=l.data?.body?.messageId||_();return n.debug("Email sent successfully",{messageId:g}),{data:{messageId:g,provider:i,response:l.data,sent:!0,timestamp:new Date},success:!0}}catch(r){return{error:b(i,"send email",r,n),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{V as default};