@visulima/email 2.1.7 → 2.1.8

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.
Files changed (120) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/crypto/index.js +1 -1
  3. package/dist/deliverability/dmarc-report.js +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/middleware/index.js +1 -1
  7. package/dist/packem_shared/{DkimSigner-sLcIw9bp.js → DkimSigner-udCl3JXO.js} +1 -1
  8. package/dist/packem_shared/{DraftMailMessage-C3YTXqWo.js → DraftMailMessage-BgP1OF1G.js} +1 -1
  9. package/dist/packem_shared/EmailError-2CCyVX1S.js +1 -0
  10. package/dist/packem_shared/Mail-DduRntbB.js +1 -0
  11. package/dist/packem_shared/{MailMessage-DuEXJiCg.js → MailMessage-BRBT4Jea.js} +1 -1
  12. package/dist/packem_shared/{RequiredOptionError-DU2lxzk3.js → RequiredOptionError-BmpC5whN.js} +1 -1
  13. package/dist/packem_shared/{SmimeEncrypter-CzTbQM-z.js → SmimeEncrypter-Dm9McVTQ.js} +1 -1
  14. package/dist/packem_shared/{SmimeSigner-DjLShaOw.js → SmimeSigner-B6hkacNk.js} +1 -1
  15. package/dist/packem_shared/{address-formatter-BWR2Dddx.js → address-formatter-bfmGfQ83.js} +1 -1
  16. package/dist/packem_shared/{ahaSendProvider-br1yB2un.js → ahaSendProvider-C6nBGCCa.js} +1 -1
  17. package/dist/packem_shared/{arcMessageSignatureBase-D54jQIWu.js → arcMessageSignatureBase-B2uArM48.js} +1 -1
  18. package/dist/packem_shared/{attachment-processor-D1cbAhQi.js → attachment-processor-DjbjtJ6H.js} +1 -1
  19. package/dist/packem_shared/{autoSendProvider-BSP8ueOC.js → autoSendProvider-Dhig--Zo.js} +1 -1
  20. package/dist/packem_shared/{awsSesProvider-zRICW1pH.js → awsSesProvider-CMqAmU5N.js} +1 -1
  21. package/dist/packem_shared/{azureProvider-DwN4c5dC.js → azureProvider-C-bNOOil.js} +1 -1
  22. package/dist/packem_shared/{brevoProvider-C491beE_.js → brevoProvider-CkOjDyir.js} +1 -1
  23. package/dist/packem_shared/build-mime-message-t8KYiQkO.js +3 -0
  24. package/dist/packem_shared/{circuitBreakerMiddleware-N0CKF90q.js → circuitBreakerMiddleware-BSCPR72q.js} +1 -1
  25. package/dist/packem_shared/{cloudflareEmailProvider-8JxzLbpX.js → cloudflareEmailProvider-RCixPWnY.js} +1 -1
  26. package/dist/packem_shared/{createTestEmail-D_ksEez3.js → createTestEmail-XiF5E8vJ.js} +1 -1
  27. package/dist/packem_shared/{detectMimeType-CmYmWDXE.js → detectMimeType-B9_7ujpC.js} +1 -1
  28. package/dist/packem_shared/{failoverProvider-6qwE_HSJ.js → failoverProvider-BkOOP7pt.js} +1 -1
  29. package/dist/packem_shared/{httpProvider-BqrdZhGw.js → httpProvider-6idLfv-f.js} +1 -1
  30. package/dist/packem_shared/index-y0s2wQdc.js +11 -0
  31. package/dist/packem_shared/{infobipProvider-C2FU6VMP.js → infobipProvider-CHHsqRXy.js} +1 -1
  32. package/dist/packem_shared/{isValidSigningCertUrl-DNxPA0Q-.js → isValidSigningCertUrl-D7PuiRW4.js} +1 -1
  33. package/dist/packem_shared/{loopsProvider-Bz63so6m.js → loopsProvider-Cl-dOuCN.js} +1 -1
  34. package/dist/packem_shared/{mail.d-xKtvoKMK.d.ts → mail.d-B9JyPxzq.d.ts} +1 -0
  35. package/dist/packem_shared/{mailCrabProvider-bkQy-2a1.js → mailCrabProvider-De2YxPlF.js} +1 -1
  36. package/dist/packem_shared/{mailPaceProvider-S1AB-AYq.js → mailPaceProvider-DwNTuFb2.js} +1 -1
  37. package/dist/packem_shared/{mailchannelsProvider-B_K6X4VY.js → mailchannelsProvider-Dwl0Typz.js} +1 -1
  38. package/dist/packem_shared/{mailerSendProvider-DPEww2H1.js → mailerSendProvider-CyMIbqGq.js} +1 -1
  39. package/dist/packem_shared/{mailgunProvider-DKxzVbDW.js → mailgunProvider-DWKJYRKT.js} +1 -1
  40. package/dist/packem_shared/{mailjetProvider-C2TQcujL.js → mailjetProvider-DXPJQO1G.js} +1 -1
  41. package/dist/packem_shared/{mailomatProvider-B8-5bQsu.js → mailomatProvider-DopZk27y.js} +1 -1
  42. package/dist/packem_shared/{mailtrapProvider-DW7TLOdG.js → mailtrapProvider-CTg4z3GN.js} +1 -1
  43. package/dist/packem_shared/{make-request-CylyuRaN.js → make-request-CDhxj-9b.js} +1 -1
  44. package/dist/packem_shared/{mandrillProvider-S-0lKNGd.js → mandrillProvider-CAQeMtU_.js} +1 -1
  45. package/dist/packem_shared/{mockProvider-BAl292mW.js → mockProvider-EcpYlg-_.js} +1 -1
  46. package/dist/packem_shared/{netcoreProvider-DajMprlo.js → netcoreProvider-ua1avx07.js} +1 -1
  47. package/dist/packem_shared/{nodemailerProvider-DRo0lJ6g.js → nodemailerProvider-BZmQfKlM.js} +1 -1
  48. package/dist/packem_shared/{opentelemetryProvider-C6spx2CD.js → opentelemetryProvider-CAfWpywa.js} +1 -1
  49. package/dist/packem_shared/{outlook365Provider-B0o7UZBW.js → outlook365Provider-SFYELGDr.js} +1 -1
  50. package/dist/packem_shared/{plunkProvider-DJzEUEtU.js → plunkProvider-9amwuQri.js} +1 -1
  51. package/dist/packem_shared/{postalProvider-DHFjFE3Y.js → postalProvider-CeF3TOIW.js} +1 -1
  52. package/dist/packem_shared/{postmarkProvider-Dt1EGGBA.js → postmarkProvider-BPgKEkgF.js} +1 -1
  53. package/dist/packem_shared/{provider-base-DjPzWncP.js → provider-base-B-xhQSqE.js} +1 -1
  54. package/dist/packem_shared/{resendProvider-qjI86j_d.js → resendProvider-C9_sM8bH.js} +1 -1
  55. package/dist/packem_shared/{retry-CG9iT2wF.js → retry-D1Rh-6Z4.js} +1 -1
  56. package/dist/packem_shared/{roundRobinProvider-CO5YvhgR.js → roundRobinProvider-BPzLWZf-.js} +1 -1
  57. package/dist/packem_shared/{scalewayProvider-CihQKhw6.js → scalewayProvider-DfC7275i.js} +1 -1
  58. package/dist/packem_shared/{sendGridProvider-Dkc5AKlC.js → sendGridProvider-CUBBHBzs.js} +1 -1
  59. package/dist/packem_shared/smtpProvider-9nBSGtQl.js +27 -0
  60. package/dist/packem_shared/{sparkpostProvider-CKxQhpyB.js → sparkpostProvider-Be_d7S8o.js} +1 -1
  61. package/dist/packem_shared/{sweegoProvider-DjmAs6La.js → sweegoProvider-CP1cNC-d.js} +1 -1
  62. package/dist/packem_shared/{verifySendGridWebhook-1l9bqIMw.js → verifySendGridWebhook-DtFMgBRP.js} +1 -1
  63. package/dist/packem_shared/{withSuppression-BoaO4Qdz.js → withSuppression-wDl4NTb-.js} +1 -1
  64. package/dist/packem_shared/{zeptomailProvider-DSTC9pUi.js → zeptomailProvider-BZ0fK0Lk.js} +1 -1
  65. package/dist/providers/ahasend/index.js +1 -1
  66. package/dist/providers/autosend/index.js +1 -1
  67. package/dist/providers/aws-ses/index.js +1 -1
  68. package/dist/providers/azure/index.js +1 -1
  69. package/dist/providers/brevo/index.js +1 -1
  70. package/dist/providers/cloudflare-email/index.js +1 -1
  71. package/dist/providers/failover/index.js +1 -1
  72. package/dist/providers/http/index.js +1 -1
  73. package/dist/providers/infobip/index.js +1 -1
  74. package/dist/providers/loops/index.js +1 -1
  75. package/dist/providers/mailchannels/index.js +1 -1
  76. package/dist/providers/mailcrab/index.js +1 -1
  77. package/dist/providers/mailersend/index.js +1 -1
  78. package/dist/providers/mailgun/index.js +1 -1
  79. package/dist/providers/mailjet/index.js +1 -1
  80. package/dist/providers/mailomat/index.js +1 -1
  81. package/dist/providers/mailpace/index.js +1 -1
  82. package/dist/providers/mailtrap/index.js +1 -1
  83. package/dist/providers/mandrill/index.js +1 -1
  84. package/dist/providers/mock/index.js +1 -1
  85. package/dist/providers/netcore/index.js +1 -1
  86. package/dist/providers/nodemailer/index.js +1 -1
  87. package/dist/providers/opentelemetry/index.js +1 -1
  88. package/dist/providers/outlook365/index.js +1 -1
  89. package/dist/providers/plunk/index.js +1 -1
  90. package/dist/providers/postal/index.js +1 -1
  91. package/dist/providers/postmark/index.js +1 -1
  92. package/dist/providers/resend/index.js +1 -1
  93. package/dist/providers/roundrobin/index.js +1 -1
  94. package/dist/providers/scaleway/index.js +1 -1
  95. package/dist/providers/sendgrid/index.js +1 -1
  96. package/dist/providers/smtp/index.js +1 -1
  97. package/dist/providers/sparkpost/index.js +1 -1
  98. package/dist/providers/sweego/index.js +1 -1
  99. package/dist/providers/zeptomail/index.js +1 -1
  100. package/dist/render/css-inline.js +1 -1
  101. package/dist/template-engines/handlebars.js +1 -1
  102. package/dist/template-engines/html-to-text.js +1 -1
  103. package/dist/template-engines/i18n.js +1 -1
  104. package/dist/template-engines/jsx-email.js +1 -1
  105. package/dist/template-engines/liquid.js +1 -1
  106. package/dist/template-engines/mjml.js +1 -1
  107. package/dist/template-engines/react-email.js +1 -1
  108. package/dist/template-engines/vue-email.js +1 -1
  109. package/dist/test/index.d.ts +1 -1
  110. package/dist/test/index.js +1 -1
  111. package/dist/utils/format-email-address.js +1 -1
  112. package/dist/utils/parse-eml.js +3 -3
  113. package/dist/utils/result.js +1 -1
  114. package/dist/webhooks/index.js +1 -1
  115. package/package.json +1 -1
  116. package/dist/packem_shared/EmailError-CDvYwuqz.js +0 -1
  117. package/dist/packem_shared/Mail-CIyxkmxu.js +0 -1
  118. package/dist/packem_shared/build-mime-message-DT67qfMp.js +0 -3
  119. package/dist/packem_shared/index-Gd7m-UQA.js +0 -11
  120. package/dist/packem_shared/smtpProvider-CIXMxPu-.js +0 -25
@@ -1 +1 @@
1
- import c from"./EmailError-CDvYwuqz.js";import p from"./RequiredOptionError-DU2lxzk3.js";import{e as w}from"./generate-message-id-gXAuMz4g.js";import{s as v}from"./headers-to-record-De1Eg951.js";import{m as f}from"./make-request-CylyuRaN.js";import{i as g}from"./retry-CG9iT2wF.js";import{f as I}from"./validate-email-options-mCM9dVug.js";import{defineProvider as A}from"./defineProvider-C9q-7iwt.js";import{P,h,c as j}from"./provider-base-DjPzWncP.js";import{f as d,a as T}from"./address-formatter-BWR2Dddx.js";import{p as S}from"./attachment-processor-D1cbAhQi.js";const r="scaleway",k="https://api.scaleway.com/transactional-email/v1alpha1",E=3e4,z=3,H=A((a={})=>{if(!a.apiKey)throw new p(r,"apiKey");if(!a.region)throw new p(r,"region");const y=a.endpoint??k,i={apiKey:a.apiKey,debug:a.debug??!1,endpoint:y,region:a.region,retries:a.retries??z,timeout:a.timeout??E,...a.logger&&{logger:a.logger}},m=new P,s=j(r,a.logger);return{features:{attachments:!0,batchSending:!1,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!1,templates:!0,tracking:!1},async getEmail(e){try{if(!e)return{error:new c(r,"Email ID is required to retrieve email details"),success:!1};await m.ensureInitialized(()=>this.initialize(),r);const n={"Content-Type":"application/json","X-Auth-Token":i.apiKey};s.debug("Retrieving email details",{id:e});const t=await g(async()=>f(`${i.endpoint}/regions/${i.region}/emails/${e}`,{headers:n,method:"GET",timeout:i.timeout}),i.retries);return t.success?(s.debug("Email details retrieved successfully"),{data:t.data?.body,success:!0}):(s.debug("API request failed when retrieving email",t.error),{error:new c(r,`Failed to retrieve email: ${t.error instanceof Error?t.error.message:"Unknown error"}`,{cause:t.error}),success:!1})}catch(n){return{error:h(r,"retrieve email",n,s),success:!1}}},async initialize(){await m.ensureInitialized(async()=>{if(!await this.isAvailable())throw new c(r,"Scaleway API not available or invalid API key");s.debug("Provider initialized successfully")},r)},async isAvailable(){try{return s.debug("Checking Scaleway API availability"),!0}catch(e){return s.debug("Error checking availability:",e),!1}},name:r,options:i,async sendEmail(e){try{const n=I(e);if(n.length>0)return{error:new c(r,`Invalid email options: ${n.join(", ")}`),success:!1};await m.ensureInitialized(()=>this.initialize(),r);const t={from:{email:e.from.email,...e.from.name&&{name:e.from.name}},subject:e.subject,to:d(e.to)};if(e.html&&(t.html=e.html),e.text&&(t.text=e.text),e.cc&&(t.cc=d(e.cc)),e.bcc&&(t.bcc=d(e.bcc)),e.replyTo&&(t.replyTo=T(e.replyTo)),e.templateId&&(t.templateId=e.templateId,e.templateVariables&&(t.templateVariables=e.templateVariables)),e.projectId&&(t.projectId=e.projectId),e.headers){const l=v(e.headers);t.headers=l}e.attachments&&e.attachments.length>0&&(t.attachments=await Promise.all(e.attachments.map(async l=>({content:await S(l,r),name:l.filename,type:l.contentType??"application/octet-stream"})))),s.debug("Sending email via Scaleway API",{subject:t.subject,to:t.to});const b={"Content-Type":"application/json","X-Auth-Token":i.apiKey},o=await g(async()=>f(`${i.endpoint}/regions/${i.region}/emails`,{headers:b,method:"POST",timeout:i.timeout},JSON.stringify(t)),i.retries);if(!o.success)return s.debug("API request failed when sending email",o.error),{error:o.error??new c(r,"Failed to send email"),success:!1};const u=o.data?.body?.id??w();return s.debug("Email sent successfully",{messageId:u}),{data:{messageId:u,provider:r,response:o.data,sent:!0,timestamp:new Date},success:!0}}catch(n){return{error:h(r,"send email",n,s),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{H as default};
1
+ import c from"./EmailError-2CCyVX1S.js";import p from"./RequiredOptionError-BmpC5whN.js";import{e as w}from"./generate-message-id-gXAuMz4g.js";import{s as v}from"./headers-to-record-De1Eg951.js";import{m as f}from"./make-request-CDhxj-9b.js";import{i as g}from"./retry-D1Rh-6Z4.js";import{f as I}from"./validate-email-options-mCM9dVug.js";import{defineProvider as A}from"./defineProvider-C9q-7iwt.js";import{P,h,c as j}from"./provider-base-B-xhQSqE.js";import{f as d,a as T}from"./address-formatter-bfmGfQ83.js";import{p as S}from"./attachment-processor-DjbjtJ6H.js";const r="scaleway",k="https://api.scaleway.com/transactional-email/v1alpha1",E=3e4,z=3,H=A((a={})=>{if(!a.apiKey)throw new p(r,"apiKey");if(!a.region)throw new p(r,"region");const y=a.endpoint??k,i={apiKey:a.apiKey,debug:a.debug??!1,endpoint:y,region:a.region,retries:a.retries??z,timeout:a.timeout??E,...a.logger&&{logger:a.logger}},m=new P,s=j(r,a.logger);return{features:{attachments:!0,batchSending:!1,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!1,templates:!0,tracking:!1},async getEmail(e){try{if(!e)return{error:new c(r,"Email ID is required to retrieve email details"),success:!1};await m.ensureInitialized(()=>this.initialize(),r);const n={"Content-Type":"application/json","X-Auth-Token":i.apiKey};s.debug("Retrieving email details",{id:e});const t=await g(async()=>f(`${i.endpoint}/regions/${i.region}/emails/${e}`,{headers:n,method:"GET",timeout:i.timeout}),i.retries);return t.success?(s.debug("Email details retrieved successfully"),{data:t.data?.body,success:!0}):(s.debug("API request failed when retrieving email",t.error),{error:new c(r,`Failed to retrieve email: ${t.error instanceof Error?t.error.message:"Unknown error"}`,{cause:t.error}),success:!1})}catch(n){return{error:h(r,"retrieve email",n,s),success:!1}}},async initialize(){await m.ensureInitialized(async()=>{if(!await this.isAvailable())throw new c(r,"Scaleway API not available or invalid API key");s.debug("Provider initialized successfully")},r)},async isAvailable(){try{return s.debug("Checking Scaleway API availability"),!0}catch(e){return s.debug("Error checking availability:",e),!1}},name:r,options:i,async sendEmail(e){try{const n=I(e);if(n.length>0)return{error:new c(r,`Invalid email options: ${n.join(", ")}`),success:!1};await m.ensureInitialized(()=>this.initialize(),r);const t={from:{email:e.from.email,...e.from.name&&{name:e.from.name}},subject:e.subject,to:d(e.to)};if(e.html&&(t.html=e.html),e.text&&(t.text=e.text),e.cc&&(t.cc=d(e.cc)),e.bcc&&(t.bcc=d(e.bcc)),e.replyTo&&(t.replyTo=T(e.replyTo)),e.templateId&&(t.templateId=e.templateId,e.templateVariables&&(t.templateVariables=e.templateVariables)),e.projectId&&(t.projectId=e.projectId),e.headers){const l=v(e.headers);t.headers=l}e.attachments&&e.attachments.length>0&&(t.attachments=await Promise.all(e.attachments.map(async l=>({content:await S(l,r),name:l.filename,type:l.contentType??"application/octet-stream"})))),s.debug("Sending email via Scaleway API",{subject:t.subject,to:t.to});const b={"Content-Type":"application/json","X-Auth-Token":i.apiKey},o=await g(async()=>f(`${i.endpoint}/regions/${i.region}/emails`,{headers:b,method:"POST",timeout:i.timeout},JSON.stringify(t)),i.retries);if(!o.success)return s.debug("API request failed when sending email",o.error),{error:o.error??new c(r,"Failed to send email"),success:!1};const u=o.data?.body?.id??w();return s.debug("Email sent successfully",{messageId:u}),{data:{messageId:u,provider:r,response:o.data,sent:!0,timestamp:new Date},success:!0}}catch(n){return{error:h(r,"send email",n,s),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{H as default};
@@ -1 +1 @@
1
- import l from"./EmailError-CDvYwuqz.js";import A from"./RequiredOptionError-DU2lxzk3.js";import{e as P}from"./generate-message-id-gXAuMz4g.js";import{s as S}from"./headers-to-record-De1Eg951.js";import{m as h}from"./make-request-CylyuRaN.js";import{i as b}from"./retry-CG9iT2wF.js";import{f as j}from"./validate-email-options-mCM9dVug.js";import{defineProvider as G}from"./defineProvider-C9q-7iwt.js";import{P as k,h as v,c as z}from"./provider-base-DjPzWncP.js";import{f,a as I}from"./address-formatter-BWR2Dddx.js";import{d as C}from"./attachment-processor-D1cbAhQi.js";const s="sendgrid",E="https://api.sendgrid.com/v3",_=3e4,T=3,L=G((o={})=>{if(!o.apiKey)throw new A(s,"apiKey");const a={apiKey:o.apiKey,debug:o.debug??!1,endpoint:o.endpoint??E,...o.logger&&{logger:o.logger},retries:o.retries??T,timeout:o.timeout??_},p=new k,i=z(s,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 l(s,"Email ID is required to retrieve email details"),success:!1};await p.ensureInitialized(()=>this.initialize(),s);const t={Authorization:`Bearer ${a.apiKey}`,"Content-Type":"application/json"};i.debug("Retrieving email details",{id:e});const r=await b(async()=>h(`${a.endpoint}/messages/${e}`,{headers:t,method:"GET",timeout:a.timeout}),a.retries);return r.success?(i.debug("Email details retrieved successfully"),{data:r.data?.body,success:!0}):(i.debug("API request failed when retrieving email",r.error),{error:new l(s,`Failed to retrieve email: ${r.error instanceof Error?r.error.message:"Unknown error"}`,{cause:r.error}),success:!1})}catch(t){return{error:v(s,"retrieve email",t,i),success:!1}}},async initialize(){await p.ensureInitialized(async()=>{if(!await this.isAvailable())throw new l(s,"SendGrid API not available or invalid API key");i.debug("Provider initialized successfully")},s)},async isAvailable(){try{if(a.apiKey&&a.apiKey.startsWith("SG."))return i.debug("API key format is valid, assuming SendGrid is available"),!0;const e={Authorization:`Bearer ${a.apiKey}`,"Content-Type":"application/json"};i.debug("Checking SendGrid API availability");const t=await h(`${a.endpoint}/user/profile`,{headers:e,method:"GET",timeout:a.timeout});return i.debug("SendGrid API availability check response:",{error:t.error instanceof Error?t.error.message:void 0,statusCode:t.data?.statusCode,success:t.success}),!!(t.success&&t.data&&typeof t.data=="object"&&"statusCode"in t.data&&typeof t.data.statusCode=="number"&&t.data.statusCode>=200&&t.data.statusCode<300)}catch(e){return i.debug("Error checking availability:",e),!1}},name:s,options:a,async sendEmail(e){try{const t=j(e);if(t.length>0)return{error:new l(s,`Invalid email options: ${t.join(", ")}`),success:!1};await p.ensureInitialized(()=>this.initialize(),s);const r={to:f(e.to)};if(e.cc&&(r.cc=f(e.cc)),e.bcc&&(r.bcc=f(e.bcc)),e.subject&&(r.subject=e.subject),e.tags&&e.tags.length>0){const d={};for(let m=0;m<e.tags.length;m+=1)d[`tag_${m}`]=e.tags[m];r.customArgs=d}const n={from:I(e.from),personalizations:[r]},u=[];if(e.html&&u.push({type:"text/html",value:e.html}),e.text&&u.push({type:"text/plain",value:e.text}),u.length>0&&(n.content=u),e.replyTo&&(n.reply_to=I(e.replyTo)),e.subject&&(n.subject=e.subject),e.templateId&&(n.template_id=e.templateId,e.templateData&&(r.dynamicTemplateData=e.templateData)),e.sendAt&&(r.send_at=e.sendAt),e.batchId&&(n.batch_id=e.batchId),e.asmGroupId&&(n.asm={group_id:e.asmGroupId}),e.ipPoolName&&(n.ip_pool_name=e.ipPoolName),e.mailSettings&&(n.mail_settings=e.mailSettings),e.trackingSettings&&(n.tracking_settings=e.trackingSettings),e.headers){const d=S(e.headers);n.headers=d}e.attachments&&e.attachments.length>0&&(n.attachments=await Promise.all(e.attachments.map(async d=>C(d,s)))),i.debug("Sending email via SendGrid API",{subject:n.subject,to:r.to});const w={Authorization:`Bearer ${a.apiKey}`,"Content-Type":"application/json"},c=await b(async()=>h(`${a.endpoint}/mail/send`,{headers:w,method:"POST",timeout:a.timeout},JSON.stringify(n)),a.retries);if(!c.success)return i.debug("API request failed when sending email",c.error),{error:c.error??new l(s,"Failed to send email"),success:!1};const g=c.data?.headers,y=(g&&g instanceof Headers?g.get("X-Message-Id"):void 0)??P();return i.debug("Email sent successfully",{messageId:y}),{data:{messageId:y,provider:s,response:c.data,sent:!0,timestamp:new Date},success:!0}}catch(t){return{error:v(s,"send email",t,i),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{L as default};
1
+ import l from"./EmailError-2CCyVX1S.js";import A from"./RequiredOptionError-BmpC5whN.js";import{e as P}from"./generate-message-id-gXAuMz4g.js";import{s as S}from"./headers-to-record-De1Eg951.js";import{m as h}from"./make-request-CDhxj-9b.js";import{i as b}from"./retry-D1Rh-6Z4.js";import{f as j}from"./validate-email-options-mCM9dVug.js";import{defineProvider as G}from"./defineProvider-C9q-7iwt.js";import{P as k,h as v,c as z}from"./provider-base-B-xhQSqE.js";import{f,a as I}from"./address-formatter-bfmGfQ83.js";import{d as C}from"./attachment-processor-DjbjtJ6H.js";const s="sendgrid",E="https://api.sendgrid.com/v3",_=3e4,T=3,L=G((o={})=>{if(!o.apiKey)throw new A(s,"apiKey");const a={apiKey:o.apiKey,debug:o.debug??!1,endpoint:o.endpoint??E,...o.logger&&{logger:o.logger},retries:o.retries??T,timeout:o.timeout??_},p=new k,i=z(s,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 l(s,"Email ID is required to retrieve email details"),success:!1};await p.ensureInitialized(()=>this.initialize(),s);const t={Authorization:`Bearer ${a.apiKey}`,"Content-Type":"application/json"};i.debug("Retrieving email details",{id:e});const r=await b(async()=>h(`${a.endpoint}/messages/${e}`,{headers:t,method:"GET",timeout:a.timeout}),a.retries);return r.success?(i.debug("Email details retrieved successfully"),{data:r.data?.body,success:!0}):(i.debug("API request failed when retrieving email",r.error),{error:new l(s,`Failed to retrieve email: ${r.error instanceof Error?r.error.message:"Unknown error"}`,{cause:r.error}),success:!1})}catch(t){return{error:v(s,"retrieve email",t,i),success:!1}}},async initialize(){await p.ensureInitialized(async()=>{if(!await this.isAvailable())throw new l(s,"SendGrid API not available or invalid API key");i.debug("Provider initialized successfully")},s)},async isAvailable(){try{if(a.apiKey&&a.apiKey.startsWith("SG."))return i.debug("API key format is valid, assuming SendGrid is available"),!0;const e={Authorization:`Bearer ${a.apiKey}`,"Content-Type":"application/json"};i.debug("Checking SendGrid API availability");const t=await h(`${a.endpoint}/user/profile`,{headers:e,method:"GET",timeout:a.timeout});return i.debug("SendGrid API availability check response:",{error:t.error instanceof Error?t.error.message:void 0,statusCode:t.data?.statusCode,success:t.success}),!!(t.success&&t.data&&typeof t.data=="object"&&"statusCode"in t.data&&typeof t.data.statusCode=="number"&&t.data.statusCode>=200&&t.data.statusCode<300)}catch(e){return i.debug("Error checking availability:",e),!1}},name:s,options:a,async sendEmail(e){try{const t=j(e);if(t.length>0)return{error:new l(s,`Invalid email options: ${t.join(", ")}`),success:!1};await p.ensureInitialized(()=>this.initialize(),s);const r={to:f(e.to)};if(e.cc&&(r.cc=f(e.cc)),e.bcc&&(r.bcc=f(e.bcc)),e.subject&&(r.subject=e.subject),e.tags&&e.tags.length>0){const d={};for(let m=0;m<e.tags.length;m+=1)d[`tag_${m}`]=e.tags[m];r.customArgs=d}const n={from:I(e.from),personalizations:[r]},u=[];if(e.html&&u.push({type:"text/html",value:e.html}),e.text&&u.push({type:"text/plain",value:e.text}),u.length>0&&(n.content=u),e.replyTo&&(n.reply_to=I(e.replyTo)),e.subject&&(n.subject=e.subject),e.templateId&&(n.template_id=e.templateId,e.templateData&&(r.dynamicTemplateData=e.templateData)),e.sendAt&&(r.send_at=e.sendAt),e.batchId&&(n.batch_id=e.batchId),e.asmGroupId&&(n.asm={group_id:e.asmGroupId}),e.ipPoolName&&(n.ip_pool_name=e.ipPoolName),e.mailSettings&&(n.mail_settings=e.mailSettings),e.trackingSettings&&(n.tracking_settings=e.trackingSettings),e.headers){const d=S(e.headers);n.headers=d}e.attachments&&e.attachments.length>0&&(n.attachments=await Promise.all(e.attachments.map(async d=>C(d,s)))),i.debug("Sending email via SendGrid API",{subject:n.subject,to:r.to});const w={Authorization:`Bearer ${a.apiKey}`,"Content-Type":"application/json"},c=await b(async()=>h(`${a.endpoint}/mail/send`,{headers:w,method:"POST",timeout:a.timeout},JSON.stringify(n)),a.retries);if(!c.success)return i.debug("API request failed when sending email",c.error),{error:c.error??new l(s,"Failed to send email"),success:!1};const g=c.data?.headers,y=(g&&g instanceof Headers?g.get("X-Message-Id"):void 0)??P();return i.debug("Email sent successfully",{messageId:y}),{data:{messageId:y,provider:s,response:c.data,sent:!0,timestamp:new Date},success:!0}}catch(t){return{error:v(s,"send email",t,i),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{L as default};
@@ -0,0 +1,27 @@
1
+ import{createRequire as z}from"node:module";import f from"./EmailError-2CCyVX1S.js";import K from"./RequiredOptionError-BmpC5whN.js";import{j as Q}from"./build-mime-message-t8KYiQkO.js";import{e as V}from"./generate-message-id-gXAuMz4g.js";import{f as Z}from"./validate-email-options-mCM9dVug.js";import{defineProvider as J}from"./defineProvider-C9q-7iwt.js";let F;const B=i=>(F??=z(import.meta.url))(i),O=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,H=i=>{if(typeof O<"u"&&O.versions&&O.versions.node){const[t,m]=O.versions.node.split(".").map(Number);if(t>22||t===22&&m>=3||t===20&&m>=16)return O.getBuiltinModule(i)}return B(i)},{Buffer:I}=H("node:buffer"),{createHash:G,createSign:q,createHmac:W}=H("node:crypto"),{Socket:X,createConnection:Y}=H("node:net"),{connect:P}=H("node:tls"),ee=(i,t)=>new Promise(m=>{const w=new X,y=()=>{w.destroy(),m(!1)};w.setTimeout(1e3),w.on("error",y),w.on("timeout",y),w.connect(t,i,()=>{w.end(),m(!0)})}),te=i=>{const t=i.replaceAll(`\r
2
+ `,`
3
+ `).split(`
4
+ `).map(w=>w.replaceAll(/[ \t]+/g," ").replace(/ +$/,""));let m=t.length;for(;m>0&&t[m-1]==="";)m-=1;return m>0?`${t.slice(0,m).join(`\r
5
+ `)}\r
6
+ `:""},re=i=>{const t=i.indexOf(":");if(t===-1)return`${i.toLowerCase().trim()}:`;const m=i.slice(0,t).toLowerCase().trim(),w=i.slice(t+1).replaceAll(/\s+/g," ").trim();return`${m}:${w}`},se=(i,t)=>{const{domainName:m,keySelector:w,privateKey:y}=t,S=i.indexOf(`\r
7
+ \r
8
+ `);if(S===-1)return i;const R=i.slice(0,S),$=i.slice(S+4),A=R.split(`\r
9
+ `),L=te($),p=G("sha256").update(L).digest("base64"),v=["from","to","subject","date"],U=A.filter(a=>v.some(c=>a.toLowerCase().startsWith(`${c}:`))),N=U.map(a=>a.split(":")[0]?.toLowerCase()??"").filter(Boolean).join(":"),T=Math.floor(Date.now()/1e3),k={a:"rsa-sha256",bh:p,c:"relaxed/relaxed",d:m,h:N,s:w,t:T.toString(),v:"1"},C=`DKIM-Signature: ${Object.entries(k).map(([a,c])=>`${a}=${c}`).join("; ")}; b=`,e=[...U,C].map(a=>re(a)).join(`\r
10
+ `),n=q("RSA-SHA256");n.update(e);const o=n.sign(y,"base64");return`${`${C}${o}`}\r
11
+ ${A.join(`\r
12
+ `)}\r
13
+ \r
14
+ ${$}`},d="smtp",oe=25,ae=465,ie=1e4,ne=!1,ce=5,_=3e4,ue=/^\./,ge=J((i={})=>{if(!i.host)throw new K(d,"host");const t={authMethod:i.authMethod??"LOGIN",debug:i.debug??!1,dkim:i.dkim,host:i.host,maxConnections:i.maxConnections??ce,oauth2:i.oauth2,password:i.password,pool:i.pool??!1,port:i.port!==void 0?i.port:i.secure?ae:oe,rejectUnauthorized:i.rejectUnauthorized??!0,retries:i.retries??0,secure:i.secure??ne,timeout:i.timeout??ie,user:i.user,...i.logger&&{logger:i.logger}};let m=!1;const w=[],y=[];let S=0;const R=()=>{S+=1},$=()=>{S>0&&(S-=1)},A=e=>e.replaceAll(/[\r\n\t\v\f]/g," ").trim(),L=e=>{const n=e.split(`\r
15
+ `),o={};for(const a of n)if(a.startsWith("250-")||a.startsWith("250 ")){const c=a.slice(4).trim().split(" "),l=c[0];l&&(o[l]=c.slice(1))}return o},p=async(e,n,o)=>new Promise((a,c)=>{const l=Array.isArray(o)?o:[o];let s="",u="";const h=setTimeout(()=>{b(),c(new f(d,`Command timeout after ${t.timeout}ms: ${n?.slice(0,50)}...`))},t.timeout),b=()=>{e.removeListener("data",j),e.removeListener("error",r),h&&clearTimeout(h)},j=g=>{s+=g.toString();const M=s.split(`\r
16
+ `).filter(Boolean);if(M.length>0){const D=M.at(-1);if(D){const E=D.match(/^(\d{3})[\s-]/);if(E){const[,x]=E;u=x,D[3]===" "&&(b(),l.includes(u)?a(s):c(new f(d,`Expected ${l.join(" or ")}, got ${u}: ${s.trim()}`)))}}}},r=g=>{b(),c(new f(d,`Socket error: ${g.message}`,{cause:g}))};e.on("data",j),e.on("error",r),n&&e.write(`${n}\r
17
+ `)}),v=async()=>{if(t.pool&&w.length>0){const e=w.pop();if(e&&!e.destroyed)return e;e&&$()}return t.pool&&S>=t.maxConnections?new Promise((e,n)=>{const o={reject:n,resolve:e};o.timeout=setTimeout(()=>{const a=y.indexOf(o);a!==-1&&y.splice(a,1),n(new f(d,`Connection queue timeout after ${_}ms`))},_),y.push(o)}):new Promise((e,n)=>{let o,a=!1,c;const l=()=>{o&&clearTimeout(o)};o=setTimeout(()=>{a||(a=!0,c&&!c.destroyed&&c.destroy(),l(),n(new f(d,`Connection timeout to ${t.host}:${t.port} after ${t.timeout}ms`)))},t.timeout);try{c=t.secure?P({host:t.host,port:t.port,rejectUnauthorized:t.rejectUnauthorized}):Y(t.port,t.host),c.on("error",s=>{a||(a=!0,l(),n(new f(d,`Connection error: ${s.message}`,{cause:s})))}),c.once("data",s=>{if(!a&&c){a=!0,l();const u=s.toString();u.slice(0,3)==="220"?(R(),e(c)):(c.destroy(),n(new f(d,`Unexpected server greeting: ${u.trim()}`)))}})}catch(s){a||(a=!0,l(),n(new f(d,`Failed to create connection: ${s.message}`,{cause:s})))}})},U=async e=>new Promise((n,o)=>{let a,c=!1,l;const s=()=>{a&&clearTimeout(a)};a=setTimeout(()=>{c||(c=!0,l&&!l.destroyed&&l.destroy(),s(),o(new f(d,`TLS connection timeout after ${t.timeout}ms`)))},t.timeout);try{const u={host:t.host,rejectUnauthorized:t.rejectUnauthorized,socket:e};l=P(u),l.on("error",h=>{c||(c=!0,s(),o(new f(d,`TLS connection error: ${h.message}`,{cause:h})))}),l.once("secure",()=>{!c&&l&&(c=!0,s(),n(l))})}catch(u){c||(c=!0,s(),o(new f(d,`Failed to upgrade to TLS: ${u.message}`,{cause:u})))}}),N=e=>{if(e.destroyed||!t.pool){try{e.destroy()}catch{}$();return}if(y.length>0){const n=y.shift();if(n){clearTimeout(n.timeout),n.resolve(e);return}}w.push(e)},T=async(e,n=!1)=>{if(n){if(!e.destroyed)try{await p(e,"RSET","250")}catch{e.destroy()}N(e);return}await new Promise(o=>{try{$(),e.write(`QUIT\r
18
+ `),e.end(),e.once("close",()=>{o()})}catch{o()}})},k=async e=>{if(!t.user)return;const n=await p(e,`EHLO ${t.host}`,"250"),o=L(n),a=Object.keys(o).find(s=>s.toUpperCase()==="AUTH");if(!a&&(t.user||t.password))throw new f(d,"Server does not support authentication");const c=a?o[a]??[]:[];let{authMethod:l}=t;if(l||(c.includes("CRAM-MD5")?l="CRAM-MD5":c.includes("LOGIN")?l="LOGIN":c.includes("PLAIN")&&(l="PLAIN")),!l)throw new f(d,"No supported authentication methods");if(l==="OAUTH2"&&t.oauth2)try{const{accessToken:s,user:u}=t.oauth2,h=`user=${u}auth=Bearer ${s}`,b=I.from(h).toString("base64");await p(e,`AUTH XOAUTH2 ${b}`,"235");return}catch(s){const u=s.message;throw u.includes("535")||u.includes("Authentication failed")?new f(d,"Authentication failed: Invalid OAuth2 credentials"):s}if(l==="CRAM-MD5"&&t.password)try{const s=(await p(e,"AUTH CRAM-MD5","334")).split(" ")[1];if(!s)throw new f(d,"Invalid CRAM-MD5 challenge response");const u=I.from(s,"base64").toString("utf8"),h=W("md5",t.password);h.update(u);const b=h.digest("hex"),j=`${t.user} ${b}`;await p(e,I.from(j).toString("base64"),"235");return}catch(s){const u=s.message;throw u.includes("535")||u.includes("Authentication failed")?new f(d,"Authentication failed: Invalid username or password"):s}if(l==="LOGIN"&&t.password)try{await p(e,"AUTH LOGIN","334"),await p(e,I.from(t.user).toString("base64"),"334"),await p(e,I.from(t.password).toString("base64"),"235");return}catch(s){const u=s.message;throw u.includes("535")||u.includes("Authentication failed")?new f(d,"Authentication failed: Invalid username or password"):s}if(l==="PLAIN"&&t.password)try{const s=I.from(`\0${t.user}\0${t.password}`).toString("base64");await p(e,`AUTH PLAIN ${s}`,"235");return}catch(s){const u=s.message;throw u.includes("535")||u.includes("Authentication failed")?new f(d,"Authentication failed: Invalid username or password"):s}throw new f(d,"Authentication failed - no valid credentials or method")},C=e=>{if(!t.dkim)return e;try{return se(e,t.dkim)}catch(n){return console.error(`[${d}] DKIM signing error:`,n),e}};return{features:{attachments:!0,batchSending:t.pool,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!1,templates:!1,tracking:!1},async initialize(){if(!m)try{if(!await this.isAvailable())throw new f(d,`SMTP server not available at ${t.host}:${t.port}`);m=!0}catch(e){throw new f(d,`Failed to initialize: ${e.message}`,{cause:e})}},async isAvailable(){try{if(!await ee(t.host,t.port))return!1;const e=await v();return await T(e),!0}catch{return!1}},name:d,options:t,async sendEmail(e){try{const n=Z(e);if(n.length>0)return{error:new f(d,`Invalid email options: ${n.join(", ")}`),success:!1};m||await this.initialize();let o=await v();try{let a=L(await p(o,`EHLO ${t.host}`,"250"));if(!t.secure)try{const r=await p(o,`EHLO ${t.host}`,"250"),g=L(r);a=g,Object.keys(g).includes("STARTTLS")&&(await p(o,"STARTTLS","220"),o=await U(o),a=L(await p(o,`EHLO ${t.host}`,"250")))}catch(r){if(t.rejectUnauthorized)throw new f(d,`STARTTLS failed or not supported: ${r.message}`,{cause:r})}await k(o);const c=Object.keys(a).some(r=>r.toUpperCase()==="DSN");let l="";if(e.dsn&&c){const r=[];e.dsn.success&&r.push("SUCCESS"),e.dsn.failure&&r.push("FAILURE"),e.dsn.delay&&r.push("DELAY"),r.length>0&&(l=` NOTIFY=${r.join(",")}`)}await p(o,`MAIL FROM:<${e.from.email}>`,"250");const s=[];Array.isArray(e.to)?s.push(...e.to.map(r=>r.email)):s.push(e.to.email),e.cc&&(Array.isArray(e.cc)?s.push(...e.cc.map(r=>r.email)):s.push(e.cc.email)),e.bcc&&(Array.isArray(e.bcc)?s.push(...e.bcc.map(r=>r.email)):s.push(e.bcc.email));for(const r of s)await p(o,`RCPT TO:<${r}>${l}`,"250");await p(o,"DATA","354");let u=await Q(e);const h=[];if(e.dsn&&!c){const r=[];e.dsn.success&&r.push("SUCCESS"),e.dsn.failure&&r.push("FAILURE"),e.dsn.delay&&r.push("DELAY"),r.length>0&&h.push(`X-DSN-NOTIFY: ${r.join(",")}`)}if(e.priority){let r="";switch(e.priority){case"high":{r="1 (Highest)",h.push("Importance: High");break}case"low":{r="5 (Lowest)",h.push("Importance: Low");break}case"normal":{r="3 (Normal)",h.push("Importance: Normal");break}default:{r="3 (Normal)";break}}h.push(`X-Priority: ${r}`)}if(e.inReplyTo&&h.push(`In-Reply-To: ${A(e.inReplyTo)}`),e.references){const r=Array.isArray(e.references)?e.references.map(g=>A(g)).join(" "):A(e.references);h.push(`References: ${r}`)}if(e.listUnsubscribe){const r=Array.isArray(e.listUnsubscribe)?e.listUnsubscribe.map(g=>`<${A(g)}>`).join(", "):`<${A(e.listUnsubscribe)}>`;h.push(`List-Unsubscribe: ${r}`)}if(e.googleMailHeaders){const{googleMailHeaders:r}=e;r.feedbackId&&h.push(`Feedback-ID: ${A(r.feedbackId)}`),r.promotionalContent&&h.push("X-Google-Promotion: promotional"),r.category&&h.push(`X-Gmail-Labels: ${r.category}`)}if(h.length>0){const r=u.indexOf(`\r
19
+ \r
20
+ `);if(r!==-1){const g=u.slice(0,r),M=u.slice(r+4);u=`${g}\r
21
+ ${h.join(`\r
22
+ `)}\r
23
+ \r
24
+ ${M}`}}t.dkim&&(e.useDkim||e.useDkim===void 0)&&(u=C(u));const b=u.replaceAll(`\r
25
+ .`,`\r
26
+ ..`).replace(ue,"..");await p(o,`${b}\r
27
+ .`,"250");const j=V();return await T(o,t.pool),{data:{messageId:j,provider:d,response:"Message accepted",sent:!0,timestamp:new Date},success:!0}}catch(a){try{await T(o)}catch{}throw a}}catch(n){return{error:new f(d,`Failed to send email: ${n.message}`,{cause:n}),success:!1}}},async shutdown(){for(const e of w)try{await T(e)}catch{}w.length=0;for(const e of y)clearTimeout(e.timeout),e.reject(new Error("Provider shutdown"));y.length=0},async validateCredentials(){try{if(!await this.isAvailable())return!1;let e=await v();try{if(await p(e,`EHLO ${t.host}`,"250"),!t.secure)try{const n=await p(e,`EHLO ${t.host}`,"250"),o=L(n);Object.keys(o).includes("STARTTLS")&&(await p(e,"STARTTLS","220"),e=await U(e),await p(e,`EHLO ${t.host}`,"250"))}catch{if(t.rejectUnauthorized)return await T(e),!1}return await k(e),await T(e),!0}catch{return await T(e),!1}}catch{return!1}}}});export{ge as default};
@@ -1 +1 @@
1
- import h from"./EmailError-CDvYwuqz.js";import w from"./RequiredOptionError-DU2lxzk3.js";import{e as P}from"./generate-message-id-gXAuMz4g.js";import{m as j}from"./make-request-CylyuRaN.js";import{i as I}from"./retry-CG9iT2wF.js";import{f as A}from"./validate-email-options-mCM9dVug.js";import{defineProvider as S}from"./defineProvider-C9q-7iwt.js";import{P as z,h as _,c as C}from"./provider-base-DjPzWncP.js";import{a as l}from"./address-formatter-BWR2Dddx.js";import{c as K}from"./attachment-processor-D1cbAhQi.js";const a="sparkpost",O="https://api.sparkpost.com/api/v1",T=3e4,x=3,d=r=>[r].flat(),B=S((r={})=>{if(!r.apiKey)throw new w(a,"apiKey");const n={apiKey:r.apiKey,debug:r.debug??!1,endpoint:r.endpoint??O,logger:r.logger,retries:r.retries??x,timeout:r.timeout??T},g=new z,y=C(a,r.logger);return{features:{attachments:!0,batchSending:!0,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!0,templates:!0,tracking:!0},async initialize(){await g.ensureInitialized(async()=>{if(!await this.isAvailable())throw new h(a,"SparkPost API not available or invalid API key");y.debug("Provider initialized successfully")},a)},async isAvailable(){return n.apiKey.length>0},name:a,options:n,async sendEmail(t){try{const o=A(t);if(o.length>0)return{error:new h(a,`Invalid email options: ${o.join(", ")}`),success:!1};await g.ensureInitialized(()=>this.initialize(),a);const p=d(t.to),u=t.cc?d(t.cc):[],k=t.bcc?d(t.bcc):[],v=[...p.map(e=>({address:l(e)})),...u.map(e=>({address:{...l(e),header_to:p.map(i=>i.email).join(", ")}})),...k.map(e=>({address:{...l(e),header_to:p.map(i=>i.email).join(", ")}}))],s={from:l(t.from),subject:t.subject};if(t.html&&(s.html=t.html),t.text&&(s.text=t.text),t.replyTo){const e=d(t.replyTo)[0];e&&(s.reply_to=e.email)}const c={};if(u.length>0&&(c.CC=u.map(e=>e.email).join(", ")),t.headers)for(const[e,i]of Object.entries(t.headers))c[e]=String(i);Object.keys(c).length>0&&(s.headers=c),t.templateId&&(s.template_id=t.templateId),t.attachments&&t.attachments.length>0&&(s.attachments=await Promise.all(t.attachments.map(async e=>{const i=await K(e,a);return{data:i.content,name:i.filename,type:i.contentType}})));const f={content:s,recipients:v};t.campaignId&&(f.campaign_id=t.campaignId),(t.trackOpens!==void 0||t.trackClicks!==void 0)&&(f.options={click_tracking:t.trackClicks??!0,open_tracking:t.trackOpens??!0});const m=await I(async()=>j(`${n.endpoint}/transmissions`,{headers:{Authorization:n.apiKey,"Content-Type":"application/json"},method:"POST",timeout:n.timeout},JSON.stringify(f)),n.retries);if(!m.success)return{error:m.error??new h(a,"Failed to send email"),success:!1};const{body:b}=m.data;return{data:{messageId:b?.results?.id??P(),provider:a,response:m.data,sent:!0,timestamp:new Date},success:!0}}catch(o){return{error:_(a,"send email",o,y),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{B as default};
1
+ import h from"./EmailError-2CCyVX1S.js";import w from"./RequiredOptionError-BmpC5whN.js";import{e as P}from"./generate-message-id-gXAuMz4g.js";import{m as j}from"./make-request-CDhxj-9b.js";import{i as I}from"./retry-D1Rh-6Z4.js";import{f as A}from"./validate-email-options-mCM9dVug.js";import{defineProvider as S}from"./defineProvider-C9q-7iwt.js";import{P as z,h as _,c as C}from"./provider-base-B-xhQSqE.js";import{a as l}from"./address-formatter-bfmGfQ83.js";import{c as K}from"./attachment-processor-DjbjtJ6H.js";const a="sparkpost",O="https://api.sparkpost.com/api/v1",T=3e4,x=3,d=r=>[r].flat(),B=S((r={})=>{if(!r.apiKey)throw new w(a,"apiKey");const n={apiKey:r.apiKey,debug:r.debug??!1,endpoint:r.endpoint??O,logger:r.logger,retries:r.retries??x,timeout:r.timeout??T},g=new z,y=C(a,r.logger);return{features:{attachments:!0,batchSending:!0,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!0,templates:!0,tracking:!0},async initialize(){await g.ensureInitialized(async()=>{if(!await this.isAvailable())throw new h(a,"SparkPost API not available or invalid API key");y.debug("Provider initialized successfully")},a)},async isAvailable(){return n.apiKey.length>0},name:a,options:n,async sendEmail(t){try{const o=A(t);if(o.length>0)return{error:new h(a,`Invalid email options: ${o.join(", ")}`),success:!1};await g.ensureInitialized(()=>this.initialize(),a);const p=d(t.to),u=t.cc?d(t.cc):[],k=t.bcc?d(t.bcc):[],v=[...p.map(e=>({address:l(e)})),...u.map(e=>({address:{...l(e),header_to:p.map(i=>i.email).join(", ")}})),...k.map(e=>({address:{...l(e),header_to:p.map(i=>i.email).join(", ")}}))],s={from:l(t.from),subject:t.subject};if(t.html&&(s.html=t.html),t.text&&(s.text=t.text),t.replyTo){const e=d(t.replyTo)[0];e&&(s.reply_to=e.email)}const c={};if(u.length>0&&(c.CC=u.map(e=>e.email).join(", ")),t.headers)for(const[e,i]of Object.entries(t.headers))c[e]=String(i);Object.keys(c).length>0&&(s.headers=c),t.templateId&&(s.template_id=t.templateId),t.attachments&&t.attachments.length>0&&(s.attachments=await Promise.all(t.attachments.map(async e=>{const i=await K(e,a);return{data:i.content,name:i.filename,type:i.contentType}})));const f={content:s,recipients:v};t.campaignId&&(f.campaign_id=t.campaignId),(t.trackOpens!==void 0||t.trackClicks!==void 0)&&(f.options={click_tracking:t.trackClicks??!0,open_tracking:t.trackOpens??!0});const m=await I(async()=>j(`${n.endpoint}/transmissions`,{headers:{Authorization:n.apiKey,"Content-Type":"application/json"},method:"POST",timeout:n.timeout},JSON.stringify(f)),n.retries);if(!m.success)return{error:m.error??new h(a,"Failed to send email"),success:!1};const{body:b}=m.data;return{data:{messageId:b?.results?.id??P(),provider:a,response:m.data,sent:!0,timestamp:new Date},success:!0}}catch(o){return{error:_(a,"send email",o,y),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{B as default};
@@ -1 +1 @@
1
- import c from"./EmailError-CDvYwuqz.js";import b from"./RequiredOptionError-DU2lxzk3.js";import{e as w}from"./generate-message-id-gXAuMz4g.js";import{s as v}from"./headers-to-record-De1Eg951.js";import{m as g}from"./make-request-CylyuRaN.js";import{i as f}from"./retry-CG9iT2wF.js";import{f as I}from"./validate-email-options-mCM9dVug.js";import{defineProvider as A}from"./defineProvider-C9q-7iwt.js";import{P,h,c as T}from"./provider-base-DjPzWncP.js";import{f as d,a as z}from"./address-formatter-BWR2Dddx.js";import{p as S}from"./attachment-processor-D1cbAhQi.js";const r="sweego",E="https://api.sweego.com",j=3e4,k=3,H=A((i={})=>{if(!i.apiKey)throw new b(r,"apiKey");const s={apiKey:i.apiKey,debug:i.debug??!1,endpoint:i.endpoint??E,retries:i.retries??k,timeout:i.timeout??j,...i.logger&&{logger:i.logger}},m=new P,a=T(r,i.logger);return{features:{attachments:!0,batchSending:!0,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!0,templates:!0,tracking:!0},async getEmail(e){try{if(!e)return{error:new c(r,"Email ID is required to retrieve email details"),success:!1};await m.ensureInitialized(()=>this.initialize(),r);const o={Authorization:`Bearer ${s.apiKey}`,"Content-Type":"application/json"};a.debug("Retrieving email details",{id:e});const t=await f(async()=>g(`${s.endpoint}/emails/${e}`,{headers:o,method:"GET",timeout:s.timeout}),s.retries);return t.success?(a.debug("Email details retrieved successfully"),{data:t.data?.body,success:!0}):(a.debug("API request failed when retrieving email",t.error),{error:new c(r,`Failed to retrieve email: ${t.error instanceof Error?t.error.message:"Unknown error"}`,{cause:t.error}),success:!1})}catch(o){return{error:h(r,"retrieve email",o,a),success:!1}}},async initialize(){await m.ensureInitialized(async()=>{if(!await this.isAvailable())throw new c(r,"Sweego API not available or invalid API key");a.debug("Provider initialized successfully")},r)},async isAvailable(){try{return a.debug("Checking Sweego API availability"),!0}catch(e){return a.debug("Error checking availability:",e),!1}},name:r,options:s,async sendEmail(e){try{const o=I(e);if(o.length>0)return{error:new c(r,`Invalid email options: ${o.join(", ")}`),success:!1};await m.ensureInitialized(()=>this.initialize(),r);const t={from:{email:e.from.email,name:e.from.name},subject:e.subject,to:d(e.to)};if(e.html&&(t.html=e.html),e.text&&(t.text=e.text),e.cc&&(t.cc=d(e.cc)),e.bcc&&(t.bcc=d(e.bcc)),e.replyTo&&(t.replyTo=z(e.replyTo)),e.templateId&&(t.templateId=e.templateId,e.templateVariables&&(t.templateVariables=e.templateVariables)),e.tags&&e.tags.length>0&&(t.tags=e.tags),e.headers){const n=v(e.headers);t.headers=n}e.attachments&&e.attachments.length>0&&(t.attachments=await Promise.all(e.attachments.map(async n=>({content:await S(n,r),contentType:n.contentType??"application/octet-stream",filename:n.filename,...n.cid&&{cid:n.cid}})))),a.debug("Sending email via Sweego API",{subject:t.subject,to:t.to});const y={Authorization:`Bearer ${s.apiKey}`,"Content-Type":"application/json"},l=await f(async()=>g(`${s.endpoint}/send`,{headers:y,method:"POST",timeout:s.timeout},JSON.stringify(t)),s.retries);if(!l.success)return a.debug("API request failed when sending email",l.error),{error:l.error??new c(r,"Failed to send email"),success:!1};const u=l.data?.body,p=u?.messageId??u?.id??w();return a.debug("Email sent successfully",{messageId:p}),{data:{messageId:p,provider:r,response:l.data,sent:!0,timestamp:new Date},success:!0}}catch(o){return{error:h(r,"send email",o,a),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{H as default};
1
+ import c from"./EmailError-2CCyVX1S.js";import b from"./RequiredOptionError-BmpC5whN.js";import{e as w}from"./generate-message-id-gXAuMz4g.js";import{s as v}from"./headers-to-record-De1Eg951.js";import{m as g}from"./make-request-CDhxj-9b.js";import{i as f}from"./retry-D1Rh-6Z4.js";import{f as I}from"./validate-email-options-mCM9dVug.js";import{defineProvider as A}from"./defineProvider-C9q-7iwt.js";import{P,h,c as T}from"./provider-base-B-xhQSqE.js";import{f as d,a as z}from"./address-formatter-bfmGfQ83.js";import{p as S}from"./attachment-processor-DjbjtJ6H.js";const r="sweego",E="https://api.sweego.com",j=3e4,k=3,H=A((i={})=>{if(!i.apiKey)throw new b(r,"apiKey");const s={apiKey:i.apiKey,debug:i.debug??!1,endpoint:i.endpoint??E,retries:i.retries??k,timeout:i.timeout??j,...i.logger&&{logger:i.logger}},m=new P,a=T(r,i.logger);return{features:{attachments:!0,batchSending:!0,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!0,templates:!0,tracking:!0},async getEmail(e){try{if(!e)return{error:new c(r,"Email ID is required to retrieve email details"),success:!1};await m.ensureInitialized(()=>this.initialize(),r);const o={Authorization:`Bearer ${s.apiKey}`,"Content-Type":"application/json"};a.debug("Retrieving email details",{id:e});const t=await f(async()=>g(`${s.endpoint}/emails/${e}`,{headers:o,method:"GET",timeout:s.timeout}),s.retries);return t.success?(a.debug("Email details retrieved successfully"),{data:t.data?.body,success:!0}):(a.debug("API request failed when retrieving email",t.error),{error:new c(r,`Failed to retrieve email: ${t.error instanceof Error?t.error.message:"Unknown error"}`,{cause:t.error}),success:!1})}catch(o){return{error:h(r,"retrieve email",o,a),success:!1}}},async initialize(){await m.ensureInitialized(async()=>{if(!await this.isAvailable())throw new c(r,"Sweego API not available or invalid API key");a.debug("Provider initialized successfully")},r)},async isAvailable(){try{return a.debug("Checking Sweego API availability"),!0}catch(e){return a.debug("Error checking availability:",e),!1}},name:r,options:s,async sendEmail(e){try{const o=I(e);if(o.length>0)return{error:new c(r,`Invalid email options: ${o.join(", ")}`),success:!1};await m.ensureInitialized(()=>this.initialize(),r);const t={from:{email:e.from.email,name:e.from.name},subject:e.subject,to:d(e.to)};if(e.html&&(t.html=e.html),e.text&&(t.text=e.text),e.cc&&(t.cc=d(e.cc)),e.bcc&&(t.bcc=d(e.bcc)),e.replyTo&&(t.replyTo=z(e.replyTo)),e.templateId&&(t.templateId=e.templateId,e.templateVariables&&(t.templateVariables=e.templateVariables)),e.tags&&e.tags.length>0&&(t.tags=e.tags),e.headers){const n=v(e.headers);t.headers=n}e.attachments&&e.attachments.length>0&&(t.attachments=await Promise.all(e.attachments.map(async n=>({content:await S(n,r),contentType:n.contentType??"application/octet-stream",filename:n.filename,...n.cid&&{cid:n.cid}})))),a.debug("Sending email via Sweego API",{subject:t.subject,to:t.to});const y={Authorization:`Bearer ${s.apiKey}`,"Content-Type":"application/json"},l=await f(async()=>g(`${s.endpoint}/send`,{headers:y,method:"POST",timeout:s.timeout},JSON.stringify(t)),s.retries);if(!l.success)return a.debug("API request failed when sending email",l.error),{error:l.error??new c(r,"Failed to send email"),success:!1};const u=l.data?.body,p=u?.messageId??u?.id??w();return a.debug("Email sent successfully",{messageId:p}),{data:{messageId:p,provider:r,response:l.data,sent:!0,timestamp:new Date},success:!0}}catch(o){return{error:h(r,"send email",o,a),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{H as default};
@@ -1 +1 @@
1
- import{createRequire as y}from"node:module";import g from"./EmailError-CDvYwuqz.js";import{i as v}from"./utils-DjEtR3qT.js";let _;const b=e=>(_??=y(import.meta.url))(e),s=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,d=e=>{if(typeof s<"u"&&s.versions&&s.versions.node){const[r,o]=s.versions.node.split(".").map(Number);if(r>22||r===22&&o>=3||r===20&&o>=16)return s.getBuiltinModule(e)}return b(e)},{Buffer:i}=d("node:buffer"),{verify:h,createPublicKey:l}=d("node:crypto"),j=e=>e.includes("-----BEGIN")?l(e):l({format:"der",key:i.from(e,"base64"),type:"spki"}),w=e=>{const{now:r,payload:o,publicKey:f,signature:n,timestamp:t,tolerance:u=300}=e;if(!n||!t)return{reason:"missing-headers",valid:!1};let a;try{a=j(f)}catch(p){throw new g("webhooks","Failed to parse SendGrid verification key",{cause:p})}const m=i.from(t+o,"utf8");let c;try{c=h("sha256",m,{dsaEncoding:"der",key:a},i.from(n,"base64"))}catch{return{reason:"signature-malformed",valid:!1}}return c?v(Number.parseInt(t,10),u,r)?{valid:!0}:{reason:"timestamp-out-of-tolerance",valid:!1}:{reason:"signature-mismatch",valid:!1}};export{w as verifySendGridWebhook};
1
+ import{createRequire as y}from"node:module";import g from"./EmailError-2CCyVX1S.js";import{i as v}from"./utils-DjEtR3qT.js";let _;const b=e=>(_??=y(import.meta.url))(e),s=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,d=e=>{if(typeof s<"u"&&s.versions&&s.versions.node){const[r,o]=s.versions.node.split(".").map(Number);if(r>22||r===22&&o>=3||r===20&&o>=16)return s.getBuiltinModule(e)}return b(e)},{Buffer:i}=d("node:buffer"),{verify:h,createPublicKey:l}=d("node:crypto"),j=e=>e.includes("-----BEGIN")?l(e):l({format:"der",key:i.from(e,"base64"),type:"spki"}),w=e=>{const{now:r,payload:o,publicKey:f,signature:n,timestamp:t,tolerance:u=300}=e;if(!n||!t)return{reason:"missing-headers",valid:!1};let a;try{a=j(f)}catch(p){throw new g("webhooks","Failed to parse SendGrid verification key",{cause:p})}const m=i.from(t+o,"utf8");let c;try{c=h("sha256",m,{dsaEncoding:"der",key:a},i.from(n,"base64"))}catch{return{reason:"signature-malformed",valid:!1}}return c?v(Number.parseInt(t,10),u,r)?{valid:!0}:{reason:"timestamp-out-of-tolerance",valid:!1}:{reason:"signature-mismatch",valid:!1}};export{w as verifySendGridWebhook};
@@ -1 +1 @@
1
- import{filterSuppressed as d}from"./createSuppressionStore-CeAZKCbY.js";import w from"./EmailError-CDvYwuqz.js";const u=(o,c={})=>async(e,p)=>{const t={allowed:[],suppressed:[]},r=await d(e.to,o),l=e.cc?await d(e.cc,o):t,s=e.bcc?await d(e.bcc,o):t,a=[...r.suppressed,...l.suppressed,...s.suppressed];return a.length>0&&c.onSuppressed?.(a),r.allowed.length===0&&l.allowed.length===0&&s.allowed.length===0?{error:new w("middleware","All recipients are suppressed",{code:"ALL_SUPPRESSED"}),success:!1}:p({...e,bcc:s.allowed.length>0?s.allowed:void 0,cc:l.allowed.length>0?l.allowed:void 0,to:r.allowed})};export{u as withSuppression};
1
+ import{filterSuppressed as d}from"./createSuppressionStore-CeAZKCbY.js";import w from"./EmailError-2CCyVX1S.js";const u=(o,c={})=>async(e,p)=>{const t={allowed:[],suppressed:[]},r=await d(e.to,o),l=e.cc?await d(e.cc,o):t,s=e.bcc?await d(e.bcc,o):t,a=[...r.suppressed,...l.suppressed,...s.suppressed];return a.length>0&&c.onSuppressed?.(a),r.allowed.length===0&&l.allowed.length===0&&s.allowed.length===0?{error:new w("middleware","All recipients are suppressed",{code:"ALL_SUPPRESSED"}),success:!1}:p({...e,bcc:s.allowed.length>0?s.allowed:void 0,cc:l.allowed.length>0?l.allowed:void 0,to:r.allowed})};export{u as withSuppression};
@@ -1 +1 @@
1
- import l from"./EmailError-CDvYwuqz.js";import y from"./RequiredOptionError-DU2lxzk3.js";import{e as b}from"./generate-message-id-gXAuMz4g.js";import{s as k}from"./headers-to-record-De1Eg951.js";import{m as v}from"./make-request-CylyuRaN.js";import{i as w}from"./retry-CG9iT2wF.js";import{s as A,a as z}from"./sanitize-header-DtQwAnzg.js";import{f as _}from"./validate-email-options-mCM9dVug.js";import{defineProvider as j}from"./defineProvider-C9q-7iwt.js";import{P,h as I,c as T}from"./provider-base-DjPzWncP.js";import{n as h}from"./address-formatter-BWR2Dddx.js";const i="zeptomail",O="https://api.zeptomail.com/v1.1",Z=3e4,E=3,L=j((s={})=>{if(!s.token)throw new y(i,"token");if(!s.token.startsWith("Zoho-enczapikey "))throw new l(i,'Token should be in the format "Zoho-enczapikey <your_api_key>"');const o={debug:s.debug??!1,endpoint:s.endpoint??O,logger:s.logger,retries:s.retries??E,timeout:s.timeout??Z,token:s.token},u=new P,n=T(i,s.logger);return{features:{attachments:!0,batchSending:!1,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!1,templates:!1,tracking:!0},async initialize(){await u.ensureInitialized(async()=>{if(!await this.isAvailable())throw new l(i,"Zeptomail API not available or invalid token");n.debug("Provider initialized successfully")},i)},async isAvailable(){try{return o.token&&o.token.startsWith("Zoho-enczapikey ")?(n.debug("Token format is valid, assuming Zeptomail is available"),!0):!1}catch(e){return n.debug("Error checking availability:",e),!1}},name:i,options:o,async sendEmail(e){try{const m=_(e);if(m.length>0)return{error:new l(i,`Invalid email options: ${m.join(", ")}`),success:!1};await u.ensureInitialized(()=>this.initialize(),i);const a={from:h(e.from).address,subject:e.subject};if(Array.isArray(e.to)?a.to=e.to.length===1?e.to[0].email:e.to.map(t=>t.email):a.to=e.to.email,e.text&&(a.textbody=e.text),e.html&&(a.htmlbody=e.html),e.cc&&(Array.isArray(e.cc)?a.cc=e.cc.length===1?e.cc[0].email:e.cc.map(t=>t.email):a.cc=e.cc.email),e.bcc&&(Array.isArray(e.bcc)?a.bcc=e.bcc.length===1?e.bcc[0].email:e.bcc.map(t=>t.email):a.bcc=e.bcc.email),e.replyTo&&(a.reply_to=[h(e.replyTo).address]),e.trackClicks!==void 0&&(a.track_clicks=e.trackClicks),e.trackOpens!==void 0&&(a.track_opens=e.trackOpens),e.clientReference&&(a.client_reference=e.clientReference),e.mimeHeaders&&Object.keys(e.mimeHeaders).length>0){const t={};for(const[r,d]of Object.entries(e.mimeHeaders))t[r]=d;a.mime_headers=t}if(e.headers){const t=k(e.headers);Object.keys(t).length>0&&(a.mime_headers??={},Object.entries(t).forEach(([r,d])=>{a.mime_headers&&(a.mime_headers[A(r)]=z(d))}))}e.attachments&&e.attachments.length>0&&(a.attachments=e.attachments.map(t=>{const r={name:t.filename};return t.content?(r.content=typeof t.content=="string"?t.content:t.content.toString("base64"),t.contentType&&(r.mime_type=t.contentType)):t.path&&(r.file_cache_key=t.path),r})),n.debug("Sending email via Zeptomail API",{subject:a.subject,to:a.to});const g={Accept:"application/json",Authorization:o.token,"Content-Type":"application/json"},c=await w(async()=>v(`${o.endpoint}/email`,{headers:g,method:"POST",timeout:o.timeout},JSON.stringify(a)),o.retries);if(!c.success){n.debug("API request failed",c.error);let t=c.error instanceof Error?c.error.message:"Unknown error";const r=c.data;return r?.body?.message?t+=` Details: ${r.body.message}`:r?.body?.error?.message&&(t+=` Details: ${r.body.error.message}`),{error:new l(i,`Failed to send email: ${t}`,{cause:c.error}),success:!1}}const p=c.data?.body,f=p?.request_id??b();return n.debug("Email sent successfully",{messageId:f}),{data:{messageId:f,provider:i,response:p,sent:!0,timestamp:new Date},success:!0}}catch(m){return{error:I(i,"send email",m,n),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{L as default};
1
+ import l from"./EmailError-2CCyVX1S.js";import y from"./RequiredOptionError-BmpC5whN.js";import{e as b}from"./generate-message-id-gXAuMz4g.js";import{s as k}from"./headers-to-record-De1Eg951.js";import{m as v}from"./make-request-CDhxj-9b.js";import{i as w}from"./retry-D1Rh-6Z4.js";import{s as A,a as z}from"./sanitize-header-DtQwAnzg.js";import{f as _}from"./validate-email-options-mCM9dVug.js";import{defineProvider as j}from"./defineProvider-C9q-7iwt.js";import{P,h as I,c as T}from"./provider-base-B-xhQSqE.js";import{n as h}from"./address-formatter-bfmGfQ83.js";const i="zeptomail",O="https://api.zeptomail.com/v1.1",Z=3e4,E=3,L=j((s={})=>{if(!s.token)throw new y(i,"token");if(!s.token.startsWith("Zoho-enczapikey "))throw new l(i,'Token should be in the format "Zoho-enczapikey <your_api_key>"');const o={debug:s.debug??!1,endpoint:s.endpoint??O,logger:s.logger,retries:s.retries??E,timeout:s.timeout??Z,token:s.token},u=new P,n=T(i,s.logger);return{features:{attachments:!0,batchSending:!1,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!1,templates:!1,tracking:!0},async initialize(){await u.ensureInitialized(async()=>{if(!await this.isAvailable())throw new l(i,"Zeptomail API not available or invalid token");n.debug("Provider initialized successfully")},i)},async isAvailable(){try{return o.token&&o.token.startsWith("Zoho-enczapikey ")?(n.debug("Token format is valid, assuming Zeptomail is available"),!0):!1}catch(e){return n.debug("Error checking availability:",e),!1}},name:i,options:o,async sendEmail(e){try{const m=_(e);if(m.length>0)return{error:new l(i,`Invalid email options: ${m.join(", ")}`),success:!1};await u.ensureInitialized(()=>this.initialize(),i);const a={from:h(e.from).address,subject:e.subject};if(Array.isArray(e.to)?a.to=e.to.length===1?e.to[0].email:e.to.map(t=>t.email):a.to=e.to.email,e.text&&(a.textbody=e.text),e.html&&(a.htmlbody=e.html),e.cc&&(Array.isArray(e.cc)?a.cc=e.cc.length===1?e.cc[0].email:e.cc.map(t=>t.email):a.cc=e.cc.email),e.bcc&&(Array.isArray(e.bcc)?a.bcc=e.bcc.length===1?e.bcc[0].email:e.bcc.map(t=>t.email):a.bcc=e.bcc.email),e.replyTo&&(a.reply_to=[h(e.replyTo).address]),e.trackClicks!==void 0&&(a.track_clicks=e.trackClicks),e.trackOpens!==void 0&&(a.track_opens=e.trackOpens),e.clientReference&&(a.client_reference=e.clientReference),e.mimeHeaders&&Object.keys(e.mimeHeaders).length>0){const t={};for(const[r,d]of Object.entries(e.mimeHeaders))t[r]=d;a.mime_headers=t}if(e.headers){const t=k(e.headers);Object.keys(t).length>0&&(a.mime_headers??={},Object.entries(t).forEach(([r,d])=>{a.mime_headers&&(a.mime_headers[A(r)]=z(d))}))}e.attachments&&e.attachments.length>0&&(a.attachments=e.attachments.map(t=>{const r={name:t.filename};return t.content?(r.content=typeof t.content=="string"?t.content:t.content.toString("base64"),t.contentType&&(r.mime_type=t.contentType)):t.path&&(r.file_cache_key=t.path),r})),n.debug("Sending email via Zeptomail API",{subject:a.subject,to:a.to});const g={Accept:"application/json",Authorization:o.token,"Content-Type":"application/json"},c=await w(async()=>v(`${o.endpoint}/email`,{headers:g,method:"POST",timeout:o.timeout},JSON.stringify(a)),o.retries);if(!c.success){n.debug("API request failed",c.error);let t=c.error instanceof Error?c.error.message:"Unknown error";const r=c.data;return r?.body?.message?t+=` Details: ${r.body.message}`:r?.body?.error?.message&&(t+=` Details: ${r.body.error.message}`),{error:new l(i,`Failed to send email: ${t}`,{cause:c.error}),success:!1}}const p=c.data?.body,f=p?.request_id??b();return n.debug("Email sent successfully",{messageId:f}),{data:{messageId:f,provider:i,response:p,sent:!0,timestamp:new Date},success:!0}}catch(m){return{error:I(i,"send email",m,n),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{L as default};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/ahaSendProvider-br1yB2un.js";export{r as ahaSendProvider};
1
+ import{default as r}from"../../packem_shared/ahaSendProvider-C6nBGCCa.js";export{r as ahaSendProvider};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/autoSendProvider-BSP8ueOC.js";export{r as autoSendProvider};
1
+ import{default as r}from"../../packem_shared/autoSendProvider-Dhig--Zo.js";export{r as autoSendProvider};
@@ -1 +1 @@
1
- import{default as a}from"../../packem_shared/awsSesProvider-zRICW1pH.js";export{a as awsSesProvider};
1
+ import{default as a}from"../../packem_shared/awsSesProvider-CMqAmU5N.js";export{a as awsSesProvider};
@@ -1 +1 @@
1
- import{default as a}from"../../packem_shared/azureProvider-DwN4c5dC.js";export{a as azureProvider};
1
+ import{default as a}from"../../packem_shared/azureProvider-C-bNOOil.js";export{a as azureProvider};
@@ -1 +1 @@
1
- import{default as o}from"../../packem_shared/brevoProvider-C491beE_.js";export{o as brevoProvider};
1
+ import{default as o}from"../../packem_shared/brevoProvider-CkOjDyir.js";export{o as brevoProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/cloudflareEmailProvider-8JxzLbpX.js";export{e as cloudflareEmailProvider};
1
+ import{default as e}from"../../packem_shared/cloudflareEmailProvider-RCixPWnY.js";export{e as cloudflareEmailProvider};
@@ -1 +1 @@
1
- import{default as o}from"../../packem_shared/failoverProvider-6qwE_HSJ.js";export{o as failoverProvider};
1
+ import{default as o}from"../../packem_shared/failoverProvider-BkOOP7pt.js";export{o as failoverProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/httpProvider-BqrdZhGw.js";export{e as httpProvider};
1
+ import{default as e}from"../../packem_shared/httpProvider-6idLfv-f.js";export{e as httpProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/infobipProvider-C2FU6VMP.js";export{e as infobipProvider};
1
+ import{default as e}from"../../packem_shared/infobipProvider-CHHsqRXy.js";export{e as infobipProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/loopsProvider-Bz63so6m.js";export{e as loopsProvider};
1
+ import{default as e}from"../../packem_shared/loopsProvider-Cl-dOuCN.js";export{e as loopsProvider};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/mailchannelsProvider-B_K6X4VY.js";export{r as mailchannelsProvider};
1
+ import{default as r}from"../../packem_shared/mailchannelsProvider-Dwl0Typz.js";export{r as mailchannelsProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/mailCrabProvider-bkQy-2a1.js";export{e as mailCrabProvider};
1
+ import{default as e}from"../../packem_shared/mailCrabProvider-De2YxPlF.js";export{e as mailCrabProvider};
@@ -1 +1 @@
1
- import{default as a}from"../../packem_shared/mailerSendProvider-DPEww2H1.js";export{a as mailerSendProvider};
1
+ import{default as a}from"../../packem_shared/mailerSendProvider-CyMIbqGq.js";export{a as mailerSendProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/mailgunProvider-DKxzVbDW.js";export{e as mailgunProvider};
1
+ import{default as e}from"../../packem_shared/mailgunProvider-DWKJYRKT.js";export{e as mailgunProvider};
@@ -1 +1 @@
1
- import{default as a}from"../../packem_shared/mailjetProvider-C2TQcujL.js";export{a as mailjetProvider};
1
+ import{default as a}from"../../packem_shared/mailjetProvider-DXPJQO1G.js";export{a as mailjetProvider};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/mailomatProvider-B8-5bQsu.js";export{r as mailomatProvider};
1
+ import{default as r}from"../../packem_shared/mailomatProvider-DopZk27y.js";export{r as mailomatProvider};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/mailPaceProvider-S1AB-AYq.js";export{r as mailPaceProvider};
1
+ import{default as r}from"../../packem_shared/mailPaceProvider-DwNTuFb2.js";export{r as mailPaceProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/mailtrapProvider-DW7TLOdG.js";export{e as mailtrapProvider};
1
+ import{default as e}from"../../packem_shared/mailtrapProvider-CTg4z3GN.js";export{e as mailtrapProvider};
@@ -1 +1 @@
1
- import{default as d}from"../../packem_shared/mandrillProvider-S-0lKNGd.js";export{d as mandrillProvider};
1
+ import{default as d}from"../../packem_shared/mandrillProvider-CAQeMtU_.js";export{d as mandrillProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/mockProvider-BAl292mW.js";export{e as mockProvider};
1
+ import{default as e}from"../../packem_shared/mockProvider-EcpYlg-_.js";export{e as mockProvider};
@@ -1 +1 @@
1
- import{default as o}from"../../packem_shared/netcoreProvider-DajMprlo.js";export{o as netcoreProvider};
1
+ import{default as o}from"../../packem_shared/netcoreProvider-ua1avx07.js";export{o as netcoreProvider};
@@ -1 +1 @@
1
- import{default as o}from"../../packem_shared/nodemailerProvider-DRo0lJ6g.js";export{o as nodemailerProvider};
1
+ import{default as o}from"../../packem_shared/nodemailerProvider-BZmQfKlM.js";export{o as nodemailerProvider};
@@ -1 +1 @@
1
- import{default as o}from"../../packem_shared/opentelemetryProvider-C6spx2CD.js";export{o as opentelemetryProvider};
1
+ import{default as o}from"../../packem_shared/opentelemetryProvider-CAfWpywa.js";export{o as opentelemetryProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/outlook365Provider-B0o7UZBW.js";export{e as outlook365Provider};
1
+ import{default as e}from"../../packem_shared/outlook365Provider-SFYELGDr.js";export{e as outlook365Provider};
@@ -1 +1 @@
1
- import{default as o}from"../../packem_shared/plunkProvider-DJzEUEtU.js";export{o as plunkProvider};
1
+ import{default as o}from"../../packem_shared/plunkProvider-9amwuQri.js";export{o as plunkProvider};
@@ -1 +1 @@
1
- import{default as a}from"../../packem_shared/postalProvider-DHFjFE3Y.js";export{a as postalProvider};
1
+ import{default as a}from"../../packem_shared/postalProvider-CeF3TOIW.js";export{a as postalProvider};
@@ -1 +1 @@
1
- import{default as a}from"../../packem_shared/postmarkProvider-Dt1EGGBA.js";export{a as postmarkProvider};
1
+ import{default as a}from"../../packem_shared/postmarkProvider-BPgKEkgF.js";export{a as postmarkProvider};
@@ -1 +1 @@
1
- import{default as d}from"../../packem_shared/resendProvider-qjI86j_d.js";export{d as resendProvider};
1
+ import{default as d}from"../../packem_shared/resendProvider-C9_sM8bH.js";export{d as resendProvider};
@@ -1 +1 @@
1
- import{default as d}from"../../packem_shared/roundRobinProvider-CO5YvhgR.js";export{d as roundRobinProvider};
1
+ import{default as d}from"../../packem_shared/roundRobinProvider-BPzLWZf-.js";export{d as roundRobinProvider};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/scalewayProvider-CihQKhw6.js";export{r as scalewayProvider};
1
+ import{default as r}from"../../packem_shared/scalewayProvider-DfC7275i.js";export{r as scalewayProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/sendGridProvider-Dkc5AKlC.js";export{e as sendGridProvider};
1
+ import{default as e}from"../../packem_shared/sendGridProvider-CUBBHBzs.js";export{e as sendGridProvider};
@@ -1 +1 @@
1
- import{default as o}from"../../packem_shared/smtpProvider-CIXMxPu-.js";export{o as smtpProvider};
1
+ import{default as o}from"../../packem_shared/smtpProvider-9nBSGtQl.js";export{o as smtpProvider};
@@ -1 +1 @@
1
- import{default as a}from"../../packem_shared/sparkpostProvider-CKxQhpyB.js";export{a as sparkpostProvider};
1
+ import{default as a}from"../../packem_shared/sparkpostProvider-Be_d7S8o.js";export{a as sparkpostProvider};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/sweegoProvider-DjmAs6La.js";export{r as sweegoProvider};
1
+ import{default as r}from"../../packem_shared/sweegoProvider-CP1cNC-d.js";export{r as sweegoProvider};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/zeptomailProvider-DSTC9pUi.js";export{r as zeptomailProvider};
1
+ import{default as r}from"../../packem_shared/zeptomailProvider-BZ0fK0Lk.js";export{r as zeptomailProvider};
@@ -1 +1 @@
1
- import t from"juice";import n from"../packem_shared/EmailError-CDvYwuqz.js";const i=(r,o)=>{const a=t.default??t;try{return a(r,o)}catch(e){throw new n("render",`Failed to inline CSS: ${e.message}`,{cause:e})}};export{i as default};
1
+ import t from"juice";import n from"../packem_shared/EmailError-2CCyVX1S.js";const i=(r,o)=>{const a=t.default??t;try{return a(r,o)}catch(e){throw new n("render",`Failed to inline CSS: ${e.message}`,{cause:e})}};export{i as default};
@@ -1 +1 @@
1
- import t from"handlebars";import s from"../packem_shared/EmailError-CDvYwuqz.js";const i=(a,r,e)=>{try{if(typeof a!="string")throw new TypeError("Handlebars template must be a string");return t.compile(a,e)(r??{})}catch(n){throw n instanceof Error&&n.message.includes("Cannot find module")?new s("handlebars","Handlebars is not installed. Please install it: pnpm add handlebars",{cause:n}):new s("handlebars",`Failed to render Handlebars template: ${n.message}`,{cause:n})}},o=(a,r)=>{try{t.registerHelper(a,r)}catch(e){throw e instanceof Error&&e.message.includes("Cannot find module")?new s("handlebars","Handlebars is not installed. Please install it: pnpm add handlebars",{cause:e}):e}},c=(a,r)=>{try{t.registerPartial(a,r)}catch(e){throw e instanceof Error&&e.message.includes("Cannot find module")?new s("handlebars","Handlebars is not installed. Please install it: pnpm add handlebars",{cause:e}):e}};export{o as registerHandlebarsHelper,c as registerHandlebarsPartial,i as renderHandlebars};
1
+ import t from"handlebars";import s from"../packem_shared/EmailError-2CCyVX1S.js";const i=(a,r,e)=>{try{if(typeof a!="string")throw new TypeError("Handlebars template must be a string");return t.compile(a,e)(r??{})}catch(n){throw n instanceof Error&&n.message.includes("Cannot find module")?new s("handlebars","Handlebars is not installed. Please install it: pnpm add handlebars",{cause:n}):new s("handlebars",`Failed to render Handlebars template: ${n.message}`,{cause:n})}},o=(a,r)=>{try{t.registerHelper(a,r)}catch(e){throw e instanceof Error&&e.message.includes("Cannot find module")?new s("handlebars","Handlebars is not installed. Please install it: pnpm add handlebars",{cause:e}):e}},c=(a,r)=>{try{t.registerPartial(a,r)}catch(e){throw e instanceof Error&&e.message.includes("Cannot find module")?new s("handlebars","Handlebars is not installed. Please install it: pnpm add handlebars",{cause:e}):e}};export{o as registerHandlebarsHelper,c as registerHandlebarsPartial,i as renderHandlebars};
@@ -1 +1 @@
1
- import{convert as s}from"html-to-text";import o from"../packem_shared/EmailError-CDvYwuqz.js";const a=(r,e)=>{try{return s(r,{longWordSplit:e?.longWordSplit,preserveNewlines:e?.preserveNewlines??!1,selectors:e?.selectors,wordwrap:e?.wordwrap??80})}catch(t){throw t instanceof Error&&t.message.includes("Cannot find module")?new o("html-to-text","html-to-text is not installed. Please install it: pnpm add html-to-text",{cause:t}):new o("html-to-text",`Failed to convert HTML to text: ${t.message}`,{cause:t})}};export{a as default};
1
+ import{convert as s}from"html-to-text";import o from"../packem_shared/EmailError-2CCyVX1S.js";const a=(r,e)=>{try{return s(r,{longWordSplit:e?.longWordSplit,preserveNewlines:e?.preserveNewlines??!1,selectors:e?.selectors,wordwrap:e?.wordwrap??80})}catch(t){throw t instanceof Error&&t.message.includes("Cannot find module")?new o("html-to-text","html-to-text is not installed. Please install it: pnpm add html-to-text",{cause:t}):new o("html-to-text",`Failed to convert HTML to text: ${t.message}`,{cause:t})}};export{a as default};
@@ -1 +1 @@
1
- import l from"../packem_shared/EmailError-CDvYwuqz.js";const c=(t,r,a)=>{const n=new Map(Object.keys(t).map(o=>[o.toLowerCase(),o])),e=o=>{if(o!==void 0)return n.get(o.toLowerCase())};return e(r)??e(r.split("-")[0])??e(a)},d=async(t,r,a,n,e)=>{const o=c(t,r,e?.defaultLocale);if(o===void 0)throw new l("i18n",`No template found for locale "${r}"${e?.defaultLocale?` or default "${e.defaultLocale}"`:""}`);return await a(t[o],n,e?.rendererOptions)},f=(t,r)=>(a,n,e,o)=>d(a,n,t,e,{defaultLocale:r,rendererOptions:o});export{f as createI18nRenderer,d as renderI18n,c as resolveLocale};
1
+ import l from"../packem_shared/EmailError-2CCyVX1S.js";const c=(t,r,a)=>{const n=new Map(Object.keys(t).map(o=>[o.toLowerCase(),o])),e=o=>{if(o!==void 0)return n.get(o.toLowerCase())};return e(r)??e(r.split("-")[0])??e(a)},d=async(t,r,a,n,e)=>{const o=c(t,r,e?.defaultLocale);if(o===void 0)throw new l("i18n",`No template found for locale "${r}"${e?.defaultLocale?` or default "${e.defaultLocale}"`:""}`);return await a(t[o],n,e?.rendererOptions)},f=(t,r)=>(a,n,e,o)=>d(a,n,t,e,{defaultLocale:r,rendererOptions:o});export{f as createI18nRenderer,d as renderI18n,c as resolveLocale};
@@ -1 +1 @@
1
- import t from"../packem_shared/EmailError-CDvYwuqz.js";const l=async(n,s,a)=>{try{const{render:e}=await import("jsx-email");return await e(n,{plainText:a?.plainText,pretty:a?.pretty})}catch(e){throw e instanceof Error&&(e.code==="ERR_MODULE_NOT_FOUND"||e.message.includes("Cannot find module")||e.message.includes("Cannot find package"))?new t("jsx-email","jsx-email is not installed. Please install it: pnpm add jsx-email",{cause:e}):new t("jsx-email",`Failed to render jsx-email component: ${e.message}`,{cause:e})}};export{l as default};
1
+ import t from"../packem_shared/EmailError-2CCyVX1S.js";const l=async(n,s,a)=>{try{const{render:e}=await import("jsx-email");return await e(n,{plainText:a?.plainText,pretty:a?.pretty})}catch(e){throw e instanceof Error&&(e.code==="ERR_MODULE_NOT_FOUND"||e.message.includes("Cannot find module")||e.message.includes("Cannot find package"))?new t("jsx-email","jsx-email is not installed. Please install it: pnpm add jsx-email",{cause:e}):new t("jsx-email",`Failed to render jsx-email component: ${e.message}`,{cause:e})}};export{l as default};
@@ -1 +1 @@
1
- import t from"../packem_shared/EmailError-CDvYwuqz.js";const r=async(i,a,n)=>{try{if(typeof i!="string")throw new TypeError("Liquid template must be a string");const{Liquid:e}=await import("liquidjs");return await new e(n??{}).parseAndRender(i,a??{})}catch(e){throw e instanceof TypeError?e:e instanceof Error&&(e.code==="ERR_MODULE_NOT_FOUND"||e.message.includes("Cannot find module")||e.message.includes("Cannot find package"))?new t("liquid","liquidjs is not installed. Please install it: pnpm add liquidjs",{cause:e}):new t("liquid",`Failed to render Liquid template: ${e.message}`,{cause:e})}};export{r as default};
1
+ import t from"../packem_shared/EmailError-2CCyVX1S.js";const r=async(i,a,n)=>{try{if(typeof i!="string")throw new TypeError("Liquid template must be a string");const{Liquid:e}=await import("liquidjs");return await new e(n??{}).parseAndRender(i,a??{})}catch(e){throw e instanceof TypeError?e:e instanceof Error&&(e.code==="ERR_MODULE_NOT_FOUND"||e.message.includes("Cannot find module")||e.message.includes("Cannot find package"))?new t("liquid","liquidjs is not installed. Please install it: pnpm add liquidjs",{cause:e}):new t("liquid",`Failed to render Liquid template: ${e.message}`,{cause:e})}};export{r as default};
@@ -1 +1 @@
1
- import r from"mjml";import n from"../packem_shared/EmailError-CDvYwuqz.js";const f=(s,i,t)=>{try{if(typeof s!="string")throw new TypeError("MJML template must be a string");const e=r(s,{beautify:t?.beautify??!1,fonts:t?.fonts,keepComments:t?.keepComments??!0,minify:t?.minify??!1,validationLevel:t?.validationLevel??"soft"});if(e.errors&&e.errors.length>0){const o=e.errors.map(a=>a.message).join("; ");throw new n("mjml",`MJML validation errors: ${o}`)}return e.html}catch(e){throw e instanceof Error&&e.message.includes("Cannot find module")?new n("mjml","MJML is not installed. Please install it: pnpm add mjml",{cause:e}):e instanceof n?e:new n("mjml",`Failed to render MJML: ${e.message}`,{cause:e})}};export{f as default};
1
+ import r from"mjml";import n from"../packem_shared/EmailError-2CCyVX1S.js";const f=(s,i,t)=>{try{if(typeof s!="string")throw new TypeError("MJML template must be a string");const e=r(s,{beautify:t?.beautify??!1,fonts:t?.fonts,keepComments:t?.keepComments??!0,minify:t?.minify??!1,validationLevel:t?.validationLevel??"soft"});if(e.errors&&e.errors.length>0){const o=e.errors.map(a=>a.message).join("; ");throw new n("mjml",`MJML validation errors: ${o}`)}return e.html}catch(e){throw e instanceof Error&&e.message.includes("Cannot find module")?new n("mjml","MJML is not installed. Please install it: pnpm add mjml",{cause:e}):e instanceof n?e:new n("mjml",`Failed to render MJML: ${e.message}`,{cause:e})}};export{f as default};
@@ -1 +1 @@
1
- import{render as n}from"@react-email/render";import a from"../packem_shared/EmailError-CDvYwuqz.js";const s=async(r,i,t)=>{try{return await n(r,{plainText:t?.plainText,pretty:t?.pretty})}catch(e){throw e instanceof Error&&e.message.includes("Cannot find module")?new a("react-email","@react-email/render is not installed. Please install it: pnpm add @react-email/render",{cause:e}):new a("react-email",`Failed to render React Email component: ${e.message}`,{cause:e})}};export{s as default};
1
+ import{render as n}from"@react-email/render";import a from"../packem_shared/EmailError-2CCyVX1S.js";const s=async(r,i,t)=>{try{return await n(r,{plainText:t?.plainText,pretty:t?.pretty})}catch(e){throw e instanceof Error&&e.message.includes("Cannot find module")?new a("react-email","@react-email/render is not installed. Please install it: pnpm add @react-email/render",{cause:e}):new a("react-email",`Failed to render React Email component: ${e.message}`,{cause:e})}};export{s as default};
@@ -1 +1 @@
1
- import{render as i}from"@vue-email/render";import a from"../packem_shared/EmailError-CDvYwuqz.js";const s=async(n,r,t)=>{try{return await i(n,r??{},{htmlToTextOptions:t?.htmlToTextOptions,plainText:t?.plainText,pretty:t?.pretty})}catch(e){throw e instanceof Error&&e.message.includes("Cannot find module")?new a("vue-email","@vue-email/render is not installed. Please install it: pnpm add @vue-email/render",{cause:e}):new a("vue-email",`Failed to render Vue Email component: ${e.message}`,{cause:e})}};export{s as default};
1
+ import{render as i}from"@vue-email/render";import a from"../packem_shared/EmailError-2CCyVX1S.js";const s=async(n,r,t)=>{try{return await i(n,r??{},{htmlToTextOptions:t?.htmlToTextOptions,plainText:t?.plainText,pretty:t?.pretty})}catch(e){throw e instanceof Error&&e.message.includes("Cannot find module")?new a("vue-email","@vue-email/render is not installed. Please install it: pnpm add @vue-email/render",{cause:e}):new a("vue-email",`Failed to render Vue Email component: ${e.message}`,{cause:e})}};export{s as default};
@@ -1,6 +1,6 @@
1
1
  import { a as MockEmailEntry } from "../packem_shared/types.d-C5geVKes.js";
2
2
  import { E as EmailOptions } from "../packem_shared/types.d-B9295M4_.js";
3
- import { M as Mail } from "../packem_shared/mail.d-xKtvoKMK.js";
3
+ import { M as Mail } from "../packem_shared/mail.d-B9JyPxzq.js";
4
4
  import 'node:buffer';
5
5
  import 'ical-generator';
6
6
  import 'node:crypto';
@@ -1 +1 @@
1
- import{emailMatchers as a,registerEmailMatchers as o,toHaveSentMatching as r,toHaveSentTo as i,toHaveSentWithAttachment as m,toHaveSentWithSubject as h}from"../packem_shared/emailMatchers-DZDkrZ_3.js";import{toEmailSnapshot as c}from"../packem_shared/toEmailSnapshot-DeRqM5SJ.js";import{createTestEmail as s}from"../packem_shared/createTestEmail-D_ksEez3.js";export{s as createTestEmail,a as emailMatchers,o as registerEmailMatchers,c as toEmailSnapshot,r as toHaveSentMatching,i as toHaveSentTo,m as toHaveSentWithAttachment,h as toHaveSentWithSubject};
1
+ import{emailMatchers as a,registerEmailMatchers as o,toHaveSentMatching as r,toHaveSentTo as i,toHaveSentWithAttachment as m,toHaveSentWithSubject as h}from"../packem_shared/emailMatchers-DZDkrZ_3.js";import{toEmailSnapshot as c}from"../packem_shared/toEmailSnapshot-DeRqM5SJ.js";import{createTestEmail as s}from"../packem_shared/createTestEmail-XiF5E8vJ.js";export{s as createTestEmail,a as emailMatchers,o as registerEmailMatchers,c as toEmailSnapshot,r as toHaveSentMatching,i as toHaveSentTo,m as toHaveSentWithAttachment,h as toHaveSentWithSubject};
@@ -1 +1 @@
1
- import{s as m}from"../packem_shared/format-address-DTl-9O70.js";import r from"../packem_shared/EmailError-CDvYwuqz.js";import i from"./validation/validate-email.js";const n=a=>{if(!i(a.email))throw new r("email",`Invalid email address: ${a.email}`);if(a.name){const e=m(a.name);if(e)return`"${e}" <${a.email}>`}return a.email};export{n as default};
1
+ import{s as m}from"../packem_shared/format-address-DTl-9O70.js";import r from"../packem_shared/EmailError-2CCyVX1S.js";import i from"./validation/validate-email.js";const n=a=>{if(!i(a.email))throw new r("email",`Invalid email address: ${a.email}`);if(a.name){const e=m(a.name);if(e)return`"${e}" <${a.email}>`}return a.email};export{n as default};
@@ -1,6 +1,6 @@
1
- import y from"./parse-address.js";import{p as v}from"../packem_shared/quoted-printable-nSGDA1tA.js";const T=globalThis.Buffer!==void 0,k=r=>{if(T)return Uint8Array.from(Buffer.from(r,"base64"));const t=atob(r),n=new Uint8Array(t.length);for(let e=0;e<t.length;e+=1)n[e]=t.charCodeAt(e);return n},E=r=>{const t=r.replaceAll("_"," "),n=[];for(let e=0;e<t.length;e+=1){const s=t[e];s==="="&&e+2<t.length?(n.push(Number.parseInt(t.slice(e+1,e+3),16)),e+=2):n.push(s.charCodeAt(0))}return Uint8Array.from(n)},U=/^utf-?8$/i,j=(r,t)=>{if(T&&U.test(t))return Buffer.from(r).toString("utf8");try{return new TextDecoder(t).decode(r)}catch{return new TextDecoder().decode(r)}},D=/=\?([^?]+)\?([bq])\?([^?]*)\?=/gi,M=r=>r.includes("=?")?r.replaceAll(/(\?=)\s+(=\?)/g,"$1$2").replaceAll(D,(t,n,e,s)=>{const o=e.toUpperCase()==="B"?k(s):E(s);return j(o,n)}):r,O=globalThis.Buffer!==void 0,S=/^[ \t]/,q=/boundary=(?:"([^"]+)"|([^";]+))/i,I=/^\r?\n/,L=/[\r\n]+$/,N=/\r?\n$/,P=/\s/g,_=/high|^1|^2/i,F=/low|^4|^5/i,B=r=>{const t=r.replaceAll(`\r
1
+ import A from"./parse-address.js";import{p as U}from"../packem_shared/quoted-printable-nSGDA1tA.js";const k=globalThis.Buffer!==void 0,D=r=>{if(k)return Uint8Array.from(Buffer.from(r,"base64"));const t=atob(r),n=new Uint8Array(t.length);for(let e=0;e<t.length;e+=1)n[e]=t.charCodeAt(e);return n},M=r=>{const t=r.replaceAll("_"," "),n=[];for(let e=0;e<t.length;e+=1){const s=t[e];s==="="&&e+2<t.length?(n.push(Number.parseInt(t.slice(e+1,e+3),16)),e+=2):n.push(s.charCodeAt(0))}return Uint8Array.from(n)},O=/^utf-?8$/i,S=(r,t)=>{if(k&&O.test(t))return Buffer.from(r).toString("utf8");try{return new TextDecoder(t).decode(r)}catch{return new TextDecoder().decode(r)}},q=/=\?([^?]+)\?([bq])\?([^?]*)\?=/gi,I=r=>r.includes("=?")?r.replaceAll(/(\?=)\s+(=\?)/g,"$1$2").replaceAll(q,(t,n,e,s)=>{const o=e.toUpperCase()==="B"?D(s):M(s);return S(o,n)}):r,P=globalThis.Buffer!==void 0,W=/^[ \t]/,_=/boundary=(?:"([^"]+)"|([^";]+))/i,F=/^\r?\n/,$=/[\r\n]+$/,G=/\r?\n$/,H=/\s/g,N=/high|^1|^2/i,R=/low|^4|^5/i,v=r=>{const t=r.replaceAll(`\r
2
2
  `,`
3
3
  `),n=t.indexOf(`
4
4
 
5
- `),e=n===-1?t:t.slice(0,n),s=n===-1?"":t.slice(n+2),o=[],f=new Map;let i="",c="";const h=()=>{if(i){const a=M(c.trim());o.push([i,a]),f.set(i.toLowerCase(),a)}};for(const a of e.split(`
6
- `))if(S.test(a)&&i)c+=` ${a.trim()}`;else{h();const u=a.indexOf(":");u===-1?(i="",c=""):(i=a.slice(0,u).trim(),c=a.slice(u+1).trim())}return h(),{body:s,headers:{map:f,raw:o}}},b=r=>{if(!r)return[];const t=[];let n="",e=!1,s=!1;for(const o of r){switch(o){case'"':{e=!e;break}case"<":{s=!0;break}case">":{s=!1;break}}o===","&&!e&&!s?(t.push(n),n=""):n+=o}return n.trim()&&t.push(n),t.map(o=>y(o.trim())).filter(o=>o!==void 0)},G=r=>{if(!r)return;const t=q.exec(r);return t?.[1]??t?.[2]},w=(r,t)=>{const n=(t??"7bit").trim().toLowerCase();if(n==="quoted-printable")return v(r);if(n==="base64"){const e=r.replaceAll(P,"");return O?Buffer.from(e,"base64").toString("utf8"):new TextDecoder().decode(Uint8Array.from(atob(e),s=>s.codePointAt(0)))}return r},W=r=>{const{body:t,headers:n}=B(r),{map:e}=n,s=y(e.get("from")??"");if(!s)throw new Error("Cannot parse EML: missing or invalid `From` header");const o=b(e.get("to")??""),f=b(e.get("cc")??""),i=b(e.get("bcc")??"");if(o.length===0&&f.length===0&&i.length===0)throw new Error("Cannot parse EML: no recipient (`To`/`Cc`/`Bcc`) found");const c={from:s,subject:e.get("subject")??"",to:o.length===1?o[0]:o};f.length>0&&(c.cc=f.length===1?f[0]:f),i.length>0&&(c.bcc=i.length===1?i[0]:i);const h=e.get("reply-to")?y(e.get("reply-to")):void 0;h&&(c.replyTo=h);const a=e.get("content-type"),u=G(a);if(u&&a?.toLowerCase().includes("multipart")){const d=t.split(`--${u}`);for(const l of d){const p=l.replace(I,"");if(!(!p||p.startsWith("--"))){const{body:C,headers:m}=B(p),x=m.map.get("content-type")??"",A=m.map.get("content-transfer-encoding");(m.map.get("content-disposition")??"").toLowerCase().includes("attachment")||(x.toLowerCase().includes("text/plain")?c.text=w(C.replace(L,""),A):x.toLowerCase().includes("text/html")&&(c.html=w(C.replace(L,""),A)))}}}else{const d=e.get("content-transfer-encoding"),l=w(t.replace(N,""),d);a?.toLowerCase().includes("text/html")?c.html=l:l&&(c.text=l)}const $=new Set(["bcc","cc","content-transfer-encoding","content-type","from","mime-version","reply-to","subject","to"]),g={};for(const[d,l]of n.raw){const p=d.toLowerCase();(p==="x-priority"||p==="importance")&&(_.test(l)?c.priority="high":F.test(l)&&(c.priority="low")),$.has(p)||(g[d]=l)}return Object.keys(g).length>0&&(c.headers=g),c};export{W as default};
5
+ `),e=n===-1?t:t.slice(0,n),s=n===-1?"":t.slice(n+2),o=[],f=new Map;let i="",c="";const d=()=>{if(i){const a=I(c.trim());o.push([i,a]),f.set(i.toLowerCase(),a)}};for(const a of e.split(`
6
+ `))if(W.test(a)&&i)c+=` ${a.trim()}`;else{d();const p=a.indexOf(":");p===-1?(i="",c=""):(i=a.slice(0,p).trim(),c=a.slice(p+1).trim())}return d(),{body:s,headers:{map:f,raw:o}}},C=r=>{if(!r)return[];const t=[];let n="",e=!1,s=!1;for(const o of r){switch(o){case'"':{e=!e;break}case"<":{s=!0;break}case">":{s=!1;break}}o===","&&!e&&!s?(t.push(n),n=""):n+=o}return n.trim()&&t.push(n),t.map(o=>A(o.trim())).filter(o=>o!==void 0)},j=r=>{if(!r)return;const t=_.exec(r);return t?.[1]??t?.[2]},x=(r,t)=>{const n=(t??"7bit").trim().toLowerCase();if(n==="quoted-printable")return U(r);if(n==="base64"){const e=r.replaceAll(H,"");return P?Buffer.from(e,"base64").toString("utf8"):new TextDecoder().decode(Uint8Array.from(atob(e),s=>s.codePointAt(0)))}return r},J=r=>{const{body:t,headers:n}=v(r),{map:e}=n,s=A(e.get("from")??"");if(!s)throw new Error("Cannot parse EML: missing or invalid `From` header");const o=C(e.get("to")??""),f=C(e.get("cc")??""),i=C(e.get("bcc")??"");if(o.length===0&&f.length===0&&i.length===0)throw new Error("Cannot parse EML: no recipient (`To`/`Cc`/`Bcc`) found");const c={from:s,subject:e.get("subject")??"",to:o.length===1?o[0]:o};f.length>0&&(c.cc=f.length===1?f[0]:f),i.length>0&&(c.bcc=i.length===1?i[0]:i);const d=e.get("reply-to")?A(e.get("reply-to")):void 0;d&&(c.replyTo=d);const a=e.get("content-type"),p=j(a),L=(u,l)=>{for(const h of u.split(`--${l}`)){const b=h.replace(F,"");if(!b||b.startsWith("--"))continue;const{body:w,headers:y}=v(b),g=y.map.get("content-type")??"",T=y.map.get("content-transfer-encoding");if((y.map.get("content-disposition")??"").toLowerCase().includes("attachment"))continue;const B=j(g);B&&g.toLowerCase().includes("multipart")?L(w,B):g.toLowerCase().includes("text/plain")?c.text=x(w.replace($,""),T):g.toLowerCase().includes("text/html")&&(c.html=x(w.replace($,""),T))}};if(p&&a?.toLowerCase().includes("multipart"))L(t,p);else{const u=e.get("content-transfer-encoding"),l=x(t.replace(G,""),u);a?.toLowerCase().includes("text/html")?c.html=l:l&&(c.text=l)}const E=new Set(["bcc","cc","content-transfer-encoding","content-type","from","mime-version","reply-to","subject","to"]),m={};for(const[u,l]of n.raw){const h=u.toLowerCase();(h==="x-priority"||h==="importance")&&(N.test(l)?c.priority="high":R.test(l)&&(c.priority="low")),E.has(h)||(m[u]=l)}return Object.keys(m).length>0&&(c.headers=m),c};export{J as default};
@@ -1 +1 @@
1
- import e from"../packem_shared/EmailError-CDvYwuqz.js";const c=s=>s.success,t=s=>!s.success,u=s=>{if(s.success)return s.data;throw s.error instanceof Error?s.error:new e("result","Called unwrap() on a failed result",{cause:s.error})},o=(s,r)=>s.success?s.data:r,n=(s,r)=>s.success?{data:r(s.data),success:!0}:{error:s.error,success:!1},d=async s=>{try{return{data:await s(),success:!0}}catch(r){return{error:r,success:!1}}};export{t as isErr,c as isOk,n as mapOk,d as tryAsync,u as unwrap,o as unwrapOr};
1
+ import e from"../packem_shared/EmailError-2CCyVX1S.js";const c=s=>s.success,t=s=>!s.success,u=s=>{if(s.success)return s.data;throw s.error instanceof Error?s.error:new e("result","Called unwrap() on a failed result",{cause:s.error})},o=(s,r)=>s.success?s.data:r,n=(s,r)=>s.success?{data:r(s.data),success:!0}:{error:s.error,success:!1},d=async s=>{try{return{data:await s(),success:!0}}catch(r){return{error:r,success:!1}}};export{t as isErr,c as isOk,n as mapOk,d as tryAsync,u as unwrap,o as unwrapOr};
@@ -1 +1 @@
1
- import{verifyMailgunWebhook as r}from"../packem_shared/verifyMailgunWebhook-DNk080BF.js";import{verifyPostmarkWebhook as f}from"../packem_shared/verifyPostmarkWebhook-B4OIEHQF.js";import{verifySendGridWebhook as n}from"../packem_shared/verifySendGridWebhook-1l9bqIMw.js";import{isValidSigningCertUrl as d,verifySnsMessage as k}from"../packem_shared/isValidSigningCertUrl-DNxPA0Q-.js";import{verifyResendWebhook as s,verifyStandardWebhook as v}from"../packem_shared/verifyResendWebhook-C7E32LZ1.js";export{d as isValidSigningCertUrl,r as verifyMailgunWebhook,f as verifyPostmarkWebhook,s as verifyResendWebhook,n as verifySendGridWebhook,k as verifySnsMessage,v as verifyStandardWebhook};
1
+ import{verifyMailgunWebhook as r}from"../packem_shared/verifyMailgunWebhook-DNk080BF.js";import{verifyPostmarkWebhook as f}from"../packem_shared/verifyPostmarkWebhook-B4OIEHQF.js";import{verifySendGridWebhook as n}from"../packem_shared/verifySendGridWebhook-DtFMgBRP.js";import{isValidSigningCertUrl as d,verifySnsMessage as k}from"../packem_shared/isValidSigningCertUrl-D7PuiRW4.js";import{verifyResendWebhook as s,verifyStandardWebhook as v}from"../packem_shared/verifyResendWebhook-C7E32LZ1.js";export{d as isValidSigningCertUrl,r as verifyMailgunWebhook,f as verifyPostmarkWebhook,s as verifyResendWebhook,n as verifySendGridWebhook,k as verifySnsMessage,v as verifyStandardWebhook};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/email",
3
- "version": "2.1.7",
3
+ "version": "2.1.8",
4
4
  "description": "A comprehensive email library with multi-provider support, crypto utilities, and template engines",
5
5
  "keywords": [
6
6
  "ahasend",
@@ -1 +0,0 @@
1
- import{createRequire as h}from"node:module";let d;const g=r=>(d??=h(import.meta.url))(r),t=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,E=r=>{if(typeof t<"u"&&t.versions&&t.versions.node){const[e,s]=t.versions.node.split(".").map(Number);if(e>22||e===22&&s>=3||e===20&&s>=16)return t.getBuiltinModule(r)}return g(r)},{createRequire:l}=E("node:module"),f=new Map([["Error",Error],["EvalError",EvalError],["RangeError",RangeError],["ReferenceError",ReferenceError],["SyntaxError",SyntaxError],["TypeError",TypeError],["URIError",URIError]]);typeof AggregateError<"u"&&f.set("AggregateError",AggregateError);let y;const _=r=>(y??=l(import.meta.url))(r),i=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,b=r=>{if(typeof i<"u"&&i.versions&&i.versions.node){const[e,s]=i.versions.node.split(".").map(Number);if(e>22||e===22&&s>=3||e===20&&s>=16)return i.getBuiltinModule(r)}return _(r)};b("node:util");class v extends Error{loc;title;hint;type="VisulimaError";constructor({cause:e,hint:s,location:o,message:c,name:u,stack:p,title:m}){super(c,{cause:e}),this.title=m,this.name=u,this.stack=p??this.stack,this.loc=o,this.hint=s}setLocation(e){this.loc=e}setName(e){this.name=e}setMessage(e){this.message=e}setHint(e){this.hint=e}}let T;const R=r=>(T??=l(import.meta.url))(r),n=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,a=r=>{if(typeof n<"u"&&n.versions&&n.versions.node){const[e,s]=n.versions.node.split(".").map(Number);if(e>22||e===22&&s>=3||e===20&&s>=16)return n.getBuiltinModule(r)}return R(r)};a("node:fs");a("node:path");a("node:url");let M=class extends v{component;code;constructor(e,s,o){super({cause:o?.cause,hint:o?.hint,message:`[@visulima/email] [${e}] ${s}`,name:"EmailError",title:`Email ${e} Error`}),this.component=e,this.code=o?.code}};export{M as default};
@@ -1 +0,0 @@
1
- import h from"./DraftMailMessage-C3YTXqWo.js";import v from"./EmailError-CDvYwuqz.js";import f from"./MailMessage-DuEXJiCg.js";import{composeMiddleware as C}from"./composeMiddleware-BHwLLEzK.js";import{F as w}from"./build-mime-message-DT67qfMp.js";import{c as M}from"./create-logger-BQTS3f-I.js";import{s as l}from"./headers-to-record-De1Eg951.js";import T from"../utils/validation/check-feature-support.js";const S=(i,e,r)=>{e.success&&e.data?i&&i.info("Email sent successfully",{messageId:e.data.messageId,provider:e.data.provider}):i&&i.error("Email send failed",{error:e.error,provider:r})},j=async(i,e,r)=>{const s={...i,to:e.to};return e.cc&&(s.cc=e.cc),e.bcc&&(s.bcc=e.bcc),e.replyTo&&(s.replyTo=e.replyTo),e.headers&&(s.headers={...l(i.headers??{}),...l(e.headers)}),s.subject=e.subject??i.subject,r&&e.data&&(s.subject=await r(s.subject,e.data),i.html!==void 0&&(s.html=await r(i.html,e.data)),i.text!==void 0&&(s.text=await r(i.text,e.data))),s};class u{static extractErrorMessages(e){return e instanceof Error?[e.message]:[String(e??"Unknown error")]}provider;logger;loggerInstance;globalConfig;featureCheck;middlewares=[];composedSend;mountedProviders=new Map;constructor(e,r){this.provider=e,this.featureCheck=r?.featureCheck??"error"}setLogger(e){return this.loggerInstance=e,this.logger=M("Mail",e),this}use(e){return this.middlewares.push(e),this.composedSend=void 0,this}mount(e,r){return this.mountedProviders.set(e,r),this}setFrom(e){return this.globalConfig??={},this.globalConfig.from=e,this.logger&&this.logger.debug("Default from address updated",{from:e.email}),this}setReplyTo(e){return this.globalConfig??={},this.globalConfig.replyTo=e,this.logger&&this.logger.debug("Default reply-to address updated",{replyTo:e.email}),this}setHeaders(e){if(this.globalConfig??={},this.globalConfig.headers=e,this.logger){const r=l(e);this.logger.debug("Default headers updated",{count:Object.keys(r).length,headers:Object.keys(r)})}return this}async draft(e){let r=e instanceof f||e instanceof h?await this.buildDraftFromMessage(e):await this.buildDraftFromOptions(e);r=this.applyGlobalConfig(r);const s=r.headers?l(r.headers):{};r.headers={...s,"X-Unsent":"1"};const t=await w(r,{includeBcc:!0});return this.logger&&this.logger.debug("Draft created successfully in EML format",{from:r.from.email,size:t.length,subject:r.subject,to:Array.isArray(r.to)?r.to.length:1}),t}async send(e){if(e instanceof h)throw new TypeError("Cannot send draft messages. Convert to MailMessage first or remove X-Unsent header.");let r;if(e instanceof f)this.logger&&this.logger.debug("Sending MailMessage instance"),this.loggerInstance&&e.setLogger(this.loggerInstance),r=await e.build();else{const o=e;this.logger&&this.logger.debug("Sending email with options",{subject:o.subject,to:Array.isArray(o.to)?o.to.length:1}),r=o}r=this.applyGlobalConfig(r);const s=this.assertFeatureSupport(r);if(s)return{error:s,success:!1};const t=await this.dispatch(r);return S(this.logger,t,this.provider.name??"unknown"),t}sendMany(e,r){const s=Math.max(1,Math.floor(r?.concurrency??1));return s===1?this.sendManySerial(e,r?.signal):this.sendManyConcurrent(e,s,r?.signal)}sendBatch(e,r,s){const t=async function*(){const o=e instanceof f?await e.build():e;for(const a of r)yield await j(o,a,s?.render)};return this.sendMany(t(),{concurrency:s?.concurrency,signal:s?.signal})}async sendOneToReceipt(e){const r=this.provider.name;try{const s=await this.send(e);return s.success&&s.data?{messageId:s.data.messageId,provider:s.data.provider??r,response:s.data.response,successful:!0,timestamp:s.data.timestamp}:{errorMessages:u.extractErrorMessages(s.error),provider:r,successful:!1}}catch(s){return{errorMessages:u.extractErrorMessages(s),provider:r,successful:!1}}}async*sendManySerial(e,r){const s=this.provider.name;let t=0,o=0,a=0;this.logger&&this.logger.debug("Starting batch email send",{provider:s});for await(const n of e){if(n instanceof h)throw new TypeError("Cannot send draft messages. Convert to MailMessage first or remove X-Unsent header.");if(r?.aborted){this.logger&&this.logger.warn("Batch send operation was aborted",{failed:a,processed:t,successful:o}),yield{errorMessages:["Send operation was aborted"],provider:s,successful:!1};return}t+=1;const g=await this.sendOneToReceipt(n);g.successful?o+=1:a+=1,yield g}this.logger&&this.logger.debug("Batch email send completed",{failureCount:a,processedCount:t,provider:s,successCount:o})}async*sendManyConcurrent(e,r,s){const t=this.provider.name;this.logger&&this.logger.debug("Starting concurrent batch email send",{concurrency:r,provider:t});const o=Symbol.asyncIterator in e?e[Symbol.asyncIterator]():e[Symbol.iterator](),a=new Map;let n=0,g=!1,p=!1;const m=async()=>{for(;!g&&!p&&a.size<r;){const d=await o.next();if(d.done){g=!0;break}const c=d.value;if(c instanceof h)throw new TypeError("Cannot send draft messages. Convert to MailMessage first or remove X-Unsent header.");const b=n;n+=1,a.set(b,this.sendOneToReceipt(c).then(y=>({id:b,receipt:y})))}};for(await m();a.size>0;){if(s?.aborted){p=!0,yield{errorMessages:["Send operation was aborted"],provider:t,successful:!1};return}const{id:d,receipt:c}=await Promise.race(a.values());a.delete(d),yield c,await m()}this.logger&&this.logger.debug("Concurrent batch email send completed",{processedCount:n,provider:t})}async dispatch(e){return this.middlewares.length===0?await this.resolveProvider(e).sendEmail(e):(this.composedSend??=C(this.middlewares,r=>Promise.resolve(this.resolveProvider(r).sendEmail(r))),await this.composedSend(e))}resolveProvider(e){return e.stream!==void 0?this.mountedProviders.get(e.stream)??this.provider:this.provider}assertFeatureSupport(e){if(this.featureCheck==="off")return;const{supported:r,violations:s}=T(e,this.provider.features);if(r)return;const t=this.provider.name??"unknown",o=s.map(n=>n.field),a=s.map(n=>n.message);if(this.featureCheck==="warn"){this.logger&&this.logger.warn("Message uses capabilities the provider does not support",{fields:o,provider:t});return}return this.logger&&this.logger.error("Message rejected by capability guard",{fields:o,provider:t}),new v(t,`Provider does not support the following message fields: ${o.join(", ")}`,{code:"UNSUPPORTED_FEATURES",hint:a})}async buildDraftFromMessage(e){return this.logger&&this.logger.debug("Creating draft from MailMessage instance"),this.loggerInstance&&e.setLogger(this.loggerInstance),this.applyGlobalConfigToMessage(e),await e.build()}async buildDraftFromOptions(e){return this.logger&&this.logger.debug("Creating draft from email options",{subject:e.subject,to:Array.isArray(e.to)?e.to.length:1}),e}applyGlobalConfigToMessage(e){const r=this.globalConfig?.from;r&&!e.getFrom()&&e.from(r);const s=this.globalConfig?.replyTo;if(s&&!e.getReplyTo()&&e.replyTo(s),this.globalConfig?.headers){const t=l(this.globalConfig.headers);Object.entries(t).forEach(([o,a])=>{e.header(o,a)})}}applyGlobalConfig(e){if(!this.globalConfig)return e;const r={...e};if(!r.from&&this.globalConfig.from&&(r.from=this.globalConfig.from,this.logger&&this.logger.debug("Applied global from address",{from:this.globalConfig.from.email})),!r.replyTo&&this.globalConfig.replyTo&&(r.replyTo=this.globalConfig.replyTo,this.logger&&this.logger.debug("Applied global reply-to address",{replyTo:this.globalConfig.replyTo.email})),this.globalConfig.headers){const s=l(this.globalConfig.headers),t=r.headers?l(r.headers):{};r.headers={...s,...t},this.logger&&this.logger.debug("Merged global headers",{globalCount:Object.keys(s).length,messageCount:Object.keys(t).length})}return r}}const D=(i,e)=>new u(i,e);export{u as Mail,D as createMail};
@@ -1,3 +0,0 @@
1
- import v from"./EmailError-CDvYwuqz.js";import l from"../utils/format-email-address.js";import{r as F}from"./generate-boundary-0xGe9GqK.js";import{s as M}from"./headers-to-record-De1Eg951.js";import{f as g}from"./quoted-printable-nSGDA1tA.js";import{s as T,a as f}from"./sanitize-header-DtQwAnzg.js";const d=globalThis.Buffer!==void 0,$=t=>{if(typeof t=="string"){if(d)return Buffer.from(t,"utf8").toString("base64");const e=new TextEncoder().encode(t);let r="";const n=8192;for(let s=0;s<e.length;s+=n){const i=e.subarray(s,Math.min(s+n,e.length));r+=String.fromCharCode(...i)}return btoa(r)}if(d&&t instanceof Buffer)return t.toString("base64");const a=t instanceof Uint8Array?t:new Uint8Array(t);if(d)return Buffer.from(a).toString("base64");let h="";const o=8192;for(let e=0;e<a.length;e+=o){const r=a.subarray(e,Math.min(e+o,a.length));h+=String.fromCharCode(...r)}return btoa(h)},j=globalThis.Buffer!==void 0,A=/[^\u0000-\u007F]/,S=t=>!A.test(t),U=t=>{if(S(t))return t;const a=45,h=new TextDecoder,o=j?Buffer.from(t,"utf8"):new TextEncoder().encode(t),e=[];let r=0;for(;r<o.length;){let n=Math.min(r+a,o.length);if(n<o.length)for(;n>r&&(o[n]&192)===128;)n-=1;const s=o.subarray(r,n),i=h.decode(s);e.push(`=?UTF-8?B?${$(i)}?=`),r=n}return e.join(" ")},b=t=>Array.isArray(t)?t.map(a=>l(a)).join(", "):l(t),y=/[^ -]/,C=t=>U(f(t)),D=globalThis.Buffer!==void 0,x=t=>t.replaceAll(/.{1,76}/g,`$&\r
2
- `).trimEnd(),P=async(t,a={})=>{const{includeBcc:h=!1}=a,o=F(),e=[`From: ${l(t.from)}`,`To: ${b(t.to)}`];if(t.cc&&e.push(`Cc: ${b(t.cc)}`),h&&t.bcc&&e.push(`Bcc: ${b(t.bcc)}`),t.replyTo&&e.push(`Reply-To: ${l(t.replyTo)}`),e.push(`Subject: ${C(t.subject)}`,"MIME-Version: 1.0"),t.headers){const r=M(t.headers);Object.entries(r).forEach(([n,s])=>{const i=T(n),p=f(s);e.push(`${i}: ${p}`)})}if(e.push(`Content-Type: multipart/mixed; boundary="${o}"`,""),t.text&&(y.test(t.text)?e.push(`--${o}`,"Content-Type: text/plain; charset=UTF-8","Content-Transfer-Encoding: quoted-printable","",g(t.text),""):e.push(`--${o}`,"Content-Type: text/plain; charset=UTF-8","Content-Transfer-Encoding: 7bit","",t.text,"")),t.html&&(y.test(t.html)?e.push(`--${o}`,"Content-Type: text/html; charset=UTF-8","Content-Transfer-Encoding: quoted-printable","",g(t.html),""):e.push(`--${o}`,"Content-Type: text/html; charset=UTF-8","Content-Transfer-Encoding: 7bit","",t.html,"")),t.attachments&&t.attachments.length>0){const r=await Promise.all(t.attachments.map(async n=>{let s;if(n.raw!==void 0)s=n.raw;else{if(n.content===void 0)throw new v("attachment",`Attachment '${n.filename}' must have content, raw, or be resolved from path/href before building MIME message`);s=n.content instanceof Promise?await n.content:n.content}return{...n,resolvedContent:s}}));for(const n of r){e.push(`--${o}`);const s=f(n.contentType??"application/octet-stream"),i=C(n.filename);e.push(`Content-Type: ${s}; name="${i}"`);const p=f(n.contentDisposition??"attachment");e.push(`Content-Disposition: ${p}; filename="${i}"`),n.cid&&e.push(`Content-ID: <${f(n.cid)}>`),n.headers&&Object.entries(n.headers).forEach(([m,w])=>{const B=T(m),E=f(w);e.push(`${B}: ${E}`)});const u=f(n.encoding??"base64");e.push(`Content-Transfer-Encoding: ${u}`,"");const c=n.resolvedContent;if(u==="base64")e.push(x($(c)));else if(u==="7bit"||u==="8bit")if(typeof c=="string")e.push(c);else if(D&&c instanceof Buffer)e.push(c.toString("utf8"));else{const m=new TextDecoder;e.push(m.decode(c))}else e.push(x($(c)));e.push("")}}return e.push(`--${o}--`),e.join(`\r
3
- `)};export{P as F};