@visulima/email 2.1.9 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/crypto/index.d.ts +50 -47
  3. package/dist/crypto/index.js +1 -1
  4. package/dist/index.d.ts +2 -2
  5. package/dist/index.js +1 -1
  6. package/dist/middleware/index.d.ts +19 -6
  7. package/dist/middleware/index.js +1 -1
  8. package/dist/packem_chunks/index.js +27 -0
  9. package/dist/packem_shared/DkimSigner-CCxFKitN.js +4 -0
  10. package/dist/packem_shared/{DraftMailMessage-Tj3sH8nn.js → DraftMailMessage-B0gwf8n_.js} +1 -1
  11. package/dist/packem_shared/{Mail-Cm24B3w0.js → Mail-DmYNQ0KK.js} +1 -1
  12. package/dist/packem_shared/{MailMessage-BtI4qMU1.js → MailMessage-DmmaNHHc.js} +1 -1
  13. package/dist/packem_shared/{SmimeEncrypter-BjBwjaTg.js → SmimeEncrypter-DnlfpjUX.js} +3 -3
  14. package/dist/packem_shared/{SmimeSigner-CK5TITxI.js → SmimeSigner-DTvclzLq.js} +2 -2
  15. package/dist/packem_shared/{address-formatter-CXZ1aWBX.js → address-formatter-w36S9ZYj.js} +1 -1
  16. package/dist/packem_shared/{ahaSendProvider-DY559XjD.js → ahaSendProvider-C1qvG8Cj.js} +1 -1
  17. package/dist/packem_shared/arcMessageSignatureBase-su9VTRB7.js +9 -0
  18. package/dist/packem_shared/{autoSendProvider-BgdWf422.js → autoSendProvider-yxUx3sEj.js} +1 -1
  19. package/dist/packem_shared/{azureProvider-Bs4BGYR1.js → azureProvider-CLLRKtOf.js} +1 -1
  20. package/dist/packem_shared/{brevoProvider-xoRTeFIx.js → brevoProvider-CHlodyzV.js} +1 -1
  21. package/dist/packem_shared/build-mime-message-BCFKPqaW.js +3 -0
  22. package/dist/packem_shared/canonicalize-BEjQUnUe.js +11 -0
  23. package/dist/packem_shared/cloudflareEmailProvider-Ckh_u-0D.js +1 -0
  24. package/dist/packem_shared/{createTestEmail-CPnHNKBT.js → createTestEmail-sB6z8m6Z.js} +1 -1
  25. package/dist/packem_shared/detectMimeType-BRz3Qjyz.js +1 -0
  26. package/dist/packem_shared/format-address-Bb7xk8G_.js +1 -0
  27. package/dist/packem_shared/{infobipProvider-mEYgfWJ7.js → infobipProvider-BEu1ycxS.js} +1 -1
  28. package/dist/packem_shared/{mail.d-8M9NjOr0.d.ts → mail.d-BdyyyQO5.d.ts} +10 -7
  29. package/dist/packem_shared/{mailCrabProvider-Cx9rnuyE.js → mailCrabProvider-BQ5ELwPU.js} +1 -1
  30. package/dist/packem_shared/{mailPaceProvider-DvSlan-v.js → mailPaceProvider-Ca3cz8JU.js} +1 -1
  31. package/dist/packem_shared/{mailchannelsProvider-Cgb8el7C.js → mailchannelsProvider-BZeuZk3d.js} +1 -1
  32. package/dist/packem_shared/{mailerSendProvider-BvRIjuVE.js → mailerSendProvider-C_Db652T.js} +1 -1
  33. package/dist/packem_shared/{mailgunProvider-kNcvF_z6.js → mailgunProvider-CU2b8ie8.js} +1 -1
  34. package/dist/packem_shared/{mailjetProvider-DqJUhLuH.js → mailjetProvider-VqvqCS7I.js} +1 -1
  35. package/dist/packem_shared/{mailomatProvider-BBOqRhV_.js → mailomatProvider-FMk4FZZz.js} +1 -1
  36. package/dist/packem_shared/{mailtrapProvider-CeBW2Gzg.js → mailtrapProvider-Qs0exKiJ.js} +1 -1
  37. package/dist/packem_shared/{mandrillProvider-Dab8i0gF.js → mandrillProvider-Co_EfMxl.js} +1 -1
  38. package/dist/packem_shared/{netcoreProvider-DMJsQ8IM.js → netcoreProvider-_kXjZ0bE.js} +1 -1
  39. package/dist/packem_shared/oauth2Middleware-C0M1w3_2.js +1 -0
  40. package/dist/packem_shared/{postalProvider-COVY4T94.js → postalProvider-tEBNXL3h.js} +1 -1
  41. package/dist/packem_shared/{postmarkProvider-Cj64C4dc.js → postmarkProvider-DdavP5x5.js} +1 -1
  42. package/dist/packem_shared/{resendProvider-Da5r7dMe.js → resendProvider-CMtlyIye.js} +1 -1
  43. package/dist/packem_shared/{scalewayProvider-CDjpYmJc.js → scalewayProvider-BFA1PQ73.js} +1 -1
  44. package/dist/packem_shared/{sendGridProvider-C1rp9hpg.js → sendGridProvider-DV80Lg7a.js} +1 -1
  45. package/dist/packem_shared/smtpProvider-BCEzJmay.js +14 -0
  46. package/dist/packem_shared/{sparkpostProvider-DKon_hyx.js → sparkpostProvider-C3pATjJX.js} +1 -1
  47. package/dist/packem_shared/{sweegoProvider-BclZuNBf.js → sweegoProvider-CkFtUAzq.js} +1 -1
  48. package/dist/packem_shared/{types.d-B0t3PQ3t.d.ts → types.d-Cb5fls_X.d.ts} +1 -1
  49. package/dist/packem_shared/{zeptomailProvider-D5B3kqFm.js → zeptomailProvider-tqRYpQlv.js} +1 -1
  50. package/dist/providers/ahasend/index.js +1 -1
  51. package/dist/providers/autosend/index.js +1 -1
  52. package/dist/providers/azure/index.js +1 -1
  53. package/dist/providers/brevo/index.js +1 -1
  54. package/dist/providers/cloudflare-email/index.d.ts +17 -1
  55. package/dist/providers/cloudflare-email/index.js +1 -1
  56. package/dist/providers/infobip/index.js +1 -1
  57. package/dist/providers/mailchannels/index.js +1 -1
  58. package/dist/providers/mailcrab/index.js +1 -1
  59. package/dist/providers/mailersend/index.js +1 -1
  60. package/dist/providers/mailgun/index.js +1 -1
  61. package/dist/providers/mailjet/index.js +1 -1
  62. package/dist/providers/mailomat/index.js +1 -1
  63. package/dist/providers/mailpace/index.js +1 -1
  64. package/dist/providers/mailtrap/index.js +1 -1
  65. package/dist/providers/mandrill/index.js +1 -1
  66. package/dist/providers/netcore/index.js +1 -1
  67. package/dist/providers/postal/index.js +1 -1
  68. package/dist/providers/postmark/index.js +1 -1
  69. package/dist/providers/resend/index.js +1 -1
  70. package/dist/providers/scaleway/index.js +1 -1
  71. package/dist/providers/sendgrid/index.js +1 -1
  72. package/dist/providers/smtp/index.d.ts +9 -5
  73. package/dist/providers/smtp/index.js +1 -1
  74. package/dist/providers/sparkpost/index.js +1 -1
  75. package/dist/providers/sweego/index.js +1 -1
  76. package/dist/providers/zeptomail/index.js +1 -1
  77. package/dist/test/index.d.ts +2 -2
  78. package/dist/test/index.js +1 -1
  79. package/dist/utils/format-email-address.js +1 -1
  80. package/package.json +1 -1
  81. package/dist/packem_shared/DkimSigner-B_pEwGCS.js +0 -18
  82. package/dist/packem_shared/arcMessageSignatureBase-B0Qi-724.js +0 -17
  83. package/dist/packem_shared/build-mime-message-QNCMA6oQ.js +0 -3
  84. package/dist/packem_shared/cloudflareEmailProvider-BkR-P0YD.js +0 -1
  85. package/dist/packem_shared/detectMimeType-DVC9Uvy9.js +0 -1
  86. package/dist/packem_shared/format-address-BDKhXcXV.js +0 -1
  87. package/dist/packem_shared/index-B8wiKJdh.js +0 -1
  88. package/dist/packem_shared/oauth2Middleware-DbKGd7Z9.js +0 -1
  89. package/dist/packem_shared/smtpProvider-Dr2XAFQu.js +0 -27
@@ -1 +1 @@
1
- import u from"./EmailError-BIaHK1Uw.js";import T from"./RequiredOptionError-ctDEEB1s.js";import{g as w}from"./generate-message-id-B2n2yqR6.js";import{h as P}from"./headers-to-record-ZOZ7Dubo.js";import{m as g}from"./make-request-Cyz5_yu8.js";import{r as h}from"./retry-aghj7y8m.js";import{a as b,s as I}from"./sanitize-header-CW0f3IT7.js";import{v as _}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as C}from"./defineProvider-C9q-7iwt.js";import{c as j,P as k,h as p}from"./provider-base-BEz00m9R.js";import{k as y}from"./address-formatter-CXZ1aWBX.js";import{p as S}from"./attachment-processor-BJFDS343.js";const t="mandrill",z="https://mandrillapp.com/api/1.0",M=3e4,R=3,G=C((i={})=>{if(!i.apiKey)throw new T(t,"apiKey");const s={apiKey:i.apiKey,debug:i.debug??!1,endpoint:i.endpoint??z,retries:i.retries??R,timeout:i.timeout??M,...i.logger&&{logger:i.logger}},m=new k,o=j(t,i.logger);return{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 u(t,"Email ID is required to retrieve email details"),success:!1};await m.ensureInitialized(()=>this.initialize(),t),o.debug("Retrieving email details",{id:e});const c={id:e,key:s.apiKey},r={"Content-Type":"application/json"},n=await h(async()=>g(`${s.endpoint}/messages/info.json`,{headers:r,method:"POST",timeout:s.timeout},JSON.stringify(c)),s.retries);return n.success?(o.debug("Email details retrieved successfully"),{data:n.data?.body,success:!0}):(o.debug("API request failed when retrieving email",n.error),{error:new u(t,`Failed to retrieve email: ${n.error instanceof Error?n.error.message:"Unknown error"}`,{cause:n.error}),success:!1})}catch(c){return{error:p(t,"retrieve email",c,o),success:!1}}},async initialize(){await m.ensureInitialized(async()=>{if(!await this.isAvailable())throw new u(t,"Mandrill API not available or invalid API key");o.debug("Provider initialized successfully")},t)},async isAvailable(){try{o.debug("Checking Mandrill API availability");const e={key:s.apiKey},c={"Content-Type":"application/json"},r=await g(`${s.endpoint}/users/info.json`,{headers:c,method:"POST",timeout:s.timeout},JSON.stringify(e));return o.debug("Mandrill API availability check response:",{error:r.error instanceof Error?r.error.message:void 0,statusCode:r.data?.statusCode,success:r.success}),!!(r.success&&r.data&&typeof r.data=="object"&&"statusCode"in r.data&&typeof r.data.statusCode=="number"&&r.data.statusCode>=200&&r.data.statusCode<300)}catch(e){return o.debug("Error checking availability:",e),!1}},name:t,options:s,async sendEmail(e){try{const c=_(e);if(c.length>0)return{error:new u(t,`Invalid email options: ${c.join(", ")}`),success:!1};await m.ensureInitialized(()=>this.initialize(),t);const r={from_email:e.from.email,html:e.html??"",subject:e.subject,text:e.text??"",...e.from.name&&{from_name:e.from.name},to:y(e.to,"to")};if(e.cc){const a=y(e.cc,"cc");for(const d of a)d.type="cc";r.to=[...r.to,...a]}if(e.bcc){const a=y(e.bcc,"bcc");for(const d of a)d.type="bcc";r.to=[...r.to,...a]}if(e.replyTo){const a=e.replyTo.name?`${b(e.replyTo.name)} <${e.replyTo.email}>`:e.replyTo.email;r.headers={"Reply-To":a}}if(e.headers){const a=P(e.headers),d={};Object.entries(a).forEach(([A,E])=>{d[I(A)]=b(E)}),r.headers={...r.headers,...d}}e.tags&&e.tags.length>0&&(r.tags=e.tags),e.metadata&&(r.metadata=e.metadata),(e.googleAnalyticsDomains||e.googleAnalyticsCampaign)&&(r.google_analytics_domains=e.googleAnalyticsDomains,r.google_analytics_campaign=e.googleAnalyticsCampaign),e.subaccount&&(r.subaccount=e.subaccount),e.attachments&&e.attachments.length>0&&(r.attachments=await Promise.all(e.attachments.map(async a=>({content:await S(a,t),name:a.filename,type:a.contentType??"application/octet-stream"}))));const n={key:s.apiKey,message:r};e.templateName&&(n.template_name=e.templateName,e.templateContent&&(n.template_content=e.templateContent),e.templateVariables&&(n.template_vars=e.templateVariables)),e.globalMergeVars&&(r.global_merge_vars=e.globalMergeVars),e.mergeVars&&(r.merge_vars=e.mergeVars),e.sendAt&&(n.send_at=e.sendAt),o.debug("Sending email via Mandrill API",{subject:r.subject,to:r.to});const v={"Content-Type":"application/json"},l=await h(async()=>g(`${s.endpoint}/messages/send.json`,{headers:v,method:"POST",timeout:s.timeout},JSON.stringify(n)),s.retries);if(!l.success)return o.debug("API request failed when sending email",l.error),{error:l.error??new u(t,"Failed to send email"),success:!1};const f=l.data?.body?.[0]?.id??w();return o.debug("Email sent successfully",{messageId:f}),{data:{messageId:f,provider:t,response:l.data,sent:!0,timestamp:new Date},success:!0}}catch(c){return{error:p(t,"send email",c,o),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{G as default};
1
+ import u from"./EmailError-BIaHK1Uw.js";import T from"./RequiredOptionError-ctDEEB1s.js";import{g as w}from"./generate-message-id-B2n2yqR6.js";import{h as P}from"./headers-to-record-ZOZ7Dubo.js";import{m as g}from"./make-request-Cyz5_yu8.js";import{r as h}from"./retry-aghj7y8m.js";import{a as b,s as I}from"./sanitize-header-CW0f3IT7.js";import{v as _}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as C}from"./defineProvider-C9q-7iwt.js";import{c as j,P as k,h as p}from"./provider-base-BEz00m9R.js";import{k as y}from"./address-formatter-w36S9ZYj.js";import{p as S}from"./attachment-processor-BJFDS343.js";const t="mandrill",z="https://mandrillapp.com/api/1.0",M=3e4,R=3,G=C((i={})=>{if(!i.apiKey)throw new T(t,"apiKey");const s={apiKey:i.apiKey,debug:i.debug??!1,endpoint:i.endpoint??z,retries:i.retries??R,timeout:i.timeout??M,...i.logger&&{logger:i.logger}},m=new k,o=j(t,i.logger);return{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 u(t,"Email ID is required to retrieve email details"),success:!1};await m.ensureInitialized(()=>this.initialize(),t),o.debug("Retrieving email details",{id:e});const c={id:e,key:s.apiKey},r={"Content-Type":"application/json"},n=await h(async()=>g(`${s.endpoint}/messages/info.json`,{headers:r,method:"POST",timeout:s.timeout},JSON.stringify(c)),s.retries);return n.success?(o.debug("Email details retrieved successfully"),{data:n.data?.body,success:!0}):(o.debug("API request failed when retrieving email",n.error),{error:new u(t,`Failed to retrieve email: ${n.error instanceof Error?n.error.message:"Unknown error"}`,{cause:n.error}),success:!1})}catch(c){return{error:p(t,"retrieve email",c,o),success:!1}}},async initialize(){await m.ensureInitialized(async()=>{if(!await this.isAvailable())throw new u(t,"Mandrill API not available or invalid API key");o.debug("Provider initialized successfully")},t)},async isAvailable(){try{o.debug("Checking Mandrill API availability");const e={key:s.apiKey},c={"Content-Type":"application/json"},r=await g(`${s.endpoint}/users/info.json`,{headers:c,method:"POST",timeout:s.timeout},JSON.stringify(e));return o.debug("Mandrill API availability check response:",{error:r.error instanceof Error?r.error.message:void 0,statusCode:r.data?.statusCode,success:r.success}),!!(r.success&&r.data&&typeof r.data=="object"&&"statusCode"in r.data&&typeof r.data.statusCode=="number"&&r.data.statusCode>=200&&r.data.statusCode<300)}catch(e){return o.debug("Error checking availability:",e),!1}},name:t,options:s,async sendEmail(e){try{const c=_(e);if(c.length>0)return{error:new u(t,`Invalid email options: ${c.join(", ")}`),success:!1};await m.ensureInitialized(()=>this.initialize(),t);const r={from_email:e.from.email,html:e.html??"",subject:e.subject,text:e.text??"",...e.from.name&&{from_name:e.from.name},to:y(e.to,"to")};if(e.cc){const a=y(e.cc,"cc");for(const d of a)d.type="cc";r.to=[...r.to,...a]}if(e.bcc){const a=y(e.bcc,"bcc");for(const d of a)d.type="bcc";r.to=[...r.to,...a]}if(e.replyTo){const a=e.replyTo.name?`${b(e.replyTo.name)} <${e.replyTo.email}>`:e.replyTo.email;r.headers={"Reply-To":a}}if(e.headers){const a=P(e.headers),d={};Object.entries(a).forEach(([A,E])=>{d[I(A)]=b(E)}),r.headers={...r.headers,...d}}e.tags&&e.tags.length>0&&(r.tags=e.tags),e.metadata&&(r.metadata=e.metadata),(e.googleAnalyticsDomains||e.googleAnalyticsCampaign)&&(r.google_analytics_domains=e.googleAnalyticsDomains,r.google_analytics_campaign=e.googleAnalyticsCampaign),e.subaccount&&(r.subaccount=e.subaccount),e.attachments&&e.attachments.length>0&&(r.attachments=await Promise.all(e.attachments.map(async a=>({content:await S(a,t),name:a.filename,type:a.contentType??"application/octet-stream"}))));const n={key:s.apiKey,message:r};e.templateName&&(n.template_name=e.templateName,e.templateContent&&(n.template_content=e.templateContent),e.templateVariables&&(n.template_vars=e.templateVariables)),e.globalMergeVars&&(r.global_merge_vars=e.globalMergeVars),e.mergeVars&&(r.merge_vars=e.mergeVars),e.sendAt&&(n.send_at=e.sendAt),o.debug("Sending email via Mandrill API",{subject:r.subject,to:r.to});const v={"Content-Type":"application/json"},l=await h(async()=>g(`${s.endpoint}/messages/send.json`,{headers:v,method:"POST",timeout:s.timeout},JSON.stringify(n)),s.retries);if(!l.success)return o.debug("API request failed when sending email",l.error),{error:l.error??new u(t,"Failed to send email"),success:!1};const f=l.data?.body?.[0]?.id??w();return o.debug("Email sent successfully",{messageId:f}),{data:{messageId:f,provider:t,response:l.data,sent:!0,timestamp:new Date},success:!0}}catch(c){return{error:p(t,"send email",c,o),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{G as default};
@@ -1 +1 @@
1
- import m from"./EmailError-BIaHK1Uw.js";import y from"./RequiredOptionError-ctDEEB1s.js";import{g}from"./generate-message-id-B2n2yqR6.js";import{m as v}from"./make-request-Cyz5_yu8.js";import{r as E}from"./retry-aghj7y8m.js";import{v as b}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as w}from"./defineProvider-C9q-7iwt.js";import{c as I,P,h as T}from"./provider-base-BEz00m9R.js";import{a as d}from"./address-formatter-CXZ1aWBX.js";import{c as A}from"./attachment-processor-BJFDS343.js";const r="netcore",_="https://emailapi.netcorecloud.net/v5.1",D=3e4,S=3,l=a=>[a].flat(),q=w((a={})=>{if(!a.apiKey)throw new y(r,"apiKey");const s={apiKey:a.apiKey,debug:a.debug??!1,endpoint:a.endpoint??_,logger:a.logger,retries:a.retries??S,timeout:a.timeout??D},u=new P,p=I(r,a.logger);return{features:{attachments:!0,batchSending:!0,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!0,templates:!0,tracking:!0},async initialize(){await u.ensureInitialized(async()=>{if(!await this.isAvailable())throw new m(r,"Netcore API not available or invalid API key");p.debug("Provider initialized successfully")},r)},async isAvailable(){return s.apiKey.length>0},name:r,options:s,async sendEmail(e){try{const o=b(e);if(o.length>0)return{error:new m(r,`Invalid email options: ${o.join(", ")}`),success:!1};await u.ensureInitialized(()=>this.initialize(),r);const i={to:l(e.to).map(t=>d(t))};e.cc&&(i.cc=l(e.cc).map(t=>d(t))),e.bcc&&(i.bcc=l(e.bcc).map(t=>d(t)));const n={from:d(e.from),personalizations:[i],subject:e.subject};if(e.templateId)n.template_id=e.templateId,e.templateData&&(i.attributes=e.templateData);else{const t=[];e.html&&t.push({type:"html",value:e.html}),e.text&&t.push({type:"plain",value:e.text}),t.length>0&&(n.content=t)}if(e.replyTo){const t=l(e.replyTo)[0];t&&(n.reply_to=t.email)}e.attachments&&e.attachments.length>0&&(n.attachments=await Promise.all(e.attachments.map(async t=>{const h=await A(t,r);return{content:h.content,name:h.filename}})));const c=await E(async()=>v(`${s.endpoint}/mail/send`,{headers:{api_key:s.apiKey,"Content-Type":"application/json"},method:"POST",timeout:s.timeout},JSON.stringify(n)),s.retries);if(!c.success)return{error:c.error??new m(r,"Failed to send email"),success:!1};const{body:f}=c.data;return{data:{messageId:f?.data?.message_id??f?.message_id??g(),provider:r,response:c.data,sent:!0,timestamp:new Date},success:!0}}catch(o){return{error:T(r,"send email",o,p),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{q as default};
1
+ import m from"./EmailError-BIaHK1Uw.js";import y from"./RequiredOptionError-ctDEEB1s.js";import{g}from"./generate-message-id-B2n2yqR6.js";import{m as v}from"./make-request-Cyz5_yu8.js";import{r as E}from"./retry-aghj7y8m.js";import{v as b}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as w}from"./defineProvider-C9q-7iwt.js";import{c as I,P,h as T}from"./provider-base-BEz00m9R.js";import{a as d}from"./address-formatter-w36S9ZYj.js";import{c as A}from"./attachment-processor-BJFDS343.js";const r="netcore",_="https://emailapi.netcorecloud.net/v5.1",D=3e4,S=3,l=a=>[a].flat(),q=w((a={})=>{if(!a.apiKey)throw new y(r,"apiKey");const s={apiKey:a.apiKey,debug:a.debug??!1,endpoint:a.endpoint??_,logger:a.logger,retries:a.retries??S,timeout:a.timeout??D},u=new P,p=I(r,a.logger);return{features:{attachments:!0,batchSending:!0,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!0,templates:!0,tracking:!0},async initialize(){await u.ensureInitialized(async()=>{if(!await this.isAvailable())throw new m(r,"Netcore API not available or invalid API key");p.debug("Provider initialized successfully")},r)},async isAvailable(){return s.apiKey.length>0},name:r,options:s,async sendEmail(e){try{const o=b(e);if(o.length>0)return{error:new m(r,`Invalid email options: ${o.join(", ")}`),success:!1};await u.ensureInitialized(()=>this.initialize(),r);const i={to:l(e.to).map(t=>d(t))};e.cc&&(i.cc=l(e.cc).map(t=>d(t))),e.bcc&&(i.bcc=l(e.bcc).map(t=>d(t)));const n={from:d(e.from),personalizations:[i],subject:e.subject};if(e.templateId)n.template_id=e.templateId,e.templateData&&(i.attributes=e.templateData);else{const t=[];e.html&&t.push({type:"html",value:e.html}),e.text&&t.push({type:"plain",value:e.text}),t.length>0&&(n.content=t)}if(e.replyTo){const t=l(e.replyTo)[0];t&&(n.reply_to=t.email)}e.attachments&&e.attachments.length>0&&(n.attachments=await Promise.all(e.attachments.map(async t=>{const h=await A(t,r);return{content:h.content,name:h.filename}})));const c=await E(async()=>v(`${s.endpoint}/mail/send`,{headers:{api_key:s.apiKey,"Content-Type":"application/json"},method:"POST",timeout:s.timeout},JSON.stringify(n)),s.retries);if(!c.success)return{error:c.error??new m(r,"Failed to send email"),success:!1};const{body:f}=c.data;return{data:{messageId:f?.data?.message_id??f?.message_id??g(),provider:r,response:c.data,sent:!0,timestamp:new Date},success:!0}}catch(o){return{error:T(r,"send email",o,p),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{q as default};
@@ -0,0 +1 @@
1
+ import{c as w}from"./create-token-cache-BdMsMzf7.js";import{h as k}from"./headers-to-record-ZOZ7Dubo.js";const f=t=>{const{fetchToken:n,headerName:r,now:d=Date.now,onToken:o,scheme:s="Bearer",skewMs:h=6e4}=t;if(r?.trim()==="")throw new TypeError("oauth2Middleware: `headerName` must be a non-empty header name.");if(o===void 0&&r===void 0)throw new TypeError("oauth2Middleware: supply `onToken` to receive the token (recommended), or `headerName` to inject it into a message header.");const c=w(async()=>{const e=await n();return o?.(e),e},{now:d,skewMs:h});return async(e,a)=>{const i=await c();if(r===void 0)return a(e);const m=e.headers?k(e.headers):{};return a({...e,headers:{...m,[r]:`${s} ${i.accessToken}`}})}};export{f as oauth2Middleware};
@@ -1 +1 @@
1
- import d from"./EmailError-BIaHK1Uw.js";import p from"./RequiredOptionError-ctDEEB1s.js";import{g as w}from"./generate-message-id-B2n2yqR6.js";import{h as P}from"./headers-to-record-ZOZ7Dubo.js";import{m as u}from"./make-request-Cyz5_yu8.js";import{r as y}from"./retry-aghj7y8m.js";import{v as E}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as I}from"./defineProvider-C9q-7iwt.js";import{c as A,P as T}from"./provider-base-BEz00m9R.js";import{l as m,m as h}from"./address-formatter-CXZ1aWBX.js";import{p as C}from"./attachment-processor-BJFDS343.js";const a="postal",S=3e4,j=3,L=I((s={})=>{if(!s.host)throw new p(a,"host");if(!s.apiKey)throw new p(a,"apiKey");const f=s.endpoint??`https://${s.host}/api/v1`,o={apiKey:s.apiKey,debug:s.debug??!1,endpoint:f,host:s.host,retries:s.retries??j,timeout:s.timeout??S,...s.logger&&{logger:s.logger}},l=new T,i=A(a,s.logger);return{features:{attachments:!0,batchSending:!1,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!0,templates:!0,tracking:!0},async getEmail(e){try{if(!e)return{error:new d(a,"Email ID is required to retrieve email details"),success:!1};await l.ensureInitialized(()=>this.initialize(),a);const t={"Content-Type":"application/json","X-Server-API-Key":o.apiKey};i.debug("Retrieving email details",{id:e});const r=await y(async()=>u(`${o.endpoint}/messages/${e}`,{headers:t,method:"GET",timeout:o.timeout}),o.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 d(a,`Failed to retrieve email: ${r.error instanceof Error?r.error.message:"Unknown error"}`,{cause:r.error}),success:!1})}catch(t){return i.debug("Exception retrieving email",t),{error:new d(a,`Failed to retrieve email: ${t.message}`,{cause:t}),success:!1}}},async initialize(){await l.ensureInitialized(async()=>{if(!await this.isAvailable())throw new d(a,"Postal API not available or invalid API key");i.debug("Provider initialized successfully")},a)},async isAvailable(){try{const e={"Content-Type":"application/json","X-Server-API-Key":o.apiKey};i.debug("Checking Postal API availability");const t=await u(`${o.endpoint}/server`,{headers:e,method:"GET",timeout:o.timeout});return i.debug("Postal 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:a,options:o,async sendEmail(e){try{const t=E(e);if(t.length>0)return{error:new d(a,`Invalid email options: ${t.join(", ")}`),success:!1};await l.ensureInitialized(()=>this.initialize(),a);const r={from:h(e.from).address,subject:e.subject,to:m(e.to).map(n=>n.address)};if(e.html&&(r.html_body=e.html),e.text&&(r.plain_body=e.text),e.cc&&(r.cc=m(e.cc).map(n=>n.address)),e.bcc&&(r.bcc=m(e.bcc).map(n=>n.address)),e.replyTo&&(r.reply_to=h(e.replyTo).address),e.templateId&&(r.template_id=e.templateId,e.templateVariables&&(r.template_variables=e.templateVariables)),e.tags&&e.tags.length>0&&(r.tag=e.tags.join(",")),e.headers){const n=P(e.headers);r.headers=n}e.attachments&&e.attachments.length>0&&(r.attachments=await Promise.all(e.attachments.map(async n=>{const v=await C(n,a);return{content_type:n.contentType??"application/octet-stream",data:v,name:n.filename}}))),i.debug("Sending email via Postal API",{subject:r.subject,to:r.to});const b={"Content-Type":"application/json","X-Server-API-Key":o.apiKey},c=await y(async()=>u(`${o.endpoint}/send/message`,{headers:b,method:"POST",timeout:o.timeout},JSON.stringify(r)),o.retries);if(!c.success)return i.debug("API request failed when sending email",c.error),{error:c.error??new d(a,"Failed to send email"),success:!1};const g=c.data?.body?.message_id?.toString()??w();return i.debug("Email sent successfully",{messageId:g}),{data:{messageId:g,provider:a,response:c.data,sent:!0,timestamp:new Date},success:!0}}catch(t){return i.debug("Exception sending email",t),{error:new d(a,`Failed to send email: ${t.message}`,{cause:t}),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{L as default};
1
+ import d from"./EmailError-BIaHK1Uw.js";import p from"./RequiredOptionError-ctDEEB1s.js";import{g as w}from"./generate-message-id-B2n2yqR6.js";import{h as P}from"./headers-to-record-ZOZ7Dubo.js";import{m as u}from"./make-request-Cyz5_yu8.js";import{r as y}from"./retry-aghj7y8m.js";import{v as E}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as I}from"./defineProvider-C9q-7iwt.js";import{c as A,P as T}from"./provider-base-BEz00m9R.js";import{l as m,m as h}from"./address-formatter-w36S9ZYj.js";import{p as C}from"./attachment-processor-BJFDS343.js";const a="postal",S=3e4,j=3,L=I((s={})=>{if(!s.host)throw new p(a,"host");if(!s.apiKey)throw new p(a,"apiKey");const f=s.endpoint??`https://${s.host}/api/v1`,o={apiKey:s.apiKey,debug:s.debug??!1,endpoint:f,host:s.host,retries:s.retries??j,timeout:s.timeout??S,...s.logger&&{logger:s.logger}},l=new T,i=A(a,s.logger);return{features:{attachments:!0,batchSending:!1,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!0,templates:!0,tracking:!0},async getEmail(e){try{if(!e)return{error:new d(a,"Email ID is required to retrieve email details"),success:!1};await l.ensureInitialized(()=>this.initialize(),a);const t={"Content-Type":"application/json","X-Server-API-Key":o.apiKey};i.debug("Retrieving email details",{id:e});const r=await y(async()=>u(`${o.endpoint}/messages/${e}`,{headers:t,method:"GET",timeout:o.timeout}),o.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 d(a,`Failed to retrieve email: ${r.error instanceof Error?r.error.message:"Unknown error"}`,{cause:r.error}),success:!1})}catch(t){return i.debug("Exception retrieving email",t),{error:new d(a,`Failed to retrieve email: ${t.message}`,{cause:t}),success:!1}}},async initialize(){await l.ensureInitialized(async()=>{if(!await this.isAvailable())throw new d(a,"Postal API not available or invalid API key");i.debug("Provider initialized successfully")},a)},async isAvailable(){try{const e={"Content-Type":"application/json","X-Server-API-Key":o.apiKey};i.debug("Checking Postal API availability");const t=await u(`${o.endpoint}/server`,{headers:e,method:"GET",timeout:o.timeout});return i.debug("Postal 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:a,options:o,async sendEmail(e){try{const t=E(e);if(t.length>0)return{error:new d(a,`Invalid email options: ${t.join(", ")}`),success:!1};await l.ensureInitialized(()=>this.initialize(),a);const r={from:h(e.from).address,subject:e.subject,to:m(e.to).map(n=>n.address)};if(e.html&&(r.html_body=e.html),e.text&&(r.plain_body=e.text),e.cc&&(r.cc=m(e.cc).map(n=>n.address)),e.bcc&&(r.bcc=m(e.bcc).map(n=>n.address)),e.replyTo&&(r.reply_to=h(e.replyTo).address),e.templateId&&(r.template_id=e.templateId,e.templateVariables&&(r.template_variables=e.templateVariables)),e.tags&&e.tags.length>0&&(r.tag=e.tags.join(",")),e.headers){const n=P(e.headers);r.headers=n}e.attachments&&e.attachments.length>0&&(r.attachments=await Promise.all(e.attachments.map(async n=>{const v=await C(n,a);return{content_type:n.contentType??"application/octet-stream",data:v,name:n.filename}}))),i.debug("Sending email via Postal API",{subject:r.subject,to:r.to});const b={"Content-Type":"application/json","X-Server-API-Key":o.apiKey},c=await y(async()=>u(`${o.endpoint}/send/message`,{headers:b,method:"POST",timeout:o.timeout},JSON.stringify(r)),o.retries);if(!c.success)return i.debug("API request failed when sending email",c.error),{error:c.error??new d(a,"Failed to send email"),success:!1};const g=c.data?.body?.message_id?.toString()??w();return i.debug("Email sent successfully",{messageId:g}),{data:{messageId:g,provider:a,response:c.data,sent:!0,timestamp:new Date},success:!0}}catch(t){return i.debug("Exception sending email",t),{error:new d(a,`Failed to send email: ${t.message}`,{cause:t}),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{L as default};
@@ -1 +1 @@
1
- import c from"./EmailError-BIaHK1Uw.js";import p from"./RequiredOptionError-ctDEEB1s.js";import{g as E}from"./generate-message-id-B2n2yqR6.js";import{h as P}from"./headers-to-record-ZOZ7Dubo.js";import{m}from"./make-request-Cyz5_yu8.js";import{r as h}from"./retry-aghj7y8m.js";import{a as I,s as w}from"./sanitize-header-CW0f3IT7.js";import{v as A}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as S}from"./defineProvider-C9q-7iwt.js";import{c as C,P as j,h as v}from"./provider-base-BEz00m9R.js";import{e as f,g as T}from"./address-formatter-CXZ1aWBX.js";import{b as M}from"./attachment-processor-BJFDS343.js";const a="postmark",R="https://api.postmarkapp.com",z=3e4,D=3,J=S((n={})=>{if(!n.serverToken)throw new p(a,"serverToken");const s={debug:n.debug??!1,endpoint:n.endpoint??R,retries:n.retries??D,serverToken:n.serverToken,timeout:n.timeout??z,...n.logger&&{logger:n.logger}},u=new j,o=C(a,n.logger);return{endpoint:s.endpoint,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(a,"Email ID is required to retrieve email details"),success:!1};await u.ensureInitialized(()=>this.initialize(),a);const t={"Content-Type":"application/json","X-Postmark-Server-Token":s.serverToken};o.debug("Retrieving email details",{id:e});const r=await h(async()=>m(`${s.endpoint}/messages/outbound/${e}/details`,{headers:t,method:"GET",timeout:s.timeout}),s.retries);return r.success?(o.debug("Email details retrieved successfully"),{data:r.data?.body,success:!0}):(o.debug("API request failed when retrieving email",r.error),{error:new c(a,`Failed to retrieve email: ${r.error instanceof Error?r.error.message:"Unknown error"}`,{cause:r.error}),success:!1})}catch(t){return{error:v(a,"retrieve email",t,o),success:!1}}},async initialize(){await u.ensureInitialized(async()=>{if(!await this.isAvailable())throw new c(a,"Postmark API not available or invalid server token");o.debug("Provider initialized successfully")},a)},async isAvailable(){try{const e={"Content-Type":"application/json","X-Postmark-Server-Token":s.serverToken};o.debug("Checking Postmark API availability");const t=await m(`${s.endpoint}/server`,{headers:e,method:"GET",timeout:s.timeout});return o.debug("Postmark 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 o.debug("Error checking availability:",e),!1}},name:a,options:s,async sendEmail(e){try{const t=A(e);if(t.length>0)return{error:new c(a,`Invalid email options: ${t.join(", ")}`),success:!1};await u.ensureInitialized(()=>this.initialize(),a);const r={From:T(e.from),Subject:e.subject,To:f(e.to).join(",")};if(e.html&&(r.HtmlBody=e.html),e.text&&(r.TextBody=e.text),e.cc&&(r.Cc=f(e.cc).join(",")),e.bcc&&(r.Bcc=f(e.bcc).join(",")),e.replyTo&&(r.ReplyTo=T(e.replyTo)),e.templateId?(r.TemplateId=e.templateId,e.templateModel&&(r.TemplateModel=e.templateModel)):e.templateAlias&&(r.TemplateAlias=e.templateAlias,e.templateModel&&(r.TemplateModel=e.templateModel)),e.trackOpens!==void 0&&(r.TrackOpens=e.trackOpens),e.trackLinks!==void 0&&(r.TrackLinks=e.trackLinks),e.inlineCss!==void 0&&(r.InlineCss=e.inlineCss),e.messageStream&&(r.MessageStream=e.messageStream),e.metadata&&(r.Metadata=e.metadata),e.tags&&e.tags.length>0){const[d]=e.tags;r.Tag=d}if(e.headers){const d=P(e.headers),l=[];for(const[y,b]of Object.entries(d))l.push({Name:w(y),Value:I(String(b))});l.length>0&&(r.Headers=l)}e.attachments&&e.attachments.length>0&&(r.Attachments=await Promise.all(e.attachments.map(async d=>M(d,a)))),o.debug("Sending email via Postmark API",{subject:r.Subject,to:r.To});const k={"Content-Type":"application/json","X-Postmark-Server-Token":s.serverToken},i=await h(async()=>m(`${s.endpoint}/email`,{headers:k,method:"POST",timeout:s.timeout},JSON.stringify(r)),s.retries);if(!i.success)return o.debug("API request failed when sending email",i.error),{error:i.error??new c(a,"Failed to send email"),success:!1};const g=i.data?.body?.MessageID??E();return o.debug("Email sent successfully",{messageId:g}),{data:{messageId:g,provider:a,response:i.data,sent:!0,timestamp:new Date},success:!0}}catch(t){return{error:v(a,"send email",t,o),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{J as default};
1
+ import c from"./EmailError-BIaHK1Uw.js";import p from"./RequiredOptionError-ctDEEB1s.js";import{g as E}from"./generate-message-id-B2n2yqR6.js";import{h as P}from"./headers-to-record-ZOZ7Dubo.js";import{m}from"./make-request-Cyz5_yu8.js";import{r as h}from"./retry-aghj7y8m.js";import{a as I,s as w}from"./sanitize-header-CW0f3IT7.js";import{v as A}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as S}from"./defineProvider-C9q-7iwt.js";import{c as C,P as j,h as v}from"./provider-base-BEz00m9R.js";import{e as f,g as T}from"./address-formatter-w36S9ZYj.js";import{b as M}from"./attachment-processor-BJFDS343.js";const a="postmark",R="https://api.postmarkapp.com",z=3e4,D=3,J=S((n={})=>{if(!n.serverToken)throw new p(a,"serverToken");const s={debug:n.debug??!1,endpoint:n.endpoint??R,retries:n.retries??D,serverToken:n.serverToken,timeout:n.timeout??z,...n.logger&&{logger:n.logger}},u=new j,o=C(a,n.logger);return{endpoint:s.endpoint,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(a,"Email ID is required to retrieve email details"),success:!1};await u.ensureInitialized(()=>this.initialize(),a);const t={"Content-Type":"application/json","X-Postmark-Server-Token":s.serverToken};o.debug("Retrieving email details",{id:e});const r=await h(async()=>m(`${s.endpoint}/messages/outbound/${e}/details`,{headers:t,method:"GET",timeout:s.timeout}),s.retries);return r.success?(o.debug("Email details retrieved successfully"),{data:r.data?.body,success:!0}):(o.debug("API request failed when retrieving email",r.error),{error:new c(a,`Failed to retrieve email: ${r.error instanceof Error?r.error.message:"Unknown error"}`,{cause:r.error}),success:!1})}catch(t){return{error:v(a,"retrieve email",t,o),success:!1}}},async initialize(){await u.ensureInitialized(async()=>{if(!await this.isAvailable())throw new c(a,"Postmark API not available or invalid server token");o.debug("Provider initialized successfully")},a)},async isAvailable(){try{const e={"Content-Type":"application/json","X-Postmark-Server-Token":s.serverToken};o.debug("Checking Postmark API availability");const t=await m(`${s.endpoint}/server`,{headers:e,method:"GET",timeout:s.timeout});return o.debug("Postmark 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 o.debug("Error checking availability:",e),!1}},name:a,options:s,async sendEmail(e){try{const t=A(e);if(t.length>0)return{error:new c(a,`Invalid email options: ${t.join(", ")}`),success:!1};await u.ensureInitialized(()=>this.initialize(),a);const r={From:T(e.from),Subject:e.subject,To:f(e.to).join(",")};if(e.html&&(r.HtmlBody=e.html),e.text&&(r.TextBody=e.text),e.cc&&(r.Cc=f(e.cc).join(",")),e.bcc&&(r.Bcc=f(e.bcc).join(",")),e.replyTo&&(r.ReplyTo=T(e.replyTo)),e.templateId?(r.TemplateId=e.templateId,e.templateModel&&(r.TemplateModel=e.templateModel)):e.templateAlias&&(r.TemplateAlias=e.templateAlias,e.templateModel&&(r.TemplateModel=e.templateModel)),e.trackOpens!==void 0&&(r.TrackOpens=e.trackOpens),e.trackLinks!==void 0&&(r.TrackLinks=e.trackLinks),e.inlineCss!==void 0&&(r.InlineCss=e.inlineCss),e.messageStream&&(r.MessageStream=e.messageStream),e.metadata&&(r.Metadata=e.metadata),e.tags&&e.tags.length>0){const[d]=e.tags;r.Tag=d}if(e.headers){const d=P(e.headers),l=[];for(const[y,b]of Object.entries(d))l.push({Name:w(y),Value:I(String(b))});l.length>0&&(r.Headers=l)}e.attachments&&e.attachments.length>0&&(r.Attachments=await Promise.all(e.attachments.map(async d=>M(d,a)))),o.debug("Sending email via Postmark API",{subject:r.Subject,to:r.To});const k={"Content-Type":"application/json","X-Postmark-Server-Token":s.serverToken},i=await h(async()=>m(`${s.endpoint}/email`,{headers:k,method:"POST",timeout:s.timeout},JSON.stringify(r)),s.retries);if(!i.success)return o.debug("API request failed when sending email",i.error),{error:i.error??new c(a,"Failed to send email"),success:!1};const g=i.data?.body?.MessageID??E();return o.debug("Email sent successfully",{messageId:g}),{data:{messageId:g,provider:a,response:i.data,sent:!0,timestamp:new Date},success:!0}}catch(t){return{error:v(a,"send email",t,o),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{J as default};
@@ -1 +1 @@
1
- import c from"./EmailError-BIaHK1Uw.js";import E from"./RequiredOptionError-ctDEEB1s.js";import{g as I}from"./generate-message-id-B2n2yqR6.js";import{h as w}from"./headers-to-record-ZOZ7Dubo.js";import{m as f}from"./make-request-Cyz5_yu8.js";import{r as g}from"./retry-aghj7y8m.js";import{v as T}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as P}from"./defineProvider-C9q-7iwt.js";import{c as $,P as C,h as p}from"./provider-base-BEz00m9R.js";import{e as j,g as b,d as v}from"./address-formatter-CXZ1aWBX.js";import{p as R}from"./attachment-processor-BJFDS343.js";const o="resend",S="https://api.resend.com",k=3e4,z=3,D=s=>{const r=[],d=/^[\w-]+$/;return d.test(s.name)||r.push(`Tag name '${s.name}' must only contain ASCII letters, numbers, underscores, or dashes`),s.name.length>256&&r.push(`Tag name '${s.name}' exceeds maximum length of 256 characters`),d.test(s.value)||r.push(`Tag value '${s.value}' for tag '${s.name}' must only contain ASCII letters, numbers, underscores, or dashes`),r},V=P((s={})=>{if(!s.apiKey)throw new E(o,"apiKey");const r={apiKey:s.apiKey,debug:s.debug??!1,endpoint:s.endpoint??S,logger:s.logger,retries:s.retries??z,timeout:s.timeout??k},d=new C,n=$(o,s.logger);return{endpoint:r.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 c(o,"Email ID is required to retrieve email details"),success:!1};await d.ensureInitialized(()=>this.initialize(),o);const t={Authorization:`Bearer ${r.apiKey}`,"Content-Type":"application/json"};n.debug("Retrieving email details",{id:e});const a=await g(async()=>f(`${r.endpoint}/emails/${e}`,{headers:t,method:"GET",timeout:r.timeout}),r.retries);return a.success?(n.debug("Email details retrieved successfully"),{data:a.data?.body,success:!0}):(n.debug("API request failed when retrieving email",a.error),{error:new c(o,`Failed to retrieve email: ${a.error instanceof Error?a.error.message:"Unknown error"}`,{cause:a.error}),success:!1})}catch(t){return{error:p(o,"retrieve email",t,n),success:!1}}},async initialize(){await d.ensureInitialized(async()=>{if(!await this.isAvailable())throw new c(o,"Resend API not available or invalid API key");n.debug("Provider initialized successfully")},o)},async isAvailable(){try{if(r.apiKey&&r.apiKey.startsWith("re_"))return n.debug("API key format is valid, assuming Resend is available"),!0;const e={Authorization:`Bearer ${r.apiKey}`,"Content-Type":"application/json"};n.debug("Checking Resend API availability");const t=await f(`${r.endpoint}/domains`,{headers:e,method:"GET",timeout:r.timeout});return t.data&&typeof t.data=="object"&&"body"in t.data&&t.data.body&&typeof t.data.body=="object"&&"name"in t.data.body&&t.data.body.name==="restricted_api_key"?(n.debug("API key is valid but restricted to only sending emails"),!0):(n.debug("Resend 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 n.debug("Error checking availability:",e),!1}},name:o,options:r,async sendEmail(e){try{const t=T(e);if(t.length>0)return{error:new c(o,`Invalid email options: ${t.join(", ")}`),success:!1};await d.ensureInitialized(()=>this.initialize(),o);const a={from:b(e.from),headers:e.headers?w(e.headers):{},html:e.html,subject:e.subject,text:e.text,to:j(e.to)};if(e.cc&&(a.cc=v(e.cc)),e.bcc&&(a.bcc=v(e.bcc)),e.replyTo&&(a.reply_to=b(e.replyTo)),e.templateId&&(a.template=e.templateId,e.templateData&&(a.data=e.templateData)),e.scheduledAt&&(a.scheduled_at=typeof e.scheduledAt=="string"?e.scheduledAt:e.scheduledAt.toISOString()),e.tags&&e.tags.length>0){const i=[];if(e.tags.forEach(l=>{const y=D(l);y.length>0&&i.push(...y)}),i.length>0)return{error:new c(o,`Invalid email tags: ${i.join(", ")}`),success:!1};a.tags=e.tags.map(l=>({name:l.name,value:l.value}))}e.attachments&&e.attachments.length>0&&(a.attachments=await Promise.all(e.attachments.map(async i=>({content:await R(i,o),content_type:i.contentType,filename:i.filename,...i.path&&{path:i.path}})))),n.debug("Sending email via Resend API",{subject:a.subject,to:a.to});const A={Authorization:`Bearer ${r.apiKey}`,"Content-Type":"application/json"},u=await g(async()=>f(`${r.endpoint}/emails`,{headers:A,method:"POST",timeout:r.timeout},JSON.stringify(a)),r.retries);if(!u.success)return n.debug("API request failed when sending email",u.error),{error:u.error??new c(o,"Failed to send email"),success:!1};const m=u.data,h=m?.body&&typeof m.body=="object"&&m.body.id?m.body.id:I();return n.debug("Email sent successfully",{messageId:h}),{data:{messageId:h,provider:o,response:u.data,sent:!0,timestamp:new Date},success:!0}}catch(t){return{error:p(o,"send email",t,n),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{V as default};
1
+ import c from"./EmailError-BIaHK1Uw.js";import E from"./RequiredOptionError-ctDEEB1s.js";import{g as I}from"./generate-message-id-B2n2yqR6.js";import{h as w}from"./headers-to-record-ZOZ7Dubo.js";import{m as f}from"./make-request-Cyz5_yu8.js";import{r as g}from"./retry-aghj7y8m.js";import{v as T}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as P}from"./defineProvider-C9q-7iwt.js";import{c as $,P as C,h as p}from"./provider-base-BEz00m9R.js";import{e as j,g as b,d as v}from"./address-formatter-w36S9ZYj.js";import{p as R}from"./attachment-processor-BJFDS343.js";const o="resend",S="https://api.resend.com",k=3e4,z=3,D=s=>{const r=[],d=/^[\w-]+$/;return d.test(s.name)||r.push(`Tag name '${s.name}' must only contain ASCII letters, numbers, underscores, or dashes`),s.name.length>256&&r.push(`Tag name '${s.name}' exceeds maximum length of 256 characters`),d.test(s.value)||r.push(`Tag value '${s.value}' for tag '${s.name}' must only contain ASCII letters, numbers, underscores, or dashes`),r},V=P((s={})=>{if(!s.apiKey)throw new E(o,"apiKey");const r={apiKey:s.apiKey,debug:s.debug??!1,endpoint:s.endpoint??S,logger:s.logger,retries:s.retries??z,timeout:s.timeout??k},d=new C,n=$(o,s.logger);return{endpoint:r.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 c(o,"Email ID is required to retrieve email details"),success:!1};await d.ensureInitialized(()=>this.initialize(),o);const t={Authorization:`Bearer ${r.apiKey}`,"Content-Type":"application/json"};n.debug("Retrieving email details",{id:e});const a=await g(async()=>f(`${r.endpoint}/emails/${e}`,{headers:t,method:"GET",timeout:r.timeout}),r.retries);return a.success?(n.debug("Email details retrieved successfully"),{data:a.data?.body,success:!0}):(n.debug("API request failed when retrieving email",a.error),{error:new c(o,`Failed to retrieve email: ${a.error instanceof Error?a.error.message:"Unknown error"}`,{cause:a.error}),success:!1})}catch(t){return{error:p(o,"retrieve email",t,n),success:!1}}},async initialize(){await d.ensureInitialized(async()=>{if(!await this.isAvailable())throw new c(o,"Resend API not available or invalid API key");n.debug("Provider initialized successfully")},o)},async isAvailable(){try{if(r.apiKey&&r.apiKey.startsWith("re_"))return n.debug("API key format is valid, assuming Resend is available"),!0;const e={Authorization:`Bearer ${r.apiKey}`,"Content-Type":"application/json"};n.debug("Checking Resend API availability");const t=await f(`${r.endpoint}/domains`,{headers:e,method:"GET",timeout:r.timeout});return t.data&&typeof t.data=="object"&&"body"in t.data&&t.data.body&&typeof t.data.body=="object"&&"name"in t.data.body&&t.data.body.name==="restricted_api_key"?(n.debug("API key is valid but restricted to only sending emails"),!0):(n.debug("Resend 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 n.debug("Error checking availability:",e),!1}},name:o,options:r,async sendEmail(e){try{const t=T(e);if(t.length>0)return{error:new c(o,`Invalid email options: ${t.join(", ")}`),success:!1};await d.ensureInitialized(()=>this.initialize(),o);const a={from:b(e.from),headers:e.headers?w(e.headers):{},html:e.html,subject:e.subject,text:e.text,to:j(e.to)};if(e.cc&&(a.cc=v(e.cc)),e.bcc&&(a.bcc=v(e.bcc)),e.replyTo&&(a.reply_to=b(e.replyTo)),e.templateId&&(a.template=e.templateId,e.templateData&&(a.data=e.templateData)),e.scheduledAt&&(a.scheduled_at=typeof e.scheduledAt=="string"?e.scheduledAt:e.scheduledAt.toISOString()),e.tags&&e.tags.length>0){const i=[];if(e.tags.forEach(l=>{const y=D(l);y.length>0&&i.push(...y)}),i.length>0)return{error:new c(o,`Invalid email tags: ${i.join(", ")}`),success:!1};a.tags=e.tags.map(l=>({name:l.name,value:l.value}))}e.attachments&&e.attachments.length>0&&(a.attachments=await Promise.all(e.attachments.map(async i=>({content:await R(i,o),content_type:i.contentType,filename:i.filename,...i.path&&{path:i.path}})))),n.debug("Sending email via Resend API",{subject:a.subject,to:a.to});const A={Authorization:`Bearer ${r.apiKey}`,"Content-Type":"application/json"},u=await g(async()=>f(`${r.endpoint}/emails`,{headers:A,method:"POST",timeout:r.timeout},JSON.stringify(a)),r.retries);if(!u.success)return n.debug("API request failed when sending email",u.error),{error:u.error??new c(o,"Failed to send email"),success:!1};const m=u.data,h=m?.body&&typeof m.body=="object"&&m.body.id?m.body.id:I();return n.debug("Email sent successfully",{messageId:h}),{data:{messageId:h,provider:o,response:u.data,sent:!0,timestamp:new Date},success:!0}}catch(t){return{error:p(o,"send email",t,n),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{V as default};
@@ -1 +1 @@
1
- import l from"./EmailError-BIaHK1Uw.js";import f from"./RequiredOptionError-ctDEEB1s.js";import{g as w}from"./generate-message-id-B2n2yqR6.js";import{h as v}from"./headers-to-record-ZOZ7Dubo.js";import{m as y}from"./make-request-Cyz5_yu8.js";import{r as g}from"./retry-aghj7y8m.js";import{v as E}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as I}from"./defineProvider-C9q-7iwt.js";import{c as T,P as A,h}from"./provider-base-BEz00m9R.js";import{f as u,a as P}from"./address-formatter-CXZ1aWBX.js";import{p as S}from"./attachment-processor-BJFDS343.js";const t="scaleway",j="https://api.scaleway.com/transactional-email/v1alpha1",R=3e4,k=3,G=I((a={})=>{if(!a.apiKey)throw new f(t,"apiKey");if(!a.region)throw new f(t,"region");const p=a.endpoint??j,s={apiKey:a.apiKey,debug:a.debug??!1,endpoint:p,region:a.region,retries:a.retries??k,timeout:a.timeout??R,...a.logger&&{logger:a.logger}},d=new A,i=T(t,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 l(t,"Email ID is required to retrieve email details"),success:!1};await d.ensureInitialized(()=>this.initialize(),t);const o={"Content-Type":"application/json","X-Auth-Token":s.apiKey};i.debug("Retrieving email details",{id:e});const r=await g(async()=>y(`${s.endpoint}/regions/${s.region}/emails/${e}`,{headers:o,method:"GET",timeout:s.timeout}),s.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(t,`Failed to retrieve email: ${r.error instanceof Error?r.error.message:"Unknown error"}`,{cause:r.error}),success:!1})}catch(o){return{error:h(t,"retrieve email",o,i),success:!1}}},async initialize(){await d.ensureInitialized(async()=>{if(!await this.isAvailable())throw new l(t,"Scaleway API not available or invalid API key");i.debug("Provider initialized successfully")},t)},async isAvailable(){try{return i.debug("Checking Scaleway API availability"),!0}catch(e){return i.debug("Error checking availability:",e),!1}},name:t,options:s,async sendEmail(e){try{const o=E(e);if(o.length>0)return{error:new l(t,`Invalid email options: ${o.join(", ")}`),success:!1};await d.ensureInitialized(()=>this.initialize(),t);const r={from:{email:e.from.email,...e.from.name&&{name:e.from.name}},subject:e.subject,to:u(e.to)};if(e.html&&(r.html=e.html),e.text&&(r.text=e.text),e.cc&&(r.cc=u(e.cc)),e.bcc&&(r.bcc=u(e.bcc)),e.replyTo&&(r.replyTo=P(e.replyTo)),e.templateId&&(r.templateId=e.templateId,e.templateVariables&&(r.templateVariables=e.templateVariables)),e.projectId&&(r.projectId=e.projectId),e.headers){const c=v(e.headers);r.headers=c}e.attachments&&e.attachments.length>0&&(r.attachments=await Promise.all(e.attachments.map(async c=>({content:await S(c,t),name:c.filename,type:c.contentType??"application/octet-stream"})))),i.debug("Sending email via Scaleway API",{subject:r.subject,to:r.to});const b={"Content-Type":"application/json","X-Auth-Token":s.apiKey},n=await g(async()=>y(`${s.endpoint}/regions/${s.region}/emails`,{headers:b,method:"POST",timeout:s.timeout},JSON.stringify(r)),s.retries);if(!n.success)return i.debug("API request failed when sending email",n.error),{error:n.error??new l(t,"Failed to send email"),success:!1};const m=n.data?.body?.id??w();return i.debug("Email sent successfully",{messageId:m}),{data:{messageId:m,provider:t,response:n.data,sent:!0,timestamp:new Date},success:!0}}catch(o){return{error:h(t,"send email",o,i),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{G as default};
1
+ import l from"./EmailError-BIaHK1Uw.js";import f from"./RequiredOptionError-ctDEEB1s.js";import{g as w}from"./generate-message-id-B2n2yqR6.js";import{h as v}from"./headers-to-record-ZOZ7Dubo.js";import{m as y}from"./make-request-Cyz5_yu8.js";import{r as g}from"./retry-aghj7y8m.js";import{v as E}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as I}from"./defineProvider-C9q-7iwt.js";import{c as T,P as A,h}from"./provider-base-BEz00m9R.js";import{f as u,a as P}from"./address-formatter-w36S9ZYj.js";import{p as S}from"./attachment-processor-BJFDS343.js";const t="scaleway",j="https://api.scaleway.com/transactional-email/v1alpha1",R=3e4,k=3,G=I((a={})=>{if(!a.apiKey)throw new f(t,"apiKey");if(!a.region)throw new f(t,"region");const p=a.endpoint??j,s={apiKey:a.apiKey,debug:a.debug??!1,endpoint:p,region:a.region,retries:a.retries??k,timeout:a.timeout??R,...a.logger&&{logger:a.logger}},d=new A,i=T(t,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 l(t,"Email ID is required to retrieve email details"),success:!1};await d.ensureInitialized(()=>this.initialize(),t);const o={"Content-Type":"application/json","X-Auth-Token":s.apiKey};i.debug("Retrieving email details",{id:e});const r=await g(async()=>y(`${s.endpoint}/regions/${s.region}/emails/${e}`,{headers:o,method:"GET",timeout:s.timeout}),s.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(t,`Failed to retrieve email: ${r.error instanceof Error?r.error.message:"Unknown error"}`,{cause:r.error}),success:!1})}catch(o){return{error:h(t,"retrieve email",o,i),success:!1}}},async initialize(){await d.ensureInitialized(async()=>{if(!await this.isAvailable())throw new l(t,"Scaleway API not available or invalid API key");i.debug("Provider initialized successfully")},t)},async isAvailable(){try{return i.debug("Checking Scaleway API availability"),!0}catch(e){return i.debug("Error checking availability:",e),!1}},name:t,options:s,async sendEmail(e){try{const o=E(e);if(o.length>0)return{error:new l(t,`Invalid email options: ${o.join(", ")}`),success:!1};await d.ensureInitialized(()=>this.initialize(),t);const r={from:{email:e.from.email,...e.from.name&&{name:e.from.name}},subject:e.subject,to:u(e.to)};if(e.html&&(r.html=e.html),e.text&&(r.text=e.text),e.cc&&(r.cc=u(e.cc)),e.bcc&&(r.bcc=u(e.bcc)),e.replyTo&&(r.replyTo=P(e.replyTo)),e.templateId&&(r.templateId=e.templateId,e.templateVariables&&(r.templateVariables=e.templateVariables)),e.projectId&&(r.projectId=e.projectId),e.headers){const c=v(e.headers);r.headers=c}e.attachments&&e.attachments.length>0&&(r.attachments=await Promise.all(e.attachments.map(async c=>({content:await S(c,t),name:c.filename,type:c.contentType??"application/octet-stream"})))),i.debug("Sending email via Scaleway API",{subject:r.subject,to:r.to});const b={"Content-Type":"application/json","X-Auth-Token":s.apiKey},n=await g(async()=>y(`${s.endpoint}/regions/${s.region}/emails`,{headers:b,method:"POST",timeout:s.timeout},JSON.stringify(r)),s.retries);if(!n.success)return i.debug("API request failed when sending email",n.error),{error:n.error??new l(t,"Failed to send email"),success:!1};const m=n.data?.body?.id??w();return i.debug("Email sent successfully",{messageId:m}),{data:{messageId:m,provider:t,response:n.data,sent:!0,timestamp:new Date},success:!0}}catch(o){return{error:h(t,"send email",o,i),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{G as default};
@@ -1 +1 @@
1
- import u from"./EmailError-BIaHK1Uw.js";import E from"./RequiredOptionError-ctDEEB1s.js";import{g as w}from"./generate-message-id-B2n2yqR6.js";import{h as P}from"./headers-to-record-ZOZ7Dubo.js";import{m as h}from"./make-request-Cyz5_yu8.js";import{r as p}from"./retry-aghj7y8m.js";import{v as S}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as T}from"./defineProvider-C9q-7iwt.js";import{c as G,P as _,h as v}from"./provider-base-BEz00m9R.js";import{f as y,a as I}from"./address-formatter-CXZ1aWBX.js";import{d as j}from"./attachment-processor-BJFDS343.js";const s="sendgrid",z="https://api.sendgrid.com/v3",k=3e4,C=3,H=T((o={})=>{if(!o.apiKey)throw new E(s,"apiKey");const r={apiKey:o.apiKey,debug:o.debug??!1,endpoint:o.endpoint??z,...o.logger&&{logger:o.logger},retries:o.retries??C,timeout:o.timeout??k},f=new _,i=G(s,o.logger);return{endpoint:r.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 u(s,"Email ID is required to retrieve email details"),success:!1};await f.ensureInitialized(()=>this.initialize(),s);const t={Authorization:`Bearer ${r.apiKey}`,"Content-Type":"application/json"};i.debug("Retrieving email details",{id:e});const a=await p(async()=>h(`${r.endpoint}/messages/${e}`,{headers:t,method:"GET",timeout:r.timeout}),r.retries);return a.success?(i.debug("Email details retrieved successfully"),{data:a.data?.body,success:!0}):(i.debug("API request failed when retrieving email",a.error),{error:new u(s,`Failed to retrieve email: ${a.error instanceof Error?a.error.message:"Unknown error"}`,{cause:a.error}),success:!1})}catch(t){return{error:v(s,"retrieve email",t,i),success:!1}}},async initialize(){await f.ensureInitialized(async()=>{if(!await this.isAvailable())throw new u(s,"SendGrid API not available or invalid API key");i.debug("Provider initialized successfully")},s)},async isAvailable(){try{if(r.apiKey&&r.apiKey.startsWith("SG."))return i.debug("API key format is valid, assuming SendGrid is available"),!0;const e={Authorization:`Bearer ${r.apiKey}`,"Content-Type":"application/json"};i.debug("Checking SendGrid API availability");const t=await h(`${r.endpoint}/user/profile`,{headers:e,method:"GET",timeout:r.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:r,async sendEmail(e){try{const t=S(e);if(t.length>0)return{error:new u(s,`Invalid email options: ${t.join(", ")}`),success:!1};await f.ensureInitialized(()=>this.initialize(),s);const a={to:y(e.to)};if(e.cc&&(a.cc=y(e.cc)),e.bcc&&(a.bcc=y(e.bcc)),e.subject&&(a.subject=e.subject),e.tags&&e.tags.length>0){const n={};for(let g=0;g<e.tags.length;g+=1)n[`tag_${g}`]=e.tags[g];a.customArgs=n}const d={from:I(e.from),personalizations:[a]},l=[];if(e.html&&l.push({type:"text/html",value:e.html}),e.text&&l.push({type:"text/plain",value:e.text}),l.length>0&&(d.content=l),e.replyTo&&(d.reply_to=I(e.replyTo)),e.subject&&(d.subject=e.subject),e.templateId&&(d.template_id=e.templateId,e.templateData&&(a.dynamicTemplateData=e.templateData)),e.sendAt&&(a.send_at=e.sendAt),e.batchId&&(d.batch_id=e.batchId),e.asmGroupId&&(d.asm={group_id:e.asmGroupId}),e.ipPoolName&&(d.ip_pool_name=e.ipPoolName),e.mailSettings&&(d.mail_settings=e.mailSettings),e.trackingSettings&&(d.tracking_settings=e.trackingSettings),e.headers){const n=P(e.headers);d.headers=n}e.attachments&&e.attachments.length>0&&(d.attachments=await Promise.all(e.attachments.map(async n=>j(n,s)))),i.debug("Sending email via SendGrid API",{subject:d.subject,to:a.to});const A={Authorization:`Bearer ${r.apiKey}`,"Content-Type":"application/json"},c=await p(async()=>h(`${r.endpoint}/mail/send`,{headers:A,method:"POST",timeout:r.timeout},JSON.stringify(d)),r.retries);if(!c.success)return i.debug("API request failed when sending email",c.error),{error:c.error??new u(s,"Failed to send email"),success:!1};const m=c.data?.headers,b=(m&&m instanceof Headers?m.get("X-Message-Id"):void 0)??w();return i.debug("Email sent successfully",{messageId:b}),{data:{messageId:b,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{H as default};
1
+ import u from"./EmailError-BIaHK1Uw.js";import E from"./RequiredOptionError-ctDEEB1s.js";import{g as w}from"./generate-message-id-B2n2yqR6.js";import{h as P}from"./headers-to-record-ZOZ7Dubo.js";import{m as h}from"./make-request-Cyz5_yu8.js";import{r as p}from"./retry-aghj7y8m.js";import{v as S}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as T}from"./defineProvider-C9q-7iwt.js";import{c as G,P as _,h as v}from"./provider-base-BEz00m9R.js";import{f as y,a as I}from"./address-formatter-w36S9ZYj.js";import{d as j}from"./attachment-processor-BJFDS343.js";const s="sendgrid",z="https://api.sendgrid.com/v3",k=3e4,C=3,H=T((o={})=>{if(!o.apiKey)throw new E(s,"apiKey");const r={apiKey:o.apiKey,debug:o.debug??!1,endpoint:o.endpoint??z,...o.logger&&{logger:o.logger},retries:o.retries??C,timeout:o.timeout??k},f=new _,i=G(s,o.logger);return{endpoint:r.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 u(s,"Email ID is required to retrieve email details"),success:!1};await f.ensureInitialized(()=>this.initialize(),s);const t={Authorization:`Bearer ${r.apiKey}`,"Content-Type":"application/json"};i.debug("Retrieving email details",{id:e});const a=await p(async()=>h(`${r.endpoint}/messages/${e}`,{headers:t,method:"GET",timeout:r.timeout}),r.retries);return a.success?(i.debug("Email details retrieved successfully"),{data:a.data?.body,success:!0}):(i.debug("API request failed when retrieving email",a.error),{error:new u(s,`Failed to retrieve email: ${a.error instanceof Error?a.error.message:"Unknown error"}`,{cause:a.error}),success:!1})}catch(t){return{error:v(s,"retrieve email",t,i),success:!1}}},async initialize(){await f.ensureInitialized(async()=>{if(!await this.isAvailable())throw new u(s,"SendGrid API not available or invalid API key");i.debug("Provider initialized successfully")},s)},async isAvailable(){try{if(r.apiKey&&r.apiKey.startsWith("SG."))return i.debug("API key format is valid, assuming SendGrid is available"),!0;const e={Authorization:`Bearer ${r.apiKey}`,"Content-Type":"application/json"};i.debug("Checking SendGrid API availability");const t=await h(`${r.endpoint}/user/profile`,{headers:e,method:"GET",timeout:r.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:r,async sendEmail(e){try{const t=S(e);if(t.length>0)return{error:new u(s,`Invalid email options: ${t.join(", ")}`),success:!1};await f.ensureInitialized(()=>this.initialize(),s);const a={to:y(e.to)};if(e.cc&&(a.cc=y(e.cc)),e.bcc&&(a.bcc=y(e.bcc)),e.subject&&(a.subject=e.subject),e.tags&&e.tags.length>0){const n={};for(let g=0;g<e.tags.length;g+=1)n[`tag_${g}`]=e.tags[g];a.customArgs=n}const d={from:I(e.from),personalizations:[a]},l=[];if(e.html&&l.push({type:"text/html",value:e.html}),e.text&&l.push({type:"text/plain",value:e.text}),l.length>0&&(d.content=l),e.replyTo&&(d.reply_to=I(e.replyTo)),e.subject&&(d.subject=e.subject),e.templateId&&(d.template_id=e.templateId,e.templateData&&(a.dynamicTemplateData=e.templateData)),e.sendAt&&(a.send_at=e.sendAt),e.batchId&&(d.batch_id=e.batchId),e.asmGroupId&&(d.asm={group_id:e.asmGroupId}),e.ipPoolName&&(d.ip_pool_name=e.ipPoolName),e.mailSettings&&(d.mail_settings=e.mailSettings),e.trackingSettings&&(d.tracking_settings=e.trackingSettings),e.headers){const n=P(e.headers);d.headers=n}e.attachments&&e.attachments.length>0&&(d.attachments=await Promise.all(e.attachments.map(async n=>j(n,s)))),i.debug("Sending email via SendGrid API",{subject:d.subject,to:a.to});const A={Authorization:`Bearer ${r.apiKey}`,"Content-Type":"application/json"},c=await p(async()=>h(`${r.endpoint}/mail/send`,{headers:A,method:"POST",timeout:r.timeout},JSON.stringify(d)),r.retries);if(!c.success)return i.debug("API request failed when sending email",c.error),{error:c.error??new u(s,"Failed to send email"),success:!1};const m=c.data?.headers,b=(m&&m instanceof Headers?m.get("X-Message-Id"):void 0)??w();return i.debug("Email sent successfully",{messageId:b}),{data:{messageId:b,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{H as default};
@@ -0,0 +1,14 @@
1
+ import{createRequire as x}from"node:module";import{createTransportDkimSigner as W}from"./DkimSigner-CCxFKitN.js";import f from"./EmailError-BIaHK1Uw.js";import Y from"./RequiredOptionError-ctDEEB1s.js";import{b as Q}from"./build-mime-message-BCFKPqaW.js";import{g as K}from"./generate-message-id-B2n2yqR6.js";import{v as O}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as J}from"./defineProvider-C9q-7iwt.js";let q;const G=d=>(q??=x(import.meta.url))(d),I=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,R=d=>{if(typeof I<"u"&&I.versions&&I.versions.node){const[t,T]=I.versions.node.split(".").map(Number);if(t>22||t===22&&T>=3||t===20&&T>=16)return I.getBuiltinModule(d)}return G(d)},{Buffer:S}=R("node:buffer"),{createHmac:B}=R("node:crypto"),{Socket:X,createConnection:V}=R("node:net"),{connect:H}=R("node:tls"),Z=(d,t)=>new Promise(T=>{const w=new X,y=()=>{w.destroy(),T(!1)};w.setTimeout(1e3),w.on("error",y),w.on("timeout",y),w.connect(t,d,()=>{w.end(),T(!0)})}),l="smtp",ee=25,te=465,re=1e4,se=!1,oe=5,N=3e4,ne=/^\./,pe=J((d={})=>{if(!d.host)throw new Y(l,"host");const t={authMethod:d.authMethod??"LOGIN",debug:d.debug??!1,dkim:d.dkim,host:d.host,maxConnections:d.maxConnections??oe,oauth2:d.oauth2,password:d.password,pool:d.pool??!1,port:d.port!==void 0?d.port:d.secure?te:ee,rejectUnauthorized:d.rejectUnauthorized??!0,retries:d.retries??0,secure:d.secure??se,timeout:d.timeout??re,user:d.user,...d.logger&&{logger:d.logger}};let T=!1;const w=[],y=[];let M=0;const j=()=>{M+=1},U=()=>{M>0&&(M-=1)},b=e=>e.replaceAll(/[\r\n\t\v\f]/g," ").trim(),L=e=>{const a=e.split(`\r
2
+ `),o={};for(const i of a)if(i.startsWith("250-")||i.startsWith("250 ")){const c=i.slice(4).trim().split(" "),s=c[0];s&&(o[s]=c.slice(1))}return o},p=async(e,a,o)=>new Promise((i,u)=>{const c=Array.isArray(o)?o:[o];let s="",n="";const h=setTimeout(()=>{g(),u(new f(l,`Command timeout after ${t.timeout}ms: ${a?.slice(0,50)}...`))},t.timeout),g=()=>{e.removeListener("data",$),e.removeListener("error",r),h&&clearTimeout(h)},$=m=>{s+=m.toString();const E=s.split(`\r
3
+ `).filter(Boolean);if(E.length>0){const C=E.at(-1);if(C){const _=C.match(/^(\d{3})[\s-]/);if(_){const[,z]=_;n=z,C[3]===" "&&(g(),c.includes(n)?i(s):u(new f(l,`Expected ${c.join(" or ")}, got ${n}: ${s.trim()}`)))}}}},r=m=>{g(),u(new f(l,`Socket error: ${m.message}`,{cause:m}))};e.on("data",$),e.on("error",r),a&&e.write(`${a}\r
4
+ `)}),v=async()=>{if(t.pool&&w.length>0){const e=w.pop();if(e&&!e.destroyed)return e;e&&U()}return t.pool&&M>=t.maxConnections?new Promise((e,a)=>{const o={reject:a,resolve:e};o.timeout=setTimeout(()=>{const i=y.indexOf(o);i!==-1&&y.splice(i,1),a(new f(l,`Connection queue timeout after ${N}ms`))},N),y.push(o)}):new Promise((e,a)=>{let o,i=!1,u;const c=()=>{o&&clearTimeout(o)};o=setTimeout(()=>{i||(i=!0,u&&!u.destroyed&&u.destroy(),c(),a(new f(l,`Connection timeout to ${t.host}:${t.port} after ${t.timeout}ms`)))},t.timeout);try{u=t.secure?H({host:t.host,port:t.port,rejectUnauthorized:t.rejectUnauthorized}):V(t.port,t.host),u.on("error",s=>{i||(i=!0,c(),a(new f(l,`Connection error: ${s.message}`,{cause:s})))}),u.once("data",s=>{if(!i&&u){i=!0,c();const n=s.toString();n.slice(0,3)==="220"?(j(),e(u)):(u.destroy(),a(new f(l,`Unexpected server greeting: ${n.trim()}`)))}})}catch(s){i||(i=!0,c(),a(new f(l,`Failed to create connection: ${s.message}`,{cause:s})))}})},P=async e=>new Promise((a,o)=>{let i,u=!1,c;const s=()=>{i&&clearTimeout(i)};i=setTimeout(()=>{u||(u=!0,c&&!c.destroyed&&c.destroy(),s(),o(new f(l,`TLS connection timeout after ${t.timeout}ms`)))},t.timeout);try{const n={host:t.host,rejectUnauthorized:t.rejectUnauthorized,socket:e};c=H(n),c.on("error",h=>{u||(u=!0,s(),o(new f(l,`TLS connection error: ${h.message}`,{cause:h})))}),c.once("secure",()=>{!u&&c&&(u=!0,s(),a(c))})}catch(n){u||(u=!0,s(),o(new f(l,`Failed to upgrade to TLS: ${n.message}`,{cause:n})))}}),k=e=>{if(e.destroyed||!t.pool){try{e.destroy()}catch{}U();return}if(y.length>0){const a=y.shift();if(a){clearTimeout(a.timeout),a.resolve(e);return}}w.push(e)},A=async(e,a=!1)=>{if(a){if(!e.destroyed)try{await p(e,"RSET","250")}catch{e.destroy()}k(e);return}await new Promise(o=>{try{U(),e.write(`QUIT\r
5
+ `),e.end(),e.once("close",()=>{o()})}catch{o()}})},D=async e=>{if(!t.user)return;const a=await p(e,`EHLO ${t.host}`,"250"),o=L(a),i=Object.keys(o).find(s=>s.toUpperCase()==="AUTH");if(!i&&(t.user||t.password))throw new f(l,"Server does not support authentication");const u=i?o[i]??[]:[];let{authMethod:c}=t;if(c||(u.includes("CRAM-MD5")?c="CRAM-MD5":u.includes("LOGIN")?c="LOGIN":u.includes("PLAIN")&&(c="PLAIN")),!c)throw new f(l,"No supported authentication methods");if(c==="OAUTH2"&&t.oauth2)try{const{accessToken:s,user:n}=t.oauth2,h=`user=${n}auth=Bearer ${s}`,g=S.from(h).toString("base64");await p(e,`AUTH XOAUTH2 ${g}`,"235");return}catch(s){const n=s.message;throw n.includes("535")||n.includes("Authentication failed")?new f(l,"Authentication failed: Invalid OAuth2 credentials"):s}if(c==="CRAM-MD5"&&t.password)try{const n=(await p(e,"AUTH CRAM-MD5","334")).split(" ")[1];if(!n)throw new f(l,"Invalid CRAM-MD5 challenge response");const h=S.from(n,"base64").toString("utf8"),g=B("md5",t.password);g.update(h);const $=g.digest("hex"),r=`${t.user} ${$}`;await p(e,S.from(r).toString("base64"),"235");return}catch(s){const n=s.message;throw n.includes("535")||n.includes("Authentication failed")?new f(l,"Authentication failed: Invalid username or password"):s}if(c==="LOGIN"&&t.password)try{await p(e,"AUTH LOGIN","334"),await p(e,S.from(t.user).toString("base64"),"334"),await p(e,S.from(t.password).toString("base64"),"235");return}catch(s){const n=s.message;throw n.includes("535")||n.includes("Authentication failed")?new f(l,"Authentication failed: Invalid username or password"):s}if(c==="PLAIN"&&t.password)try{const s=S.from(`\0${t.user}\0${t.password}`).toString("base64");await p(e,`AUTH PLAIN ${s}`,"235");return}catch(s){const n=s.message;throw n.includes("535")||n.includes("Authentication failed")?new f(l,"Authentication failed: Invalid username or password"):s}throw new f(l,"Authentication failed - no valid credentials or method")},F=async e=>{if(!t.dkim)return e;try{return await W(t.dkim).signMimeMessage(e)}catch(a){throw new f(l,`DKIM signing failed: ${a.message}`)}};return{features:{attachments:!0,batchSending:t.pool,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!1,templates:!1,tracking:!1},async initialize(){if(!T)try{if(!await this.isAvailable())throw new f(l,`SMTP server not available at ${t.host}:${t.port}`);T=!0}catch(e){throw new f(l,`Failed to initialize: ${e.message}`,{cause:e})}},async isAvailable(){try{if(!await Z(t.host,t.port))return!1;const a=await v();return await A(a),!0}catch{return!1}},name:l,options:t,async sendEmail(e){try{const a=O(e);if(a.length>0)return{error:new f(l,`Invalid email options: ${a.join(", ")}`),success:!1};T||await this.initialize();let o=await v();try{let i=L(await p(o,`EHLO ${t.host}`,"250"));if(!t.secure)try{const r=await p(o,`EHLO ${t.host}`,"250"),m=L(r);i=m,Object.keys(m).includes("STARTTLS")&&(await p(o,"STARTTLS","220"),o=await P(o),i=L(await p(o,`EHLO ${t.host}`,"250")))}catch(r){if(t.rejectUnauthorized)throw new f(l,`STARTTLS failed or not supported: ${r.message}`,{cause:r})}await D(o);const u=Object.keys(i).some(r=>r.toUpperCase()==="DSN");let c="";if(e.dsn&&u){const r=[];e.dsn.success&&r.push("SUCCESS"),e.dsn.failure&&r.push("FAILURE"),e.dsn.delay&&r.push("DELAY"),r.length>0&&(c=` 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}>${c}`,"250");await p(o,"DATA","354");let n=await Q(e);const h=[];if(e.dsn&&!u){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: ${b(e.inReplyTo)}`),e.references){const r=Array.isArray(e.references)?e.references.map(m=>b(m)).join(" "):b(e.references);h.push(`References: ${r}`)}if(e.listUnsubscribe){const r=Array.isArray(e.listUnsubscribe)?e.listUnsubscribe.map(m=>`<${b(m)}>`).join(", "):`<${b(e.listUnsubscribe)}>`;h.push(`List-Unsubscribe: ${r}`)}if(e.googleMailHeaders){const{googleMailHeaders:r}=e;r.feedbackId&&h.push(`Feedback-ID: ${b(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=n.indexOf(`\r
6
+ \r
7
+ `);if(r!==-1){const m=n.slice(0,r),E=n.slice(r+4);n=`${m}\r
8
+ ${h.join(`\r
9
+ `)}\r
10
+ \r
11
+ ${E}`}}t.dkim&&(e.useDkim||e.useDkim===void 0)&&(n=await F(n));const g=n.replaceAll(`\r
12
+ .`,`\r
13
+ ..`).replace(ne,"..");await p(o,`${g}\r
14
+ .`,"250");const $=K();return await A(o,t.pool),{data:{messageId:$,provider:l,response:"Message accepted",sent:!0,timestamp:new Date},success:!0}}catch(i){try{await A(o)}catch{}throw i}}catch(a){return{error:new f(l,`Failed to send email: ${a.message}`,{cause:a}),success:!1}}},async shutdown(){for(const e of w)try{await A(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 a=await p(e,`EHLO ${t.host}`,"250"),o=L(a);Object.keys(o).includes("STARTTLS")&&(await p(e,"STARTTLS","220"),e=await P(e),await p(e,`EHLO ${t.host}`,"250"))}catch{if(t.rejectUnauthorized)return await A(e),!1}return await D(e),await A(e),!0}catch{return await A(e),!1}}catch{return!1}}}});export{pe as default};
@@ -1 +1 @@
1
- import h from"./EmailError-BIaHK1Uw.js";import A from"./RequiredOptionError-ctDEEB1s.js";import{g as E}from"./generate-message-id-B2n2yqR6.js";import{m as I}from"./make-request-Cyz5_yu8.js";import{r as w}from"./retry-aghj7y8m.js";import{v as P}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as T}from"./defineProvider-C9q-7iwt.js";import{c as _,P as S,h as j}from"./provider-base-BEz00m9R.js";import{a as u}from"./address-formatter-CXZ1aWBX.js";import{c as z}from"./attachment-processor-BJFDS343.js";const r="sparkpost",C="https://api.sparkpost.com/api/v1",D=3e4,K=3,m=a=>[a].flat(),J=T((a={})=>{if(!a.apiKey)throw new A(r,"apiKey");const o={apiKey:a.apiKey,debug:a.debug??!1,endpoint:a.endpoint??C,logger:a.logger,retries:a.retries??K,timeout:a.timeout??D},y=new S,g=_(r,a.logger);return{features:{attachments:!0,batchSending:!0,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!0,templates:!0,tracking:!0},async initialize(){await y.ensureInitialized(async()=>{if(!await this.isAvailable())throw new h(r,"SparkPost API not available or invalid API key");g.debug("Provider initialized successfully")},r)},async isAvailable(){return o.apiKey.length>0},name:r,options:o,async sendEmail(e){try{const i=P(e);if(i.length>0)return{error:new h(r,`Invalid email options: ${i.join(", ")}`),success:!1};await y.ensureInitialized(()=>this.initialize(),r);const l=m(e.to),p=e.cc?m(e.cc):[],v=e.bcc?m(e.bcc):[],k=[...l.map(t=>({address:u(t)})),...p.map(t=>({address:{...u(t),header_to:l.map(s=>s.email).join(", ")}})),...v.map(t=>({address:{...u(t),header_to:l.map(s=>s.email).join(", ")}}))],n={from:u(e.from),subject:e.subject};if(e.html&&(n.html=e.html),e.text&&(n.text=e.text),e.replyTo){const t=m(e.replyTo)[0];t&&(n.reply_to=t.email)}const c={};if(p.length>0&&(c.CC=p.map(t=>t.email).join(", ")),e.headers)for(const[t,s]of Object.entries(e.headers))c[t]=String(s);Object.keys(c).length>0&&(n.headers=c),e.templateId&&(n.template_id=e.templateId),e.attachments&&e.attachments.length>0&&(n.attachments=await Promise.all(e.attachments.map(async t=>{const s=await z(t,r);return{data:s.content,name:s.filename,type:s.contentType}})));const f={content:n,recipients:k};e.campaignId&&(f.campaign_id=e.campaignId),(e.trackOpens!==void 0||e.trackClicks!==void 0)&&(f.options={click_tracking:e.trackClicks??!0,open_tracking:e.trackOpens??!0});const d=await w(async()=>I(`${o.endpoint}/transmissions`,{headers:{Authorization:o.apiKey,"Content-Type":"application/json"},method:"POST",timeout:o.timeout},JSON.stringify(f)),o.retries);if(!d.success)return{error:d.error??new h(r,"Failed to send email"),success:!1};const{body:b}=d.data;return{data:{messageId:b?.results?.id??E(),provider:r,response:d.data,sent:!0,timestamp:new Date},success:!0}}catch(i){return{error:j(r,"send email",i,g),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{J as default};
1
+ import h from"./EmailError-BIaHK1Uw.js";import A from"./RequiredOptionError-ctDEEB1s.js";import{g as E}from"./generate-message-id-B2n2yqR6.js";import{m as I}from"./make-request-Cyz5_yu8.js";import{r as w}from"./retry-aghj7y8m.js";import{v as P}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as T}from"./defineProvider-C9q-7iwt.js";import{c as _,P as S,h as j}from"./provider-base-BEz00m9R.js";import{a as u}from"./address-formatter-w36S9ZYj.js";import{c as z}from"./attachment-processor-BJFDS343.js";const r="sparkpost",C="https://api.sparkpost.com/api/v1",D=3e4,K=3,m=a=>[a].flat(),J=T((a={})=>{if(!a.apiKey)throw new A(r,"apiKey");const o={apiKey:a.apiKey,debug:a.debug??!1,endpoint:a.endpoint??C,logger:a.logger,retries:a.retries??K,timeout:a.timeout??D},y=new S,g=_(r,a.logger);return{features:{attachments:!0,batchSending:!0,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!0,templates:!0,tracking:!0},async initialize(){await y.ensureInitialized(async()=>{if(!await this.isAvailable())throw new h(r,"SparkPost API not available or invalid API key");g.debug("Provider initialized successfully")},r)},async isAvailable(){return o.apiKey.length>0},name:r,options:o,async sendEmail(e){try{const i=P(e);if(i.length>0)return{error:new h(r,`Invalid email options: ${i.join(", ")}`),success:!1};await y.ensureInitialized(()=>this.initialize(),r);const l=m(e.to),p=e.cc?m(e.cc):[],v=e.bcc?m(e.bcc):[],k=[...l.map(t=>({address:u(t)})),...p.map(t=>({address:{...u(t),header_to:l.map(s=>s.email).join(", ")}})),...v.map(t=>({address:{...u(t),header_to:l.map(s=>s.email).join(", ")}}))],n={from:u(e.from),subject:e.subject};if(e.html&&(n.html=e.html),e.text&&(n.text=e.text),e.replyTo){const t=m(e.replyTo)[0];t&&(n.reply_to=t.email)}const c={};if(p.length>0&&(c.CC=p.map(t=>t.email).join(", ")),e.headers)for(const[t,s]of Object.entries(e.headers))c[t]=String(s);Object.keys(c).length>0&&(n.headers=c),e.templateId&&(n.template_id=e.templateId),e.attachments&&e.attachments.length>0&&(n.attachments=await Promise.all(e.attachments.map(async t=>{const s=await z(t,r);return{data:s.content,name:s.filename,type:s.contentType}})));const f={content:n,recipients:k};e.campaignId&&(f.campaign_id=e.campaignId),(e.trackOpens!==void 0||e.trackClicks!==void 0)&&(f.options={click_tracking:e.trackClicks??!0,open_tracking:e.trackOpens??!0});const d=await w(async()=>I(`${o.endpoint}/transmissions`,{headers:{Authorization:o.apiKey,"Content-Type":"application/json"},method:"POST",timeout:o.timeout},JSON.stringify(f)),o.retries);if(!d.success)return{error:d.error??new h(r,"Failed to send email"),success:!1};const{body:b}=d.data;return{data:{messageId:b?.results?.id??E(),provider:r,response:d.data,sent:!0,timestamp:new Date},success:!0}}catch(i){return{error:j(r,"send email",i,g),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{J as default};
@@ -1 +1 @@
1
- import d from"./EmailError-BIaHK1Uw.js";import b from"./RequiredOptionError-ctDEEB1s.js";import{g as v}from"./generate-message-id-B2n2yqR6.js";import{h as w}from"./headers-to-record-ZOZ7Dubo.js";import{m as f}from"./make-request-Cyz5_yu8.js";import{r as h}from"./retry-aghj7y8m.js";import{v as E}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as I}from"./defineProvider-C9q-7iwt.js";import{c as A,P as T,h as y}from"./provider-base-BEz00m9R.js";import{f as u,a as P}from"./address-formatter-CXZ1aWBX.js";import{p as S}from"./attachment-processor-BJFDS343.js";const t="sweego",z="https://api.sweego.com",R=3e4,j=3,_=I((s={})=>{if(!s.apiKey)throw new b(t,"apiKey");const i={apiKey:s.apiKey,debug:s.debug??!1,endpoint:s.endpoint??z,retries:s.retries??j,timeout:s.timeout??R,...s.logger&&{logger:s.logger}},l=new T,a=A(t,s.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 d(t,"Email ID is required to retrieve email details"),success:!1};await l.ensureInitialized(()=>this.initialize(),t);const o={Authorization:`Bearer ${i.apiKey}`,"Content-Type":"application/json"};a.debug("Retrieving email details",{id:e});const r=await h(async()=>f(`${i.endpoint}/emails/${e}`,{headers:o,method:"GET",timeout:i.timeout}),i.retries);return r.success?(a.debug("Email details retrieved successfully"),{data:r.data?.body,success:!0}):(a.debug("API request failed when retrieving email",r.error),{error:new d(t,`Failed to retrieve email: ${r.error instanceof Error?r.error.message:"Unknown error"}`,{cause:r.error}),success:!1})}catch(o){return{error:y(t,"retrieve email",o,a),success:!1}}},async initialize(){await l.ensureInitialized(async()=>{if(!await this.isAvailable())throw new d(t,"Sweego API not available or invalid API key");a.debug("Provider initialized successfully")},t)},async isAvailable(){try{return a.debug("Checking Sweego API availability"),!0}catch(e){return a.debug("Error checking availability:",e),!1}},name:t,options:i,async sendEmail(e){try{const o=E(e);if(o.length>0)return{error:new d(t,`Invalid email options: ${o.join(", ")}`),success:!1};await l.ensureInitialized(()=>this.initialize(),t);const r={from:{email:e.from.email,name:e.from.name},subject:e.subject,to:u(e.to)};if(e.html&&(r.html=e.html),e.text&&(r.text=e.text),e.cc&&(r.cc=u(e.cc)),e.bcc&&(r.bcc=u(e.bcc)),e.replyTo&&(r.replyTo=P(e.replyTo)),e.templateId&&(r.templateId=e.templateId,e.templateVariables&&(r.templateVariables=e.templateVariables)),e.tags&&e.tags.length>0&&(r.tags=e.tags),e.headers){const n=w(e.headers);r.headers=n}e.attachments&&e.attachments.length>0&&(r.attachments=await Promise.all(e.attachments.map(async n=>({content:await S(n,t),contentType:n.contentType??"application/octet-stream",filename:n.filename,...n.cid&&{cid:n.cid}})))),a.debug("Sending email via Sweego API",{subject:r.subject,to:r.to});const p={Authorization:`Bearer ${i.apiKey}`,"Content-Type":"application/json"},c=await h(async()=>f(`${i.endpoint}/send`,{headers:p,method:"POST",timeout:i.timeout},JSON.stringify(r)),i.retries);if(!c.success)return a.debug("API request failed when sending email",c.error),{error:c.error??new d(t,"Failed to send email"),success:!1};const m=c.data?.body,g=m?.messageId??m?.id??v();return a.debug("Email sent successfully",{messageId:g}),{data:{messageId:g,provider:t,response:c.data,sent:!0,timestamp:new Date},success:!0}}catch(o){return{error:y(t,"send email",o,a),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{_ as default};
1
+ import d from"./EmailError-BIaHK1Uw.js";import b from"./RequiredOptionError-ctDEEB1s.js";import{g as v}from"./generate-message-id-B2n2yqR6.js";import{h as w}from"./headers-to-record-ZOZ7Dubo.js";import{m as f}from"./make-request-Cyz5_yu8.js";import{r as h}from"./retry-aghj7y8m.js";import{v as E}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as I}from"./defineProvider-C9q-7iwt.js";import{c as A,P as T,h as y}from"./provider-base-BEz00m9R.js";import{f as u,a as P}from"./address-formatter-w36S9ZYj.js";import{p as S}from"./attachment-processor-BJFDS343.js";const t="sweego",z="https://api.sweego.com",R=3e4,j=3,_=I((s={})=>{if(!s.apiKey)throw new b(t,"apiKey");const i={apiKey:s.apiKey,debug:s.debug??!1,endpoint:s.endpoint??z,retries:s.retries??j,timeout:s.timeout??R,...s.logger&&{logger:s.logger}},l=new T,a=A(t,s.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 d(t,"Email ID is required to retrieve email details"),success:!1};await l.ensureInitialized(()=>this.initialize(),t);const o={Authorization:`Bearer ${i.apiKey}`,"Content-Type":"application/json"};a.debug("Retrieving email details",{id:e});const r=await h(async()=>f(`${i.endpoint}/emails/${e}`,{headers:o,method:"GET",timeout:i.timeout}),i.retries);return r.success?(a.debug("Email details retrieved successfully"),{data:r.data?.body,success:!0}):(a.debug("API request failed when retrieving email",r.error),{error:new d(t,`Failed to retrieve email: ${r.error instanceof Error?r.error.message:"Unknown error"}`,{cause:r.error}),success:!1})}catch(o){return{error:y(t,"retrieve email",o,a),success:!1}}},async initialize(){await l.ensureInitialized(async()=>{if(!await this.isAvailable())throw new d(t,"Sweego API not available or invalid API key");a.debug("Provider initialized successfully")},t)},async isAvailable(){try{return a.debug("Checking Sweego API availability"),!0}catch(e){return a.debug("Error checking availability:",e),!1}},name:t,options:i,async sendEmail(e){try{const o=E(e);if(o.length>0)return{error:new d(t,`Invalid email options: ${o.join(", ")}`),success:!1};await l.ensureInitialized(()=>this.initialize(),t);const r={from:{email:e.from.email,name:e.from.name},subject:e.subject,to:u(e.to)};if(e.html&&(r.html=e.html),e.text&&(r.text=e.text),e.cc&&(r.cc=u(e.cc)),e.bcc&&(r.bcc=u(e.bcc)),e.replyTo&&(r.replyTo=P(e.replyTo)),e.templateId&&(r.templateId=e.templateId,e.templateVariables&&(r.templateVariables=e.templateVariables)),e.tags&&e.tags.length>0&&(r.tags=e.tags),e.headers){const n=w(e.headers);r.headers=n}e.attachments&&e.attachments.length>0&&(r.attachments=await Promise.all(e.attachments.map(async n=>({content:await S(n,t),contentType:n.contentType??"application/octet-stream",filename:n.filename,...n.cid&&{cid:n.cid}})))),a.debug("Sending email via Sweego API",{subject:r.subject,to:r.to});const p={Authorization:`Bearer ${i.apiKey}`,"Content-Type":"application/json"},c=await h(async()=>f(`${i.endpoint}/send`,{headers:p,method:"POST",timeout:i.timeout},JSON.stringify(r)),i.retries);if(!c.success)return a.debug("API request failed when sending email",c.error),{error:c.error??new d(t,"Failed to send email"),success:!1};const m=c.data?.body,g=m?.messageId??m?.id??v();return a.debug("Email sent successfully",{messageId:g}),{data:{messageId:g,provider:t,response:c.data,sent:!0,timestamp:new Date},success:!0}}catch(o){return{error:y(t,"send email",o,a),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{_ as default};
@@ -104,4 +104,4 @@ interface EmailEncrypter {
104
104
  */
105
105
  encrypt: (email: EmailOptions) => Promise<EmailOptions>;
106
106
  }
107
- export { DkimOptions as D, EmailSigner as E, SmimeEncryptOptions as S, EmailEncrypter as a, SmimeSignOptions as b };
107
+ export { DkimOptions as D, EmailEncrypter as E, SmimeEncryptOptions as S, SmimeSignOptions as a, EmailSigner as b };
@@ -1 +1 @@
1
- import l from"./EmailError-BIaHK1Uw.js";import g from"./RequiredOptionError-ctDEEB1s.js";import{g as k}from"./generate-message-id-B2n2yqR6.js";import{h as v}from"./headers-to-record-ZOZ7Dubo.js";import{m as p}from"./make-request-Cyz5_yu8.js";import{r as E}from"./retry-aghj7y8m.js";import{s as A,a as _}from"./sanitize-header-CW0f3IT7.js";import{v as T}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as w}from"./defineProvider-C9q-7iwt.js";import{c as z,P,h as I}from"./provider-base-BEz00m9R.js";import{n as y}from"./address-formatter-CXZ1aWBX.js";const s="zeptomail",j="https://api.zeptomail.com/v1.1",D=3e4,R=3,M=w((o={})=>{if(!o.token)throw new g(s,"token");if(!o.token.startsWith("Zoho-enczapikey "))throw new l(s,'Token should be in the format "Zoho-enczapikey <your_api_key>"');const c={debug:o.debug??!1,endpoint:o.endpoint??j,logger:o.logger,retries:o.retries??R,timeout:o.timeout??D,token:o.token},u=new P,i=z(s,o.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(s,"Zeptomail API not available or invalid token");i.debug("Provider initialized successfully")},s)},async isAvailable(){try{return c.token&&c.token.startsWith("Zoho-enczapikey ")?(i.debug("Token format is valid, assuming Zeptomail is available"),!0):!1}catch(e){return i.debug("Error checking availability:",e),!1}},name:s,options:c,async sendEmail(e){try{const d=T(e);if(d.length>0)return{error:new l(s,`Invalid email options: ${d.join(", ")}`),success:!1};await u.ensureInitialized(()=>this.initialize(),s);const t={from:y(e.from).address,subject:e.subject};if(Array.isArray(e.to)?t.to=e.to.length===1?e.to[0].email:e.to.map(r=>r.email):t.to=e.to.email,e.text&&(t.textbody=e.text),e.html&&(t.htmlbody=e.html),e.cc&&(Array.isArray(e.cc)?t.cc=e.cc.length===1?e.cc[0].email:e.cc.map(r=>r.email):t.cc=e.cc.email),e.bcc&&(Array.isArray(e.bcc)?t.bcc=e.bcc.length===1?e.bcc[0].email:e.bcc.map(r=>r.email):t.bcc=e.bcc.email),e.replyTo&&(t.reply_to=[y(e.replyTo).address]),e.trackClicks!==void 0&&(t.track_clicks=e.trackClicks),e.trackOpens!==void 0&&(t.track_opens=e.trackOpens),e.clientReference&&(t.client_reference=e.clientReference),e.mimeHeaders&&Object.keys(e.mimeHeaders).length>0){const r={};for(const[a,f]of Object.entries(e.mimeHeaders))r[a]=f;t.mime_headers=r}if(e.headers){const r=v(e.headers);Object.keys(r).length>0&&(t.mime_headers??={},Object.entries(r).forEach(([a,f])=>{t.mime_headers&&(t.mime_headers[A(a)]=_(f))}))}e.attachments&&e.attachments.length>0&&(t.attachments=e.attachments.map(r=>{const a={name:r.filename};return r.content?(a.content=typeof r.content=="string"?r.content:r.content.toString("base64"),r.contentType&&(a.mime_type=r.contentType)):r.path&&(a.file_cache_key=r.path),a})),i.debug("Sending email via Zeptomail API",{subject:t.subject,to:t.to});const b={Accept:"application/json",Authorization:c.token,"Content-Type":"application/json"},n=await E(async()=>p(`${c.endpoint}/email`,{headers:b,method:"POST",timeout:c.timeout},JSON.stringify(t)),c.retries);if(!n.success){i.debug("API request failed",n.error);let r=n.error instanceof Error?n.error.message:"Unknown error";const a=n.data;return a?.body?.message?r+=` Details: ${a.body.message}`:a?.body?.error?.message&&(r+=` Details: ${a.body.error.message}`),{error:new l(s,`Failed to send email: ${r}`,{cause:n.error}),success:!1}}const m=n.data?.body,h=m?.request_id??k();return i.debug("Email sent successfully",{messageId:h}),{data:{messageId:h,provider:s,response:m,sent:!0,timestamp:new Date},success:!0}}catch(d){return{error:I(s,"send email",d,i),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{M as default};
1
+ import l from"./EmailError-BIaHK1Uw.js";import g from"./RequiredOptionError-ctDEEB1s.js";import{g as k}from"./generate-message-id-B2n2yqR6.js";import{h as v}from"./headers-to-record-ZOZ7Dubo.js";import{m as p}from"./make-request-Cyz5_yu8.js";import{r as E}from"./retry-aghj7y8m.js";import{s as A,a as _}from"./sanitize-header-CW0f3IT7.js";import{v as T}from"./validate-email-options-DxdAVLlu.js";import{defineProvider as w}from"./defineProvider-C9q-7iwt.js";import{c as z,P,h as I}from"./provider-base-BEz00m9R.js";import{n as y}from"./address-formatter-w36S9ZYj.js";const s="zeptomail",j="https://api.zeptomail.com/v1.1",D=3e4,R=3,M=w((o={})=>{if(!o.token)throw new g(s,"token");if(!o.token.startsWith("Zoho-enczapikey "))throw new l(s,'Token should be in the format "Zoho-enczapikey <your_api_key>"');const c={debug:o.debug??!1,endpoint:o.endpoint??j,logger:o.logger,retries:o.retries??R,timeout:o.timeout??D,token:o.token},u=new P,i=z(s,o.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(s,"Zeptomail API not available or invalid token");i.debug("Provider initialized successfully")},s)},async isAvailable(){try{return c.token&&c.token.startsWith("Zoho-enczapikey ")?(i.debug("Token format is valid, assuming Zeptomail is available"),!0):!1}catch(e){return i.debug("Error checking availability:",e),!1}},name:s,options:c,async sendEmail(e){try{const d=T(e);if(d.length>0)return{error:new l(s,`Invalid email options: ${d.join(", ")}`),success:!1};await u.ensureInitialized(()=>this.initialize(),s);const t={from:y(e.from).address,subject:e.subject};if(Array.isArray(e.to)?t.to=e.to.length===1?e.to[0].email:e.to.map(r=>r.email):t.to=e.to.email,e.text&&(t.textbody=e.text),e.html&&(t.htmlbody=e.html),e.cc&&(Array.isArray(e.cc)?t.cc=e.cc.length===1?e.cc[0].email:e.cc.map(r=>r.email):t.cc=e.cc.email),e.bcc&&(Array.isArray(e.bcc)?t.bcc=e.bcc.length===1?e.bcc[0].email:e.bcc.map(r=>r.email):t.bcc=e.bcc.email),e.replyTo&&(t.reply_to=[y(e.replyTo).address]),e.trackClicks!==void 0&&(t.track_clicks=e.trackClicks),e.trackOpens!==void 0&&(t.track_opens=e.trackOpens),e.clientReference&&(t.client_reference=e.clientReference),e.mimeHeaders&&Object.keys(e.mimeHeaders).length>0){const r={};for(const[a,f]of Object.entries(e.mimeHeaders))r[a]=f;t.mime_headers=r}if(e.headers){const r=v(e.headers);Object.keys(r).length>0&&(t.mime_headers??={},Object.entries(r).forEach(([a,f])=>{t.mime_headers&&(t.mime_headers[A(a)]=_(f))}))}e.attachments&&e.attachments.length>0&&(t.attachments=e.attachments.map(r=>{const a={name:r.filename};return r.content?(a.content=typeof r.content=="string"?r.content:r.content.toString("base64"),r.contentType&&(a.mime_type=r.contentType)):r.path&&(a.file_cache_key=r.path),a})),i.debug("Sending email via Zeptomail API",{subject:t.subject,to:t.to});const b={Accept:"application/json",Authorization:c.token,"Content-Type":"application/json"},n=await E(async()=>p(`${c.endpoint}/email`,{headers:b,method:"POST",timeout:c.timeout},JSON.stringify(t)),c.retries);if(!n.success){i.debug("API request failed",n.error);let r=n.error instanceof Error?n.error.message:"Unknown error";const a=n.data;return a?.body?.message?r+=` Details: ${a.body.message}`:a?.body?.error?.message&&(r+=` Details: ${a.body.error.message}`),{error:new l(s,`Failed to send email: ${r}`,{cause:n.error}),success:!1}}const m=n.data?.body,h=m?.request_id??k();return i.debug("Email sent successfully",{messageId:h}),{data:{messageId:h,provider:s,response:m,sent:!0,timestamp:new Date},success:!0}}catch(d){return{error:I(s,"send email",d,i),success:!1}}},async validateCredentials(){return this.isAvailable()}}});export{M as default};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/ahaSendProvider-DY559XjD.js";export{r as ahaSendProvider};
1
+ import{default as r}from"../../packem_shared/ahaSendProvider-C1qvG8Cj.js";export{r as ahaSendProvider};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/autoSendProvider-BgdWf422.js";export{r as autoSendProvider};
1
+ import{default as r}from"../../packem_shared/autoSendProvider-yxUx3sEj.js";export{r as autoSendProvider};
@@ -1 +1 @@
1
- import{default as a}from"../../packem_shared/azureProvider-Bs4BGYR1.js";export{a as azureProvider};
1
+ import{default as a}from"../../packem_shared/azureProvider-CLLRKtOf.js";export{a as azureProvider};
@@ -1 +1 @@
1
- import{default as o}from"../../packem_shared/brevoProvider-xoRTeFIx.js";export{o as brevoProvider};
1
+ import{default as o}from"../../packem_shared/brevoProvider-CHlodyzV.js";export{o as brevoProvider};
@@ -1,5 +1,6 @@
1
1
  import { P as ProviderFactory } from "../../packem_shared/provider.d-Cx5YQJdP.js";
2
2
  export type { a as Provider } from "../../packem_shared/provider.d-Cx5YQJdP.js";
3
+ import { D as DkimOptions } from "../../packem_shared/types.d-Cb5fls_X.js";
3
4
  import { B as BaseConfig, E as EmailOptions } from "../../packem_shared/types.d-B9295M4_.js";
4
5
  import 'node:buffer';
5
6
  /**
@@ -9,6 +10,15 @@ import 'node:buffer';
9
10
  * `send` function — keeping this provider runtime-agnostic and testable.
10
11
  */
11
12
  interface CloudflareEmailConfig extends BaseConfig {
13
+ /**
14
+ * DKIM signing, applied to the serialized MIME message just before it is handed to
15
+ * {@link CloudflareEmailConfig.send}.
16
+ *
17
+ * Canonicalization defaults to `relaxed/relaxed` here rather than the `simple/simple` of
18
+ * {@link DkimOptions}, since relaying hops re-wrap whitespace. `privateKey` must be key
19
+ * content — the Workers runtime has no filesystem, so `file://` paths do not resolve.
20
+ */
21
+ dkim?: DkimOptions;
12
22
  /**
13
23
  * Sends a raw RFC 822 message via your Worker's Email binding.
14
24
  * @param from The envelope-from address.
@@ -27,7 +37,13 @@ interface CloudflareEmailConfig extends BaseConfig {
27
37
  /**
28
38
  * Cloudflare Email-specific options.
29
39
  */
30
- type CloudflareEmailOptions = EmailOptions;
40
+ interface CloudflareEmailOptions extends EmailOptions {
41
+ /**
42
+ * Sign this message with DKIM when {@link CloudflareEmailConfig.dkim} is configured.
43
+ * @default true
44
+ */
45
+ useDkim?: boolean;
46
+ }
31
47
  /**
32
48
  * Cloudflare Email Workers provider — sends a raw RFC 822 message through a Worker's Email send
33
49
  * binding (supplied via {@link CloudflareEmailConfig.send}). Single-recipient only, per the binding.
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/cloudflareEmailProvider-BkR-P0YD.js";export{e as cloudflareEmailProvider};
1
+ import{default as e}from"../../packem_shared/cloudflareEmailProvider-Ckh_u-0D.js";export{e as cloudflareEmailProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/infobipProvider-mEYgfWJ7.js";export{e as infobipProvider};
1
+ import{default as e}from"../../packem_shared/infobipProvider-BEu1ycxS.js";export{e as infobipProvider};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/mailchannelsProvider-Cgb8el7C.js";export{r as mailchannelsProvider};
1
+ import{default as r}from"../../packem_shared/mailchannelsProvider-BZeuZk3d.js";export{r as mailchannelsProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/mailCrabProvider-Cx9rnuyE.js";export{e as mailCrabProvider};
1
+ import{default as e}from"../../packem_shared/mailCrabProvider-BQ5ELwPU.js";export{e as mailCrabProvider};
@@ -1 +1 @@
1
- import{default as a}from"../../packem_shared/mailerSendProvider-BvRIjuVE.js";export{a as mailerSendProvider};
1
+ import{default as a}from"../../packem_shared/mailerSendProvider-C_Db652T.js";export{a as mailerSendProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/mailgunProvider-kNcvF_z6.js";export{e as mailgunProvider};
1
+ import{default as e}from"../../packem_shared/mailgunProvider-CU2b8ie8.js";export{e as mailgunProvider};
@@ -1 +1 @@
1
- import{default as a}from"../../packem_shared/mailjetProvider-DqJUhLuH.js";export{a as mailjetProvider};
1
+ import{default as a}from"../../packem_shared/mailjetProvider-VqvqCS7I.js";export{a as mailjetProvider};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/mailomatProvider-BBOqRhV_.js";export{r as mailomatProvider};
1
+ import{default as r}from"../../packem_shared/mailomatProvider-FMk4FZZz.js";export{r as mailomatProvider};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/mailPaceProvider-DvSlan-v.js";export{r as mailPaceProvider};
1
+ import{default as r}from"../../packem_shared/mailPaceProvider-Ca3cz8JU.js";export{r as mailPaceProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/mailtrapProvider-CeBW2Gzg.js";export{e as mailtrapProvider};
1
+ import{default as e}from"../../packem_shared/mailtrapProvider-Qs0exKiJ.js";export{e as mailtrapProvider};
@@ -1 +1 @@
1
- import{default as d}from"../../packem_shared/mandrillProvider-Dab8i0gF.js";export{d as mandrillProvider};
1
+ import{default as d}from"../../packem_shared/mandrillProvider-Co_EfMxl.js";export{d as mandrillProvider};
@@ -1 +1 @@
1
- import{default as o}from"../../packem_shared/netcoreProvider-DMJsQ8IM.js";export{o as netcoreProvider};
1
+ import{default as o}from"../../packem_shared/netcoreProvider-_kXjZ0bE.js";export{o as netcoreProvider};
@@ -1 +1 @@
1
- import{default as a}from"../../packem_shared/postalProvider-COVY4T94.js";export{a as postalProvider};
1
+ import{default as a}from"../../packem_shared/postalProvider-tEBNXL3h.js";export{a as postalProvider};
@@ -1 +1 @@
1
- import{default as a}from"../../packem_shared/postmarkProvider-Cj64C4dc.js";export{a as postmarkProvider};
1
+ import{default as a}from"../../packem_shared/postmarkProvider-DdavP5x5.js";export{a as postmarkProvider};
@@ -1 +1 @@
1
- import{default as d}from"../../packem_shared/resendProvider-Da5r7dMe.js";export{d as resendProvider};
1
+ import{default as d}from"../../packem_shared/resendProvider-CMtlyIye.js";export{d as resendProvider};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/scalewayProvider-CDjpYmJc.js";export{r as scalewayProvider};
1
+ import{default as r}from"../../packem_shared/scalewayProvider-BFA1PQ73.js";export{r as scalewayProvider};
@@ -1 +1 @@
1
- import{default as e}from"../../packem_shared/sendGridProvider-C1rp9hpg.js";export{e as sendGridProvider};
1
+ import{default as e}from"../../packem_shared/sendGridProvider-DV80Lg7a.js";export{e as sendGridProvider};
@@ -1,5 +1,6 @@
1
1
  import { P as ProviderFactory } from "../../packem_shared/provider.d-Cx5YQJdP.js";
2
2
  export type { a as Provider } from "../../packem_shared/provider.d-Cx5YQJdP.js";
3
+ import { D as DkimOptions } from "../../packem_shared/types.d-Cb5fls_X.js";
3
4
  import { B as BaseConfig, E as EmailOptions } from "../../packem_shared/types.d-B9295M4_.js";
4
5
  import 'node:buffer';
5
6
  /**
@@ -7,11 +8,14 @@ import 'node:buffer';
7
8
  */
8
9
  interface SmtpConfig extends BaseConfig {
9
10
  authMethod?: "LOGIN" | "PLAIN" | "CRAM-MD5" | "OAUTH2";
10
- dkim?: {
11
- domainName: string;
12
- keySelector: string;
13
- privateKey: string;
14
- };
11
+ /**
12
+ * DKIM signing, applied to the serialized MIME message just before `DATA` is sent.
13
+ *
14
+ * Canonicalization defaults to `relaxed/relaxed` here rather than the `simple/simple` of
15
+ * {@link DkimOptions}: SMTP hops routinely re-wrap whitespace, which `simple` does not
16
+ * tolerate. Set `headerCanon`/`bodyCanon` explicitly to override.
17
+ */
18
+ dkim?: DkimOptions;
15
19
  host: string;
16
20
  maxConnections?: number;
17
21
  oauth2?: {
@@ -1 +1 @@
1
- import{default as o}from"../../packem_shared/smtpProvider-Dr2XAFQu.js";export{o as smtpProvider};
1
+ import{default as o}from"../../packem_shared/smtpProvider-BCEzJmay.js";export{o as smtpProvider};
@@ -1 +1 @@
1
- import{default as a}from"../../packem_shared/sparkpostProvider-DKon_hyx.js";export{a as sparkpostProvider};
1
+ import{default as a}from"../../packem_shared/sparkpostProvider-C3pATjJX.js";export{a as sparkpostProvider};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/sweegoProvider-BclZuNBf.js";export{r as sweegoProvider};
1
+ import{default as r}from"../../packem_shared/sweegoProvider-CkFtUAzq.js";export{r as sweegoProvider};
@@ -1 +1 @@
1
- import{default as r}from"../../packem_shared/zeptomailProvider-D5B3kqFm.js";export{r as zeptomailProvider};
1
+ import{default as r}from"../../packem_shared/zeptomailProvider-tqRYpQlv.js";export{r as zeptomailProvider};
@@ -1,10 +1,10 @@
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-8M9NjOr0.js";
3
+ import { M as Mail } from "../packem_shared/mail.d-BdyyyQO5.js";
4
4
  import 'node:buffer';
5
5
  import 'ical-generator';
6
6
  import "../packem_shared/types.d-I-KeZ5w2.js";
7
- import "../packem_shared/types.d-B0t3PQ3t.js";
7
+ import "../packem_shared/types.d-Cb5fls_X.js";
8
8
  import "../packem_shared/types.d-GKqPNk0I.js";
9
9
  import "../packem_shared/provider.d-Cx5YQJdP.js";
10
10
  /**
@@ -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-DpwItmkN.js";import{toEmailSnapshot as c}from"../packem_shared/toEmailSnapshot-BOhTn44E.js";import{createTestEmail as s}from"../packem_shared/createTestEmail-CPnHNKBT.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-DpwItmkN.js";import{toEmailSnapshot as c}from"../packem_shared/toEmailSnapshot-BOhTn44E.js";import{createTestEmail as s}from"../packem_shared/createTestEmail-sB6z8m6Z.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 a}from"../packem_shared/format-address-BDKhXcXV.js";import e from"../packem_shared/EmailError-BIaHK1Uw.js";import t from"./validation/validate-email.js";const n=i=>{if(!t(i.email))throw new e("email",`Invalid email address: ${i.email}`);if(i.name){const m=a(i.name);if(m)return`"${m}" <${i.email}>`}return i.email};export{n as default};
1
+ import{s as a}from"../packem_shared/format-address-Bb7xk8G_.js";import e from"../packem_shared/EmailError-BIaHK1Uw.js";import t from"./validation/validate-email.js";const n=i=>{if(!t(i.email))throw new e("email",`Invalid email address: ${i.email}`);if(i.name){const m=a(i.name);if(m)return`"${m}" <${i.email}>`}return i.email};export{n as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/email",
3
- "version": "2.1.9",
3
+ "version": "3.0.0",
4
4
  "description": "A comprehensive email library with multi-provider support, crypto utilities, and template engines",
5
5
  "keywords": [
6
6
  "ahasend",
@@ -1,18 +0,0 @@
1
- import{createRequire as $}from"node:module";import{z as v}from"./index-B8wiKJdh.js";import{h as L}from"./headers-to-record-ZOZ7Dubo.js";let j;const C=n=>(j??=$(import.meta.url))(n),p=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,z=n=>{if(typeof p<"u"&&p.versions&&p.versions.node){const[e,t]=p.versions.node.split(".").map(Number);if(e>22||e===22&&t>=3||e===20&&t>=16)return p.getBuiltinModule(n)}return C(n)},{createHash:f,createPrivateKey:w,sign:H,createSign:T}=z("node:crypto"),_=(n,e="simple")=>{const t=[];for(const[r,s]of Object.entries(n)){const o=e==="relaxed"?r.toLowerCase().trim():r,a=e==="relaxed"?s.replaceAll(/\s+/g," ").trim():s;t.push(`${o}:${a}`)}return t.join(`\r
2
- `)},S=(n,e="simple")=>{if(e==="simple"){const i=n.replace(/(\r\n|\r|\n)$/,`
3
- `);let c=i.length;for(;c>0&&i[c-1]===`
4
- `;)c-=1;const h=i.slice(0,c);return h?`${h}
5
- `:`
6
- `}let t=n.replaceAll(`\r
7
- `,`
8
- `).replaceAll("\r",`
9
- `);t=t.split(`
10
- `).map(i=>i.replaceAll(/\s+/g," ").replace(/[ \t]+$/,"")).join(`
11
- `);let o=t.length;for(;o>0&&t[o-1]===`
12
- `;)o-=1;const a=t.slice(0,o);return a?`${a}
13
- `:`
14
- `},x=(n,e,t)=>{const r=e.headerCanon??"simple",s=e.bodyCanon??"simple",o=Object.keys(n).filter(i=>!e.headersToIgnore?.some(c=>c.toLowerCase()===i.toLowerCase())).map(i=>i.toLowerCase()).join(":");return["v=1",`a=${e.algorithm??"rsa-sha256"}`,`c=${r}/${s}`,`d=${e.domainName}`,`s=${e.keySelector}`,`h=${o}`,`bh=${t}`,"b="].join("; ")},I=(n,e,t)=>t==="ed25519-sha256"?H(null,f("sha256").update(n).digest(),e).toString("base64"):T("RSA-SHA256").update(n).sign(e,"base64");class l{static sanitizeDisplayName(e){let t=e.replaceAll(/[\r\n\t]+/g," ");t=[...t].filter(o=>{const a=o.codePointAt(0);return a===void 0?!1:a>=32&&a<=126||a>159}).join("");const r="\\",s='"';return t=t.replaceAll(r,r+r).replaceAll(s,r+s),t=t.trim().replaceAll(/\s+/g," "),t}static formatAddress(e){if(e.name){const t=l.sanitizeDisplayName(e.name);return t?`"${t}" <${e.email}>`:e.email}return e.email}static formatAddresses(e){return(Array.isArray(e)?e:[e]).map(r=>l.formatAddress(r)).join(", ")}options;constructor(e){this.options=e}async sign(e){let t=this.options.privateKey;if(t.startsWith("file://")){const d=t.slice(7);t=await v(d,{encoding:"utf8"})}const r={...e.headers?L(e.headers):{},From:l.formatAddress(e.from),To:l.formatAddresses(e.to)};e.cc&&(r.Cc=l.formatAddresses(e.cc)),e.replyTo&&(r["Reply-To"]=l.formatAddress(e.replyTo)),r.Subject=e.subject,r["MIME-Version"]="1.0";const s=[];e.text&&s.push(e.text),e.html&&s.push(e.html);const o=s.join(`
15
-
16
- `),a=this.options.headerCanon??"simple",i=this.options.bodyCanon??"simple",c=_(r,a),h=S(o,i),g=f("sha256").update(h).digest("base64"),m=x(r,this.options,g),y=`${c}\r
17
- DKIM-Signature: ${m}`;let u;try{const d=w({key:t,passphrase:this.options.passphrase});u=I(y,d,this.options.algorithm)}catch(d){throw new Error(`Failed to create DKIM signature: ${d.message}`)}const A=u.match(/.{1,72}/g)?.join(`\r
18
- `)??u,b={...r,"DKIM-Signature":`${m}${A}`};return{...e,headers:b}}}const R=n=>new l(n);export{l as DkimSigner,R as createDkimSigner};
@@ -1,17 +0,0 @@
1
- import{createRequire as D}from"node:module";import{z as W}from"./index-B8wiKJdh.js";import{h as T}from"./headers-to-record-ZOZ7Dubo.js";import{f as y}from"./format-address-BDKhXcXV.js";let K;const L=e=>(K??=D(import.meta.url))(e),m=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,M=e=>{if(typeof m<"u"&&m.versions&&m.versions.node){const[s,t]=m.versions.node.split(".").map(Number);if(s>22||s===22&&t>=3||s===20&&t>=16)return m.getBuiltinModule(e)}return L(e)},{Buffer:j}=M("node:buffer"),{createPublicKey:V,createHash:b,createPrivateKey:P,sign:z,createSign:q,verify:C}=M("node:crypto"),x=/\s+/g,F=/ $/,G=/^\s*i=(\d+)\s*;/,U=["from","to","cc","subject","date","message-id","mime-version"],d=(e,s)=>`${e.toLowerCase()}:${s.replaceAll(x," ").trim()}`,J=e=>{let a=e.replaceAll(`\r
2
- `,`
3
- `).replaceAll("\r",`
4
- `).split(`
5
- `).map(n=>n.replaceAll(x," ").replace(F,"")).join(`\r
6
- `);for(;a.endsWith(`\r
7
- `);)a=a.slice(0,-2);return a.length>0?`${a}\r
8
- `:`\r
9
- `},E=e=>{const s={...e.headers?T(e.headers):{},From:y(e.from),Subject:e.subject,To:y(e.to)};return e.cc&&(s.Cc=y(e.cc)),s["MIME-Version"]??="1.0",s},_=e=>{const s={};for(const t of e.split(";")){const a=t.indexOf("=");a!==-1&&(s[t.slice(0,a).trim()]=t.slice(a+1).trim())}return s},H=e=>{const s=e.lastIndexOf("b=");return s===-1?e:e.slice(0,s+2)},N=e=>{const s=[e.text,e.html].filter(t=>t!==void 0).join(`
10
-
11
- `);return b("sha256").update(J(s)).digest("base64")},w=(e,s,t)=>t==="ed25519-sha256"?z(null,b("sha256").update(e).digest(),s).toString("base64"):q("RSA-SHA256").update(e).sign(s,"base64"),B=(e,s,t,a)=>{const n=j.from(s,"base64");try{return a==="ed25519-sha256"?C(null,b("sha256").update(e).digest(),t,n):C("RSA-SHA256",j.from(e),t,n)}catch{return!1}},Q=(e,s)=>{const t=s.instance??1,a=s.algorithm??"rsa-sha256",n=s.timestamp??Math.floor(Date.now()/1e3),r=E(e),i=(s.headersToSign??U).filter(g=>{const u=Object.keys(r).find(h=>h.toLowerCase()===g);return u!==void 0&&r[u]!==void 0&&r[u]!==""}),c=[`i=${String(t)}`,`a=${a}`,"c=relaxed/relaxed",`d=${s.domainName}`,`s=${s.keySelector}`,`t=${String(n)}`,`h=${i.join(":")}`,`bh=${N(e)}`,"b="].join("; "),l=`${i.map(g=>{const u=Object.keys(r).find(h=>h.toLowerCase()===g);return d(g,r[u]??"")}).join(`\r
12
- `)}\r
13
- ${d("ARC-Message-Signature",c)}`;return{header:c,signBase:l}},X=(e,s,t)=>{const a=t.instance??1,n=t.algorithm??"rsa-sha256",r=t.timestamp??Math.floor(Date.now()/1e3),i=t.cv??"none",c=[`i=${String(a)}`,`a=${n}`,`cv=${i}`,`d=${t.domainName}`,`s=${t.keySelector}`,`t=${String(r)}`,"b="].join("; "),o=[d("ARC-Authentication-Results",e),d("ARC-Message-Signature",s),d("ARC-Seal",c)].join(`\r
14
- `);return{header:c,signBase:o}},Y=async(e,s)=>{let t=e;return t.startsWith("file://")&&(t=await W(t.slice(7),{encoding:"utf8"})),P({key:t,passphrase:s})},re=async(e,s)=>{const t=s.instance??1,a=s.cv??"none";if(t!==1)throw new Error(`signArc only supports an originating sealer (instance 1); received i=${String(t)}`);if(a!=="none")throw new Error(`signArc only supports cv=none for an originating sealer; received cv=${a}`);const n=s.algorithm??"rsa-sha256",r={...s,cv:"none",timestamp:s.timestamp??Math.floor(Date.now()/1e3)},i=await Y(s.privateKey,s.passphrase),c=`i=${String(t)}; ${s.authenticationResults}`,o=Q(e,r),l=`${o.header}${w(o.signBase,i,n)}`,g=X(c,l,r),u=`${g.header}${w(g.signBase,i,n)}`,h={"ARC-Authentication-Results":c,"ARC-Message-Signature":l,"ARC-Seal":u};return{email:{...e,headers:{...e.headers?T(e.headers):{},...h}},headers:h}},ce=(e,s,t)=>{const a=Object.fromEntries(Object.entries(s).map(([f,p])=>[f.toLowerCase(),p])),n=a["arc-message-signature"],r=a["arc-seal"],i=a["arc-authentication-results"];if(!n||!r||!i)return{components:{ams:!1,bodyHash:!1,seal:!1},reason:"missing-arc-headers",valid:!1};let c;try{c=typeof t.publicKey=="string"?V(t.publicKey):t.publicKey}catch{return{components:{ams:!1,bodyHash:!1,seal:!1},reason:"invalid-public-key",valid:!1}}const o=_(n),l=_(r);if(G.exec(i)?.[1]!=="1"||o.i!=="1"||l.i!=="1"||l.cv!=="none")return{components:{ams:!1,bodyHash:!1,seal:!1},cv:l.cv,reason:"unsupported-arc-instance",valid:!1};const u=o.a==="ed25519-sha256"?"ed25519-sha256":"rsa-sha256",h=l.a==="ed25519-sha256"?"ed25519-sha256":"rsa-sha256",A=o.bh!==void 0&&o.bh===N(e),v=E(e),k=`${(o.h??"").split(":").map(f=>f.trim().toLowerCase()).filter(Boolean).map(f=>{const p=Object.keys(v).find(O=>O.toLowerCase()===f);return d(f,p?v[p]??"":"")}).join(`\r
15
- `)}\r
16
- ${d("ARC-Message-Signature",H(n))}`,S=B(k,o.b??"",c,u),I=[d("ARC-Authentication-Results",i),d("ARC-Message-Signature",n),d("ARC-Seal",H(r))].join(`\r
17
- `),$=B(I,l.b??"",c,h),R=S&&$&&A;return{components:{ams:S,bodyHash:A,seal:$},cv:l.cv,reason:R?void 0:"signature-mismatch",valid:R}};export{Q as arcMessageSignatureBase,X as arcSealBase,re as signArc,ce as verifyArc};
@@ -1,3 +0,0 @@
1
- import S from"./EmailError-BIaHK1Uw.js";import d from"../utils/format-email-address.js";import{g as y}from"./generate-boundary-BCSUEi6x.js";import{h as A}from"./headers-to-record-ZOZ7Dubo.js";import{e as M}from"./quoted-printable-BgiHOYdV.js";import{s as T,a as f}from"./sanitize-header-CW0f3IT7.js";const b=globalThis.Buffer!==void 0,$=e=>{if(typeof e=="string"){if(b)return Buffer.from(e,"utf8").toString("base64");const s=new TextEncoder().encode(e);let r="";const n=8192;for(let o=0;o<s.length;o+=n){const h=s.subarray(o,Math.min(o+n,s.length));r+=String.fromCharCode(...h)}return btoa(r)}if(b&&e instanceof Buffer)return e.toString("base64");const i=e instanceof Uint8Array?e:new Uint8Array(e);if(b)return Buffer.from(i).toString("base64");let u="";const a=8192;for(let t=0;t<i.length;t+=a){const s=i.subarray(t,Math.min(t+a,i.length));u+=String.fromCharCode(...s)}return btoa(u)},v=globalThis.Buffer!==void 0,z=/[^\u0000-\u007F]/,j=e=>!z.test(e),k=e=>{if(j(e))return e;const i=45,u=new TextDecoder,a=v?Buffer.from(e,"utf8"):new TextEncoder().encode(e),t=[];let s=0;for(;s<a.length;){let r=Math.min(s+i,a.length);if(r<a.length)for(;r>s&&(a[r]&192)===128;)r-=1;const n=a.subarray(s,r),o=u.decode(n);t.push(`=?UTF-8?B?${$(o)}?=`),s=r}return t.join(" ")},g=e=>Array.isArray(e)?e.map(i=>d(i)).join(", "):d(e),I=/[^ -~\r\n\t]/,C=e=>k(f(e)),N=globalThis.Buffer!==void 0,B=e=>e.replaceAll(/.{1,76}/g,`$&\r
2
- `).trimEnd(),O=async(e,i={})=>{const{includeBcc:u=!1}=i,a=y(),t=[`From: ${d(e.from)}`,`To: ${g(e.to)}`];if(e.cc&&t.push(`Cc: ${g(e.cc)}`),u&&e.bcc&&t.push(`Bcc: ${g(e.bcc)}`),e.replyTo&&t.push(`Reply-To: ${d(e.replyTo)}`),t.push(`Subject: ${C(e.subject)}`,"MIME-Version: 1.0"),e.headers){const r=A(e.headers);Object.entries(r).forEach(([n,o])=>{const h=T(n),m=f(o);t.push(`${h}: ${m}`)})}t.push(`Content-Type: multipart/mixed; boundary="${a}"`,"");const s=(r,n)=>I.test(n)?[`Content-Type: ${r}; charset=UTF-8`,"Content-Transfer-Encoding: quoted-printable","",M(n),""]:[`Content-Type: ${r}; charset=UTF-8`,"Content-Transfer-Encoding: 7bit","",n,""];if(e.text&&e.html){const r=y();t.push(`--${a}`,`Content-Type: multipart/alternative; boundary="${r}"`,"",`--${r}`,...s("text/plain",e.text),`--${r}`,...s("text/html",e.html),`--${r}--`,"")}else e.text?t.push(`--${a}`,...s("text/plain",e.text)):e.html&&t.push(`--${a}`,...s("text/html",e.html));if(e.attachments&&e.attachments.length>0){const r=await Promise.all(e.attachments.map(async n=>{let o;if(n.raw!==void 0)o=n.raw;else{if(n.content===void 0)throw new S("attachment",`Attachment '${n.filename}' must have content, raw, or be resolved from path/href before building MIME message`);o=n.content instanceof Promise?await n.content:n.content}return{...n,resolvedContent:o}}));for(const n of r){t.push(`--${a}`);const o=f(n.contentType??"application/octet-stream"),h=C(n.filename);t.push(`Content-Type: ${o}; name="${h}"`);const m=f(n.contentDisposition??"attachment");t.push(`Content-Disposition: ${m}; filename="${h}"`),n.cid&&t.push(`Content-ID: <${f(n.cid)}>`),n.headers&&Object.entries(n.headers).forEach(([p,E])=>{const w=T(p),x=f(E);t.push(`${w}: ${x}`)});const l=f(n.encoding??"base64");t.push(`Content-Transfer-Encoding: ${l}`,"");const c=n.resolvedContent;if(l==="base64")t.push(B($(c)));else if(l==="7bit"||l==="8bit")if(typeof c=="string")t.push(c);else if(N&&c instanceof Buffer)t.push(c.toString("utf8"));else{const p=new TextDecoder;t.push(p.decode(c))}else t.push(B($(c)));t.push("")}}return t.push(`--${a}--`),t.join(`\r
3
- `)};export{O as b};