{"version":3,"sources":["../../../src/providers/SendGridProvider.mts"],"sourcesContent":["import { prepareEmails } from \"../helper.mjs\";\nimport type { Mailable } from \"../Mailable.mjs\";\nimport type { MailerProvider } from \"../MailerProvider.mjs\";\n\n/**\n * Configuration options for the SendGridProvider.\n */\nexport type SendGridProviderConfig = {\n  /** SendGrid API key */\n  api_key: string;\n  /** Default sender email address */\n  default_from: string;\n};\n\n/**\n * Mailer provider that sends emails via SendGrid API.\n * Supports API key from configuration or SENDGRID_API_KEY environment variable.\n */\nexport class SendGridProvider implements MailerProvider {\n  private defaultFrom: string = \"\";\n  private apiKey: string;\n\n  /**\n   * Creates a new SendGridProvider instance.\n   * @param options - Provider configuration options\n   */\n  constructor(options: Partial<SendGridProviderConfig> = {}) {\n    this.apiKey = options.api_key || process.env.SENDGRID_API_KEY || \"\";\n    this.defaultFrom = options.default_from || \"\";\n  }\n\n  /**\n   * Sets the default sender email address.\n   * @param from - The default sender email address\n   */\n  setDefaultFrom(from: string): void {\n    this.defaultFrom = from;\n  }\n\n  /**\n   * Maps email addresses to SendGrid email objects.\n   * @param emails - Array of email addresses\n   * @param required - Whether the field is required\n   * @returns Array of email objects or undefined if not required and empty\n   */\n  private mapToEmailObjects(\n    emails: string[],\n    required: boolean = false,\n  ): { email: string }[] | undefined {\n    if (emails.length === 0 && !required) {\n      return undefined;\n    }\n    return emails.map((email) => ({ email }));\n  }\n\n  /**\n   * Sends an email via SendGrid API.\n   * @param mail - The email message to send\n   * @throws Error if the SendGrid API request fails\n   */\n  async sendMail(mail: Mailable): Promise<void> {\n    const msg = {\n      from: mail.from || this.defaultFrom,\n      to: prepareEmails(mail.to),\n      cc: prepareEmails(mail.cc),\n      bcc: prepareEmails(mail.bcc),\n      subject: mail.subject,\n      text: await mail.getTextContent(),\n      html: await mail.getHtmlContent(),\n    };\n\n    const response = await fetch(\"https://api.sendgrid.com/v3/mail/send\", {\n      method: \"POST\",\n      headers: {\n        Authorization: `Bearer ${this.apiKey}`,\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify({\n        personalizations: [\n          {\n            to: this.mapToEmailObjects(msg.to, true),\n            cc: this.mapToEmailObjects(msg.cc),\n            bcc: this.mapToEmailObjects(msg.bcc),\n            subject: msg.subject,\n          },\n        ],\n        from: { email: msg.from },\n        content: [\n          {\n            type: \"text/plain\",\n            value: msg.text,\n          },\n          {\n            type: \"text/html\",\n            value: msg.html,\n          },\n        ],\n      }),\n    });\n\n    if (!response.ok) {\n      throw new Error(\n        `SendGrid API error: ${response.status} ${response.statusText}`,\n      );\n    }\n  }\n}\n"],"mappings":";;AAAA,SAAS,qBAAqB;AAkBvB,MAAM,iBAA2C;AAAA,EAlBxD,OAkBwD;AAAA;AAAA;AAAA,EAC9C,cAAsB;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,YAAY,UAA2C,CAAC,GAAG;AACzD,SAAK,SAAS,QAAQ,WAAW,QAAQ,IAAI,oBAAoB;AACjE,SAAK,cAAc,QAAQ,gBAAgB;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,MAAoB;AACjC,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,kBACN,QACA,WAAoB,OACa;AACjC,QAAI,OAAO,WAAW,KAAK,CAAC,UAAU;AACpC,aAAO;AAAA,IACT;AACA,WAAO,OAAO,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAS,MAA+B;AAC5C,UAAM,MAAM;AAAA,MACV,MAAM,KAAK,QAAQ,KAAK;AAAA,MACxB,IAAI,cAAc,KAAK,EAAE;AAAA,MACzB,IAAI,cAAc,KAAK,EAAE;AAAA,MACzB,KAAK,cAAc,KAAK,GAAG;AAAA,MAC3B,SAAS,KAAK;AAAA,MACd,MAAM,MAAM,KAAK,eAAe;AAAA,MAChC,MAAM,MAAM,KAAK,eAAe;AAAA,IAClC;AAEA,UAAM,WAAW,MAAM,MAAM,yCAAyC;AAAA,MACpE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,KAAK,MAAM;AAAA,QACpC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,kBAAkB;AAAA,UAChB;AAAA,YACE,IAAI,KAAK,kBAAkB,IAAI,IAAI,IAAI;AAAA,YACvC,IAAI,KAAK,kBAAkB,IAAI,EAAE;AAAA,YACjC,KAAK,KAAK,kBAAkB,IAAI,GAAG;AAAA,YACnC,SAAS,IAAI;AAAA,UACf;AAAA,QACF;AAAA,QACA,MAAM,EAAE,OAAO,IAAI,KAAK;AAAA,QACxB,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,OAAO,IAAI;AAAA,UACb;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,OAAO,IAAI;AAAA,UACb;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,uBAAuB,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AACF;","names":[]}