@igniter-js/mail 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors/igniter-mail.error.ts","../src/adapters/postmark.adapter.ts","../src/adapters/resend.adapter.ts","../src/adapters/sendgrid.adapter.ts","../src/adapters/smtp.adapter.ts","../src/adapters/test.adapter.ts","../src/adapters/webhook.adapter.ts","../src/builders/igniter-mail.builder.ts","../src/builders/mail-template.builder.ts","../src/utils/validate-standard-schema-input.ts","../src/core/igniter-mail.tsx","../src/types/provider.ts","../src/utils/get-adapter.ts"],"names":["render"],"mappings":";;;;;;;AA4CO,IAAM,gBAAA,GAAN,MAAM,iBAAA,SAAyB,YAAA,CAAa;AAAA,EAGjD,YAAY,OAAA,EAAkC;AAC5C,IAAA,KAAA,CAAM;AAAA,MACJ,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,MAAA,EAAQ,kBAAA;AAAA,MACR,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAED,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAG,KAAA,EAA2C;AACnD,IAAA,OAAO,KAAA,YAAiB,iBAAA;AAAA,EAC1B;AACF;;;ACxDO,IAAM,0BAAA,GAAN,MAAM,2BAAA,CAA2B;AAAA;AAAA,EAKtC,OAAO,MAAA,GAAS;AACd,IAAA,OAAO,IAAI,2BAAA,EAA2B;AAAA,EACxC;AAAA;AAAA,EAGA,WAAW,MAAA,EAAgB;AACzB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,IAAA,EAAc;AACrB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAA,GAAqB;AACnB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,oCAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,oCAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,IAAA,OAAO;AAAA;AAAA,MAEL,MAAM,OAAO,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,MAAK,KAAM;AAC3C,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,mCAAA,EAAqC;AAAA,UAChE,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,MAAA,EAAQ,kBAAA;AAAA,YACR,cAAA,EAAgB,kBAAA;AAAA,YAChB,yBAAA,EAA2B;AAAA,WAC7B;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,IAAA,EAAM,IAAA;AAAA,YACN,EAAA,EAAI,EAAA;AAAA,YACJ,OAAA,EAAS,OAAA;AAAA,YACT,QAAA,EAAU,IAAA;AAAA,YACV,QAAA,EAAU;AAAA,WACX;AAAA,SACF,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,OAAO,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAEjD,UAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,YACzB,IAAA,EAAM,2BAAA;AAAA,YACN,OAAA,EAAS,sBAAA;AAAA,YACT,QAAA,EAAU;AAAA,cACR,QAAQ,QAAA,CAAS,MAAA;AAAA,cACjB;AAAA;AACF,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,KACF;AAAA,EACF;AACF;AAKO,IAAM,eAAA,GAAkB,CAAC,OAAA,KAC9B,0BAAA,CAA2B,QAAO,CAC/B,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA,CACzB,QAAA,CAAS,OAAA,CAAQ,IAAI,EACrB,KAAA;ACxFE,IAAM,wBAAA,GAAN,MAAM,yBAAA,CAAyB;AAAA;AAAA,EAKpC,OAAO,MAAA,GAAS;AACd,IAAA,OAAO,IAAI,yBAAA,EAAyB;AAAA,EACtC;AAAA;AAAA,EAGA,WAAW,MAAA,EAAgB;AACzB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,IAAA,EAAc;AACrB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAA,GAAqB;AACnB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,oCAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,oCAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AACrC,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAML,IAAA,EAAM,OAAO,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,IAAA,EAAM,aAAY,KAAM;AACxD,QAAA,MAAM,MAAA,CAAO,OAAO,MAAA,CAAO;AAAA,UACzB,EAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA;AAAA,UACA,WAAA,EAAa,aAAa,WAAA;AAAY,SACvC,CAAA;AAAA,MACH;AAAA,KACF;AAAA,EACF;AACF;AAKO,IAAM,aAAA,GAAgB,CAAC,OAAA,KAC5B,wBAAA,CAAyB,QAAO,CAC7B,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA,CACzB,QAAA,CAAS,OAAA,CAAQ,IAAI,EACrB,KAAA;;;AC9DE,IAAM,0BAAA,GAAN,MAAM,2BAAA,CAA2B;AAAA;AAAA,EAKtC,OAAO,MAAA,GAAS;AACd,IAAA,OAAO,IAAI,2BAAA,EAA2B;AAAA,EACxC;AAAA;AAAA,EAGA,WAAW,MAAA,EAAgB;AACzB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,IAAA,EAAc;AACrB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAA,GAAqB;AACnB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,oCAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,oCAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,IAAA,OAAO;AAAA;AAAA,MAEL,MAAM,OAAO,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,MAAK,KAAM;AAC3C,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,uCAAA,EAAyC;AAAA,UACpE,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,aAAA,EAAe,UAAU,MAAM,CAAA,CAAA;AAAA,YAC/B,cAAA,EAAgB;AAAA,WAClB;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,kBAAkB,CAAC;AAAA,cACjB,EAAA,EAAI,CAAC,EAAE,KAAA,EAAO,IAAI;AAAA,aACnB,CAAA;AAAA,YACD,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,YACpB,OAAA;AAAA,YACA,OAAA,EAAS;AAAA,cACP,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,IAAA,EAAK;AAAA,cAClC,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,IAAA;AAAK;AACnC,WACD;AAAA,SACF,CAAA;AAGD,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,OAAO,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAEjD,UAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,YACzB,IAAA,EAAM,2BAAA;AAAA,YACN,OAAA,EAAS,sBAAA;AAAA,YACT,QAAA,EAAU;AAAA,cACR,QAAQ,QAAA,CAAS,MAAA;AAAA,cACjB;AAAA;AACF,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,KACF;AAAA,EACF;AACF;AAKO,IAAM,eAAA,GAAkB,CAAC,OAAA,KAC9B,0BAAA,CAA2B,QAAO,CAC/B,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA,CACzB,QAAA,CAAS,OAAA,CAAQ,IAAI,EACrB,KAAA;AC5FE,IAAM,sBAAA,GAAN,MAAM,uBAAA,CAAuB;AAAA;AAAA,EAKlC,OAAO,MAAA,GAAS;AACd,IAAA,OAAO,IAAI,uBAAA,EAAuB;AAAA,EACpC;AAAA;AAAA,EAGA,WAAW,MAAA,EAAgB;AACzB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,IAAA,EAAc;AACrB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAA,GAAqB;AACnB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,oCAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,oCAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,UAAU,IAAA,CAAK,MAAA;AACrB,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,IAAA,MAAM,oBAAoB,MAAM;AAC9B,MAAA,OAAO,UAAA,CAAW,gBAAgB,OAAA,EAAS;AAAA,QACzC,GAAA,EAAK;AAAA,UACH,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA,iBAAA,EAAmB,GAAA;AAAA,QACnB,eAAA,EAAiB,GAAA;AAAA,QACjB,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,MAAM,OAAO,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,MAAK,KAAM;AAC3C,QAAA,MAAM,YAAY,iBAAA,EAAkB;AACpC,QAAA,MAAM,WAAA,GAAc;AAAA,UAClB,IAAA;AAAA,UACA,EAAA;AAAA,UACA,OAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,CAAU,SAAS,WAAW,CAAA;AACpC,UAAA,SAAA,CAAU,KAAA,EAAM;AAAA,QAClB,SAAS,KAAA,EAAO;AACd,UAAA,SAAA,CAAU,KAAA,EAAM;AAChB,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,KACF;AAAA,EACF;AACF;AAKO,IAAM,WAAA,GAAc,CAAC,OAAA,KAC1B,sBAAA,CAAuB,QAAO,CAC3B,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA,CACzB,QAAA,CAAS,OAAA,CAAQ,IAAI,EACrB,KAAA;;;AChDE,SAAS,qBAAA,CACd,OAAA,GAAwC,EAAC,EACxB;AACjB,EAAA,MAAM,OAA0B,EAAC;AACjC,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,OAAA;AACjC,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,KAAA;AAEjC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,IAAA,EAAM,MAAM,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA;AAAA,IACtB,IAAA,EAAM,OAAO,MAAA,KAAW;AACtB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,GAAG,MAAA,EAAQ,oBAAI,IAAI,IAAA,IAAQ,CAAA;AAEvC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,CAAA,qBAAA,EAAwB,MAAA,CAAO,EAAE,CAAA,SAAA,EAAY,MAAA,CAAO,OAAO,CAAA,MAAA,EAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,MAAM,CAAA,CAAA;AAAA,SACpH;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;;;ACjDO,IAAM,yBAAA,GAAN,MAAM,0BAAA,CAA0B;AAAA;AAAA,EAKrC,OAAO,MAAA,GAAS;AACd,IAAA,OAAO,IAAI,0BAAA,EAA0B;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,GAAA,EAAa;AACnB,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,IAAA,EAAc;AACrB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAA,GAAqB;AACnB,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,oCAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,oCAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,IAAA,OAAO;AAAA;AAAA,MAEL,IAAA,EAAM,OAAO,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,IAAA,EAAM,aAAY,KAAM;AACxD,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,UAChC,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB;AAAA,WAClB;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,EAAA;AAAA,YACA,IAAA;AAAA,YACA,OAAA;AAAA,YACA,IAAA;AAAA,YACA,IAAA;AAAA,YACA,WAAA,EAAa,aAAa,WAAA;AAAY,WACvC;AAAA,SACF,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,OAAO,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAEjD,UAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,YACzB,IAAA,EAAM,2BAAA;AAAA,YACN,OAAA,EAAS,qBAAA;AAAA,YACT,QAAA,EAAU;AAAA,cACR,QAAQ,QAAA,CAAS,MAAA;AAAA,cACjB;AAAA;AACF,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,KACF;AAAA,EACF;AACF;AAKO,IAAM,cAAA,GAAiB,CAAC,OAAA,KAC7B,yBAAA,CAA0B,QAAO,CAC9B,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,CACtB,QAAA,CAAS,OAAA,CAAQ,IAAI,EACrB,KAAA;;;AC5EE,IAAM,kBAAA,GAAN,MAAM,mBAAA,CAEX;AAAA,EAoCQ,YACN,OAAA,EAGA;AAlCF,IAAA,IAAA,CAAQ,YAAsD,EAAC;AAmC7D,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OACL,OAAA,EACA;AACA,IAAA,OAAO,IAAI,oBAAyC,OAAc,CAAA;AAAA,EACpE;AAAA;AAAA,EAGA,SAAS,IAAA,EAAc;AACrB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,WAAW,MAAA,EAAuB;AAChC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,CACE,SACA,OAAA,EACA;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,OAAA,EAAS,OAAA,EAAQ;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAUA,WAAA,CAAY,mBAAyC,MAAA,EAAiB;AACpE,IAAA,IAAI,OAAO,sBAAsB,QAAA,EAAU;AACzC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,UACzB,IAAA,EAAM,uCAAA;AAAA,UACN,OAAA,EAAS,uCAAA;AAAA,UACT,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AAAA,MACH;AAEA,MAAA,IAAA,CAAK,OAAA,GAAU;AAAA,QACb,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU,iBAAA;AAAA,QACV;AAAA,OACF;AAEA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CACE,KACA,QAAA,EACA;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,GAAI,QAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EAGT;AAAA;AAAA,EAGA,kBACE,aAAA,EAMA;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,gBACE,WAAA,EAOA;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,kBACE,aAAA,EAMA;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAkC;AAChC,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,6BAAA;AAAA,QACN,OAAA,EAAS,6BAAA;AAAA,QACT,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,gCAAA;AAAA,QACN,OAAA,EAAS,gCAAA;AAAA,QACT,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,eAAA,GACJ,KAAK,OAAA,CAAQ,IAAA,KAAS,YAClB,IAAA,CAAK,OAAA,CAAQ,WACZ,MAAM;AACL,MAAA,QAAQ,IAAA,CAAK,QAAQ,QAAA;AAAU,QAC7B,KAAK,QAAA;AACH,UAAA,OAAO,wBAAA,CAAyB,MAAA,EAAO,CACpC,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,CAC9B,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,CAClB,KAAA,EAAM;AAAA,QAEX,KAAK,MAAA;AACH,UAAA,OAAO,sBAAA,CAAuB,MAAA,EAAO,CAClC,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,CAC9B,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,CAClB,KAAA,EAAM;AAAA,QAEX,KAAK,UAAA;AACH,UAAA,OAAO,0BAAA,CAA2B,MAAA,EAAO,CACtC,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,CAC9B,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,CAClB,KAAA,EAAM;AAAA,QAEX,KAAK,UAAA;AACH,UAAA,OAAO,0BAAA,CAA2B,MAAA,EAAO,CACtC,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,CAC9B,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,CAClB,KAAA,EAAM;AAAA,QAEX,KAAK,SAAA;AACH,UAAA,OAAO,yBAAA,CAA0B,MAAA,EAAO,CACrC,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,CAC3B,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,CAClB,KAAA,EAAM;AAAA,QAEX;AACE,UAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,YACzB,IAAA,EAAM,iCAAA;AAAA,YACN,OAAA,EAAS,CAAA,iCAAA,EAAoC,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAAA,YAClE,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,QAAA,EAAU;AAAA,cACR,QAAA,EAAU,KAAK,OAAA,CAAQ;AAAA;AACzB,WACD,CAAA;AAAA;AACL,IACF,CAAA,GAAG;AAET,IAAA,OAAO,KAAK,OAAA,CAAQ;AAAA,MAClB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAA,EAAS,eAAA;AAAA,MACT,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAA,EAAO,KAAK,KAAA,GACR;AAAA,QACE,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,QACpB,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,SAAA,IAAa,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,IAAA,IAAQ,MAAM,CAAA,CAAA;AAAA,QACpF,OAAA,EAAS,KAAK,KAAA,CAAM;AAAA,OACtB,GACA;AAAA,KACL,CAAA;AAAA,EACH;AACF;;;AC7QO,IAAM,mBAAA,GAAN,MAAM,oBAAA,CAAyE;AAAA;AAAA,EAMpF,OAAO,MAAA,GAAS;AACd,IAAA,OAAO,IAAI,oBAAA,EAAyB;AAAA,EACtC;AAAA;AAAA,EAGA,YAAY,OAAA,EAAiB;AAC3B,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,WAAiD,MAAA,EAAqB;AACpE,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,WACEA,OAAAA,EAGA;AACA,IAAA,IAAA,CAAK,MAAA,GAASA,OAAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAA,GAAsC;AACpC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,qCAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,qCAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,qCAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AACF;;;AC7DA,eAAsB,2BAAA,CACpB,QACA,KAAA,EAC+C;AAC/C,EAAA,MAAM,QAAA,GAAY,SAAiB,WAAW,CAAA;AAQ9C,EAAA,IAAI,CAAC,UAAU,QAAA,EAAU;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA;AAE5C,EAAA,IAAK,MAAA,EAAgB,QAAQ,MAAA,EAAQ;AACnC,IAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,MACzB,IAAA,EAAM,qCAAA;AAAA,MACN,OAAA,EAAS,+BAAA;AAAA,MACT,UAAA,EAAY,GAAA;AAAA,MACZ,SAAU,MAAA,CAAe;AAAA,KAC1B,CAAA;AAAA,EACH;AAEA,EAAA,OAAS,QAAgB,KAAA,IAAS,KAAA;AACpC;;;ACVO,IAAM,YAAA,GAAN,MAAM,YAAA,CAEb;AAAA,EAqBE,YAAY,OAAA,EAAyC;AAdrD,IAAA,IAAA,CAAQ,kBAAA,GAAqB,KAAA;AAW7B;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAgB,MAAA,GACd,MAAA;AAGA,IAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,QAAQ,KAAA,EAAO,GAAG,MAAK,GAAI,OAAA;AAEvD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,gCAAA;AAAA,QACN,OAAA,EAAS,gCAAA;AAAA,QACT;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,kCAAA;AAAA,QACN,OAAA,EAAS,kCAAA;AAAA,QACT;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA,EAEA,MAAc,wBAAA,GAA0C;AACtD,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAE7B,IAAA,IAAI,KAAK,mBAAA,EAAqB;AAC5B,MAAA,MAAM,IAAA,CAAK,mBAAA;AACX,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,uBAAuB,YAAY;AACtC,MAAA,MAAM,eAAe,KAAA,CAAM,OAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,cAAc,IAAA,IAAQ,MAAA;AAEnC,MAAA,MAAM,iBAAA,GAAoB;AAAA,QACxB,WAAA,EAAa;AAAA,UACX,MAAA,EAAQ,kBAAA;AAAA,UACR,OAAA,EAAS,CAAA;AAAA,UACT,QAAA,EAAU,OAAO,KAAA,MAAoB,EAAE,KAAA,EAAM;AAAA;AAC/C,OACF;AAEA,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS;AAAA,QACxC,IAAA;AAAA,QACA,KAAA,EAAO,iBAAA;AAAA,QACP,OAAA,EAAS,OAAO,EAAE,KAAA,EAAM,KAAM;AAC5B,UAAA,MAAM,IAAA,CAAK,KAAK,KAAY,CAAA;AAAA,QAC9B,CAAA;AAAA,QACA,OAAO,YAAA,EAAc,KAAA;AAAA,QACrB,UAAU,YAAA,EAAc,QAAA;AAAA,QACxB,UAAU,YAAA,EAAc,QAAA;AAAA,QACxB,kBAAkB,YAAA,EAAc,gBAAA;AAAA,QAChC,cAAc,YAAA,EAAc,YAAA;AAAA,QAC5B,UAAU,YAAA,EAAc,QAAA;AAAA,QACxB,SAAS,YAAA,EAAc;AAAA,OACxB,CAAA;AAED,MAAA,MAAM,KAAA,CAAM,QAAQ,YAAA,CAAa;AAAA,QAC/B,CAAC,KAAA,CAAM,EAAE,GAAG;AAAA,OACb,CAAA;AAED,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC5B,CAAA,GAAG;AAEH,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,mBAAA;AAAA,IACb,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,mBAAA,GAAsB,MAAA;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,MAAc,oBAAA,CAGZ,QAAA,EACA,IAAA,EACyC;AACzC,IAAA,IAAI;AACF,MAAA,OAAQ,MAAM,2BAAA;AAAA,QACZ,QAAA,CAAS,MAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,kBAAkB,gBAAA,CAAiB,EAAA,CAAG,KAAK,CAAA,GAC7C,KAAA,GACA,IAAI,gBAAA,CAAiB;AAAA,QACnB,IAAA,EAAM,qCAAA;AAAA,QACN,OAAA,EAAS,qCAAA;AAAA,QACT,KAAA,EAAO,KAAA;AAAA,QACP,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,UAAU,EAAE,OAAA,EAAS,MAAA,CAAQ,QAAA,CAAiB,OAAO,CAAA;AAAE,OACxD,CAAA;AAEL,MAAA,MAAM,eAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KACJ,MAAA,EACe;AACf,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,0BAAA,EAA4B;AAAA,QAC7C,IAAI,MAAA,CAAO,EAAA;AAAA,QACX,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,QAAQ;AAAA,OACjC,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAE/B,MAAA,MAAM,QAAA,GAAY,IAAA,CAAK,SAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA;AAIxD,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,UACzB,IAAA,EAAM,kCAAA;AAAA,UACN,OAAA,EAAS,kCAAA;AAAA,UACT,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,QAAA,EAAU;AAAA,YACR,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,QAAQ;AAAA;AAClC,SACD,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,oBAAA;AAAA,QAC/B,QAAA;AAAA,QACA,MAAA,CAAO;AAAA,OACT;AACA,MAAA,MAAM,eAAe,QAAA,CAAS,MAAA;AAE9B,MAAA,MAAM,OAAO,MAAM,MAAA,qCAAQ,YAAA,EAAA,EAAc,GAAI,eAAuB,CAAE,CAAA;AACtE,MAAA,MAAM,OAAO,MAAM,MAAA,qCAAQ,YAAA,EAAA,EAAc,GAAI,eAAuB,CAAA,EAAI;AAAA,QACtE,SAAA,EAAW;AAAA,OACZ,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,QAAQ,IAAA,CAAK;AAAA,QACtB,IAAI,MAAA,CAAO,EAAA;AAAA,QACX,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,QAAA,CAAS,OAAA;AAAA,QACpC,IAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAE/B,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,0BAAA,EAA4B;AAAA,QAC5C,IAAI,MAAA,CAAO,EAAA;AAAA,QACX,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,QAAQ;AAAA,OACjC,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,kBAAkB,gBAAA,CAAiB,EAAA,CAAG,KAAK,CAAA,GAC7C,KAAA,GACA,IAAI,gBAAA,CAAiB;AAAA,QACnB,IAAA,EAAM,2BAAA;AAAA,QACN,OAAA,EAAS,2BAAA;AAAA,QACT,KAAA,EAAO,KAAA;AAAA,QACP,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,QAAA,EAAU;AAAA,UACR,IAAI,MAAA,CAAO,EAAA;AAAA,UACX,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,QAAQ;AAAA;AAClC,OACD,CAAA;AAEL,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,yBAAA,EAA2B,eAAe,CAAA;AAE7D,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,eAAe,CAAA;AAC9C,MAAA,MAAM,eAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QAAA,CACJ,MAAA,EACA,IAAA,EACe;AACf,IAAA,IAAI,IAAA,CAAK,OAAA,EAAQ,IAAK,IAAA,CAAK,KAAI,EAAG;AAChC,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,qCAAA;AAAA,QACN,OAAA,EAAS,qCAAA;AAAA,QACT,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,wBAAA,EAAyB;AACpC,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,OAAA,EAAQ,GAAI,IAAA,CAAK,GAAA,EAAK,CAAA;AAErD,QAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,+BAAA,EAAiC;AAAA,UACjD,EAAA,EAAI,KAAK,KAAA,CAAM,EAAA;AAAA,UACf,IAAI,MAAA,CAAO,EAAA;AAAA,UACX,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AAAA,UAChC;AAAA,SACD,CAAA;AAED,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO;AAAA,UAC9B,EAAA,EAAI,KAAK,KAAA,CAAM,EAAA;AAAA,UACf,KAAA,EAAO,MAAA;AAAA,UACP;AAAA,SACD,CAAA;AAED,QAAA;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,kBAAkB,gBAAA,CAAiB,EAAA,CAAG,KAAK,CAAA,GAC7C,KAAA,GACA,IAAI,gBAAA,CAAiB;AAAA,UACnB,IAAA,EAAM,+BAAA;AAAA,UACN,OAAA,EAAS,+BAAA;AAAA,UACT,KAAA,EAAO,KAAA;AAAA,UACP,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,QAAA,EAAU;AAAA,YACR,IAAI,MAAA,CAAO,EAAA;AAAA,YACX,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AAAA,YAChC,IAAA,EAAM,KAAK,WAAA;AAAY;AACzB,SACD,CAAA;AAEL,QAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,6BAAA,EAA+B,eAAe,CAAA;AACjE,QAAA,MAAM,eAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,EAAQ,GAAI,KAAK,GAAA,EAAI;AAC1C,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AACjC,QAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AAAA,MACxD,CAAC,CAAA;AAAA,IACH,GAAG,OAAO,CAAA;AAAA,EACZ;AAAA,EAEA,MAAc,cACZ,MAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,GAAgB,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAc,WAAA,CACZ,MAAA,EACA,KAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,GAAc,MAAA,EAAQ,KAAK,CAAA;AAAA,EAChD;AAAA,EAEA,MAAc,cACZ,MAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,GAAgB,MAAM,CAAA;AAAA,EAC3C;AAmDF,CAAA;AAAA;AA7Ua,YAAA,CA6RJ,OAAA,GAAU,CAAY,OAAA,KAC3B,OAAA;AAAA;AA9RS,YAAA,CAiSJ,QAAA,GAAW,CAChB,QAAA,KACG,QAAA;AAAA;AAAA;AAAA;AAnSM,YAAA,CAwSJ,MAAA,GAAS,MACd,kBAAA,CAAmB,MAAA,CAAO,CAAC,OAAA,KAAY,IAAI,YAAA,CAAiB,OAAO,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzS3D,YAAA,CAgTJ,UAAA,GAAa,CAClB,OAAA,KAGG;AACH,EAAA,IAAI,aAAY,QAAA,EAAU;AACxB,IAAA,OAAO,YAAA,CAAY,QAAA;AAAA,EACrB;AAEA,EAAA,MAAM,UAAW,OAAA,CAAgB,OAAA;AAEjC,EAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,IAAA,MAAM,aAAA,GAAgB,OAAA;AACtB,IAAA,YAAA,CAAY,QAAA,GAAW,IAAI,YAAA,CAA6B;AAAA,MACtD,MAAM,aAAA,CAAc,IAAA;AAAA,MACpB,WAAW,aAAA,CAAc,SAAA;AAAA,MACzB,OAAA,EAAS,aAAA,CAAc,OAAA,CAAQ,aAAa,CAAA;AAAA,MAC5C,eAAe,aAAA,CAAc,aAAA;AAAA,MAC7B,aAAa,aAAA,CAAc,WAAA;AAAA,MAC3B,eAAe,aAAA,CAAc;AAAA,KAC9B,CAAA;AACD,IAAA,OAAO,YAAA,CAAY,QAAA;AAAA,EACrB;AAEA,EAAA,YAAA,CAAY,WAAW,IAAI,YAAA;AAAA,IACzB;AAAA,GACF;AACA,EAAA,OAAO,YAAA,CAAY,QAAA;AACrB,CAAA;AA5UK,IAAM,WAAA,GAAN;;;ACkJA,SAAS,uBAAA,GAA4C;AAC1D,EAAA,OAAO;AAAA,IACL,WAAA,EAAa;AAAA,MACX,MAAA,EAAQ,kBAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,QAAA,EAAU,OAAO,KAAA,MAAoB,EAAE,KAAA,EAAM;AAAA;AAC/C,GACF;AACF;;;AC1KO,IAAM,UAAA,GAAa,CAAC,OAAA,KAAoB;AAC7C,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,QAAA;AACH,MAAA,OAAO,aAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,WAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,eAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,eAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT;AACE,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,iCAAA;AAAA,QACN,OAAA,EAAS,oCAAoC,OAAO,CAAA,CAAA;AAAA,QACpD,QAAA,EAAU,EAAE,OAAA;AAAQ,OACrB,CAAA;AAAA;AAEP","file":"index.mjs","sourcesContent":["import { IgniterError, type IgniterLogger } from '@igniter-js/core'\n\n/**\n * Known error codes thrown by `@igniter-js/mail` runtime.\n */\nexport type IgniterMailErrorCode =\n | 'MAIL_PROVIDER_FROM_REQUIRED'\n | 'MAIL_PROVIDER_ADAPTER_REQUIRED'\n | 'MAIL_PROVIDER_ADAPTER_SECRET_REQUIRED'\n | 'MAIL_PROVIDER_ADAPTER_NOT_FOUND'\n | 'MAIL_PROVIDER_TEMPLATES_REQUIRED'\n | 'MAIL_PROVIDER_TEMPLATE_NOT_FOUND'\n | 'MAIL_PROVIDER_TEMPLATE_DATA_INVALID'\n | 'MAIL_PROVIDER_SCHEDULE_DATE_INVALID'\n | 'MAIL_PROVIDER_SEND_FAILED'\n | 'MAIL_PROVIDER_SCHEDULE_FAILED'\n | 'MAIL_ADAPTER_CONFIGURATION_INVALID'\n | 'MAIL_TEMPLATE_CONFIGURATION_INVALID'\n\n/**\n * Payload used to create an {@link IgniterMailError}.\n */\nexport type IgniterMailErrorPayload = {\n /** Machine-readable error code. */\n code: IgniterMailErrorCode\n /** Human-readable message. */\n message: string\n /** Optional HTTP status code when surfacing errors through HTTP boundaries. */\n statusCode?: number\n /** Optional original cause. */\n cause?: unknown\n /** Extra diagnostic details (e.g. schema issues). */\n details?: unknown\n /** Arbitrary metadata for debugging. */\n metadata?: Record<string, unknown>\n /** Optional logger used by IgniterError. */\n logger?: IgniterLogger\n}\n\n/**\n * Typed error used by the `IgniterMail` runtime.\n *\n * This is designed to be stable for extraction into `@igniter-js/mail`.\n */\nexport class IgniterMailError extends IgniterError {\n declare readonly code: IgniterMailErrorCode\n\n constructor(payload: IgniterMailErrorPayload) {\n super({\n code: payload.code,\n message: payload.message,\n statusCode: payload.statusCode,\n causer: '@igniter-js/mail',\n details: payload.details,\n metadata: payload.metadata,\n logger: payload.logger,\n })\n\n this.name = 'IgniterMailError'\n }\n\n /**\n * Type guard utility.\n */\n static is(error: unknown): error is IgniterMailError {\n return error instanceof IgniterMailError\n }\n}\n\n","import { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { MailAdapter } from '../types/adapter'\nimport type { LegacyIgniterMailOptions } from '../types/provider'\n\n/**\n * Postmark adapter builder.\n *\n * Notes:\n * - This implementation uses `fetch` (no SDK dependency).\n * - Designed to be extracted to `@igniter-js/mail/adapters/postmark`.\n */\nexport class PostmarkMailAdapterBuilder {\n private secret?: string\n private from?: string\n\n /** Creates a new builder instance. */\n static create() {\n return new PostmarkMailAdapterBuilder()\n }\n\n /** Sets the Postmark Server Token. */\n withSecret(secret: string) {\n this.secret = secret\n return this\n }\n\n /** Sets the default FROM address used when sending emails via Postmark. */\n withFrom(from: string) {\n this.from = from\n return this\n }\n\n /** Builds the adapter instance. */\n build(): MailAdapter {\n if (!this.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Postmark adapter secret is required',\n })\n }\n\n if (!this.from) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Postmark adapter from is required',\n })\n }\n\n const token = this.secret\n const from = this.from\n\n return {\n /** Sends an email using Postmark (HTTP API). */\n send: async ({ to, subject, html, text }) => {\n const response = await fetch('https://api.postmarkapp.com/email', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'X-Postmark-Server-Token': token,\n },\n body: JSON.stringify({\n From: from,\n To: to,\n Subject: subject,\n HtmlBody: html,\n TextBody: text,\n }),\n })\n\n if (!response.ok) {\n const body = await response.text().catch(() => '')\n\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_SEND_FAILED',\n message: 'Postmark send failed',\n metadata: {\n status: response.status,\n body,\n },\n })\n }\n },\n }\n }\n}\n\n/**\n * Legacy adapter factory.\n */\nexport const postmarkAdapter = (options: LegacyIgniterMailOptions) =>\n PostmarkMailAdapterBuilder.create()\n .withSecret(options.secret)\n .withFrom(options.from)\n .build()\n","import { Resend } from 'resend'\n\nimport { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { MailAdapter } from '../types/adapter'\nimport type { LegacyIgniterMailOptions } from '../types/provider'\n\nexport class ResendMailAdapterBuilder {\n private secret?: string\n private from?: string\n\n /** Creates a new builder instance. */\n static create() {\n return new ResendMailAdapterBuilder()\n }\n\n /** Sets the Resend API key. */\n withSecret(secret: string) {\n this.secret = secret\n return this\n }\n\n /** Sets the default FROM address used when sending emails via Resend. */\n withFrom(from: string) {\n this.from = from\n return this\n }\n\n /** Builds the adapter instance. */\n build(): MailAdapter {\n if (!this.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Resend adapter secret is required',\n })\n }\n\n if (!this.from) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Resend adapter from is required',\n })\n }\n\n const resend = new Resend(this.secret)\n const from = this.from\n\n return {\n /**\n * Sends an email using Resend.\n *\n * Note: Resend accepts `scheduledAt` as an ISO string.\n */\n send: async ({ to, subject, html, text, scheduledAt }) => {\n await resend.emails.create({\n to,\n from,\n subject,\n html,\n text,\n scheduledAt: scheduledAt?.toISOString(),\n })\n },\n }\n }\n}\n\n/**\n * Legacy adapter factory.\n */\nexport const resendAdapter = (options: LegacyIgniterMailOptions) =>\n ResendMailAdapterBuilder.create()\n .withSecret(options.secret)\n .withFrom(options.from)\n .build()\n\n","import { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { MailAdapter } from '../types/adapter'\nimport type { LegacyIgniterMailOptions } from '../types/provider'\n\n/**\n * SendGrid adapter builder.\n *\n * Notes:\n * - This implementation uses `fetch` (no SDK dependency).\n * - Designed to be extracted to `@igniter-js/mail/adapters/sendgrid`.\n */\nexport class SendGridMailAdapterBuilder {\n private secret?: string\n private from?: string\n\n /** Creates a new builder instance. */\n static create() {\n return new SendGridMailAdapterBuilder()\n }\n\n /** Sets the SendGrid API key. */\n withSecret(secret: string) {\n this.secret = secret\n return this\n }\n\n /** Sets the default FROM address used when sending emails via SendGrid. */\n withFrom(from: string) {\n this.from = from\n return this\n }\n\n /** Builds the adapter instance. */\n build(): MailAdapter {\n if (!this.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SendGrid adapter secret is required',\n })\n }\n\n if (!this.from) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SendGrid adapter from is required',\n })\n }\n\n const apiKey = this.secret\n const from = this.from\n\n return {\n /** Sends an email using SendGrid (HTTP API). */\n send: async ({ to, subject, html, text }) => {\n const response = await fetch('https://api.sendgrid.com/v3/mail/send', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n personalizations: [{\n to: [{ email: to }],\n }],\n from: { email: from },\n subject,\n content: [\n { type: 'text/plain', value: text },\n { type: 'text/html', value: html },\n ],\n }),\n })\n\n // SendGrid typically returns 202 for accepted.\n if (!response.ok) {\n const body = await response.text().catch(() => '')\n\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_SEND_FAILED',\n message: 'SendGrid send failed',\n metadata: {\n status: response.status,\n body,\n },\n })\n }\n },\n }\n }\n}\n\n/**\n * Legacy adapter factory.\n */\nexport const sendgridAdapter = (options: LegacyIgniterMailOptions) =>\n SendGridMailAdapterBuilder.create()\n .withSecret(options.secret)\n .withFrom(options.from)\n .build()\n","import nodemailer from 'nodemailer'\n\nimport { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { MailAdapter } from '../types/adapter'\nimport type { LegacyIgniterMailOptions } from '../types/provider'\n\nexport class SmtpMailAdapterBuilder {\n private secret?: string\n private from?: string\n\n /** Creates a new builder instance. */\n static create() {\n return new SmtpMailAdapterBuilder()\n }\n\n /** Sets the SMTP connection URL (e.g. `smtps://user:pass@host:port`). */\n withSecret(secret: string) {\n this.secret = secret\n return this\n }\n\n /** Sets the default FROM address used when sending emails via SMTP. */\n withFrom(from: string) {\n this.from = from\n return this\n }\n\n /** Builds the adapter instance. */\n build(): MailAdapter {\n if (!this.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SMTP adapter secret is required',\n })\n }\n\n if (!this.from) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SMTP adapter from is required',\n })\n }\n\n const smtpUrl = this.secret\n const from = this.from\n\n const createTransporter = () => {\n return nodemailer.createTransport(smtpUrl, {\n tls: {\n rejectUnauthorized: false,\n },\n connectionTimeout: 10000,\n greetingTimeout: 5000,\n socketTimeout: 10000,\n })\n }\n\n return {\n /** Sends an email using Nodemailer over SMTP. */\n send: async ({ to, subject, html, text }) => {\n const transport = createTransporter()\n const mailOptions = {\n from,\n to,\n subject,\n html,\n text,\n }\n\n try {\n await transport.sendMail(mailOptions)\n transport.close()\n } catch (error) {\n transport.close()\n throw error\n }\n },\n }\n }\n}\n\n/**\n * Legacy adapter factory.\n */\nexport const smtpAdapter = (options: LegacyIgniterMailOptions) =>\n SmtpMailAdapterBuilder.create()\n .withSecret(options.secret)\n .withFrom(options.from)\n .build()\n\n","import type { IgniterLogger } from '@igniter-js/core'\n\nimport type { MailAdapter, MailAdapterSendParams } from '../types/adapter'\n\n/**\n * In-memory message captured by {@link TestMailAdapter}.\n */\nexport type TestMailMessage = MailAdapterSendParams & {\n /** Timestamp when `send()` was called. */\n at: Date\n}\n\n/**\n * A test-focused adapter that captures emails in memory.\n *\n * Why this exists:\n * - Allows unit tests to assert subjects/recipients/content without hitting a real provider.\n * - Can optionally log the send operation for local debugging.\n *\n * This adapter is intentionally dependency-free so it can live in `@igniter-js/mail/adapters`.\n */\nexport type TestMailAdapter = MailAdapter & {\n /** Captured sent messages, in order. */\n readonly sent: TestMailMessage[]\n /** Clears captured messages. */\n reset: () => void\n /** Returns the last captured message (if any). */\n last: () => TestMailMessage | undefined\n}\n\nexport type CreateTestMailAdapterOptions = {\n /** Optional logger; defaults to `console`. */\n logger?: Pick<IgniterLogger, 'info'>\n /** Whether to suppress logs. Default: `false`. */\n silent?: boolean\n}\n\n/**\n * Creates a {@link TestMailAdapter}.\n */\nexport function createTestMailAdapter(\n options: CreateTestMailAdapterOptions = {},\n): TestMailAdapter {\n const sent: TestMailMessage[] = []\n const logger = options.logger ?? console\n const silent = options.silent ?? false\n\n return {\n sent,\n reset: () => {\n sent.length = 0\n },\n last: () => sent.at(-1),\n send: async (params) => {\n sent.push({ ...params, at: new Date() })\n\n if (!silent) {\n logger.info(\n `[TestMailAdapter] to=${params.to} subject=${params.subject} html=${params.html.length}B text=${params.text.length}B`,\n )\n }\n },\n }\n}\n","import { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { MailAdapter } from '../types/adapter'\nimport type { LegacyIgniterMailOptions } from '../types/provider'\n\n/**\n * Webhook adapter builder.\n *\n * This adapter posts the email payload to an arbitrary HTTP endpoint.\n *\n * Why this exists:\n * - Useful for low-code automation (Make/Zapier/n8n) or custom internal relays.\n * - Dependency-free (uses `fetch`).\n * - Easy to extract as `@igniter-js/mail/adapters/webhook`.\n */\nexport class WebhookMailAdapterBuilder {\n private url?: string\n private from?: string\n\n /** Creates a new builder instance. */\n static create() {\n return new WebhookMailAdapterBuilder()\n }\n\n /**\n * Sets the webhook URL.\n *\n * Note: when using `IgniterMailBuilder.withAdapter('webhook', secret)`, the `secret`\n * is treated as the webhook URL.\n */\n withUrl(url: string) {\n this.url = url\n return this\n }\n\n /** Sets the default FROM address. */\n withFrom(from: string) {\n this.from = from\n return this\n }\n\n /** Builds the adapter instance. */\n build(): MailAdapter {\n if (!this.url) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Webhook adapter url is required',\n })\n }\n\n if (!this.from) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Webhook adapter from is required',\n })\n }\n\n const url = this.url\n const from = this.from\n\n return {\n /** Sends an email by POST-ing to the configured webhook URL. */\n send: async ({ to, subject, html, text, scheduledAt }) => {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n to,\n from,\n subject,\n html,\n text,\n scheduledAt: scheduledAt?.toISOString(),\n }),\n })\n\n if (!response.ok) {\n const body = await response.text().catch(() => '')\n\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_SEND_FAILED',\n message: 'Webhook send failed',\n metadata: {\n status: response.status,\n body,\n },\n })\n }\n },\n }\n }\n}\n\n/**\n * Legacy adapter factory.\n */\nexport const webhookAdapter = (options: LegacyIgniterMailOptions) =>\n WebhookMailAdapterBuilder.create()\n .withUrl(options.secret)\n .withFrom(options.from)\n .build()\n","import type { IgniterJobQueueAdapter, IgniterLogger } from '@igniter-js/core'\nimport { PostmarkMailAdapterBuilder } from '../adapters/postmark.adapter'\nimport { ResendMailAdapterBuilder } from '../adapters/resend.adapter'\nimport { SendGridMailAdapterBuilder } from '../adapters/sendgrid.adapter'\nimport { SmtpMailAdapterBuilder } from '../adapters/smtp.adapter'\nimport { WebhookMailAdapterBuilder } from '../adapters/webhook.adapter'\nimport { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { MailAdapter } from '../types/adapter'\nimport type {\n IgniterMailOptions,\n IgniterMailQueueOptions,\n IgniterMailSendParams,\n IIgniterMail,\n} from '../types/provider'\nimport type { IgniterMailTemplate } from '../types/templates'\n\ntype AdapterInput =\n | { kind: 'adapter'; adapter: MailAdapter }\n | { kind: 'provider'; provider: string; secret: string }\n\n/**\n * Builder for {@link IgniterMail}.\n *\n * This API is designed to remain stable when extracted to `@igniter-js/mail`.\n */\nexport class IgniterMailBuilder<\n TTemplates extends object = Record<never, never>,\n> {\n private readonly factory: (\n options: IgniterMailOptions<TTemplates>,\n ) => IIgniterMail<TTemplates>\n private from?: string\n private adapter?: AdapterInput\n private templates: Record<string, IgniterMailTemplate<any>> = {}\n\n private logger?: IgniterLogger\n private queue?: {\n adapter: IgniterJobQueueAdapter<any>\n options?: IgniterMailQueueOptions\n }\n\n private onSendStarted?: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplate<any>>,\n any\n >,\n ) => Promise<void>\n\n private onSendError?: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplate<any>>,\n any\n >,\n error: Error,\n ) => Promise<void>\n\n private onSendSuccess?: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplate<any>>,\n any\n >,\n ) => Promise<void>\n\n private constructor(\n factory: (\n options: IgniterMailOptions<TTemplates>,\n ) => IIgniterMail<TTemplates>,\n ) {\n this.factory = factory\n }\n\n /**\n * Creates a new builder.\n */\n static create(\n factory: (options: IgniterMailOptions<any>) => IIgniterMail<any>,\n ) {\n return new IgniterMailBuilder<Record<never, never>>(factory as any)\n }\n\n /** Sets the default FROM address. */\n withFrom(from: string) {\n this.from = from\n return this\n }\n\n /** Attaches a logger instance. */\n withLogger(logger: IgniterLogger) {\n this.logger = logger\n return this\n }\n\n /**\n * Enables queue delivery.\n *\n * If configured, `IgniterMail.schedule()` will enqueue jobs instead of using `setTimeout`.\n */\n withQueue(\n adapter: IgniterJobQueueAdapter<any>,\n options?: IgniterMailQueueOptions,\n ) {\n this.queue = { adapter, options }\n return this\n }\n\n /**\n * Configures the adapter.\n *\n * - Use an adapter instance for full control.\n * - Or pass a provider key + secret for built-in adapters.\n */\n withAdapter(adapter: MailAdapter): this\n withAdapter(provider: string, secret: string): this\n withAdapter(adapterOrProvider: MailAdapter | string, secret?: string) {\n if (typeof adapterOrProvider === 'string') {\n if (!secret) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_ADAPTER_SECRET_REQUIRED',\n message: 'MAIL_PROVIDER_ADAPTER_SECRET_REQUIRED',\n logger: this.logger,\n })\n }\n\n this.adapter = {\n kind: 'provider',\n provider: adapterOrProvider,\n secret,\n }\n\n return this\n }\n\n this.adapter = {\n kind: 'adapter',\n adapter: adapterOrProvider,\n }\n\n return this\n }\n\n /**\n * Registers a template.\n */\n addTemplate<TKey extends string, TTemplate extends IgniterMailTemplate<any>>(\n key: TKey,\n template: TTemplate,\n ) {\n this.templates[key] = template\n return this as unknown as IgniterMailBuilder<\n TTemplates & Record<TKey, TTemplate>\n >\n }\n\n /** Hook invoked before sending. */\n withOnSendStarted(\n onSendStarted: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplate<any>>,\n any\n >,\n ) => Promise<void>,\n ) {\n this.onSendStarted = onSendStarted\n return this\n }\n\n /** Hook invoked on error. */\n withOnSendError(\n onSendError: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplate<any>>,\n any\n >,\n error: Error,\n ) => Promise<void>,\n ) {\n this.onSendError = onSendError\n return this\n }\n\n /** Hook invoked on success. */\n withOnSendSuccess(\n onSendSuccess: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplate<any>>,\n any\n >,\n ) => Promise<void>,\n ) {\n this.onSendSuccess = onSendSuccess\n return this\n }\n\n /**\n * Builds the {@link IgniterMail} instance.\n */\n build(): IIgniterMail<TTemplates> {\n if (!this.from) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_FROM_REQUIRED',\n message: 'MAIL_PROVIDER_FROM_REQUIRED',\n logger: this.logger,\n })\n }\n\n if (!this.adapter) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_ADAPTER_REQUIRED',\n message: 'MAIL_PROVIDER_ADAPTER_REQUIRED',\n logger: this.logger,\n })\n }\n\n const resolvedAdapter =\n this.adapter.kind === 'adapter'\n ? this.adapter.adapter\n : (() => {\n switch (this.adapter.provider) {\n case 'resend':\n return ResendMailAdapterBuilder.create()\n .withSecret(this.adapter.secret)\n .withFrom(this.from)\n .build()\n\n case 'smtp':\n return SmtpMailAdapterBuilder.create()\n .withSecret(this.adapter.secret)\n .withFrom(this.from)\n .build()\n\n case 'postmark':\n return PostmarkMailAdapterBuilder.create()\n .withSecret(this.adapter.secret)\n .withFrom(this.from)\n .build()\n\n case 'sendgrid':\n return SendGridMailAdapterBuilder.create()\n .withSecret(this.adapter.secret)\n .withFrom(this.from)\n .build()\n\n case 'webhook':\n return WebhookMailAdapterBuilder.create()\n .withUrl(this.adapter.secret)\n .withFrom(this.from)\n .build()\n\n default:\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_ADAPTER_NOT_FOUND',\n message: `MAIL_PROVIDER_ADAPTER_NOT_FOUND: ${this.adapter.provider}`,\n logger: this.logger,\n metadata: {\n provider: this.adapter.provider,\n },\n })\n }\n })()\n\n return this.factory({\n from: this.from,\n adapter: resolvedAdapter,\n templates: this.templates as TTemplates,\n onSendStarted: this.onSendStarted as any,\n onSendError: this.onSendError as any,\n onSendSuccess: this.onSendSuccess as any,\n logger: this.logger,\n queue: this.queue\n ? {\n adapter: this.queue.adapter,\n id: `${this.queue.options?.namespace ?? 'mail'}.${this.queue.options?.task ?? 'send'}`,\n options: this.queue.options,\n }\n : undefined,\n })\n }\n}\n","import type { StandardSchemaV1 } from '@igniter-js/core'\nimport type { ReactElement } from 'react'\nimport { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { IgniterMailTemplate } from '../types/templates'\n\n/**\n * Builder for {@link IgniterMailTemplate}.\n */\nexport class MailTemplateBuilder<TSchema extends StandardSchemaV1 = StandardSchemaV1> {\n private subject?: string\n private schema?: StandardSchemaV1\n private render?: (data: any) => ReactElement\n\n /** Creates a new builder instance. */\n static create() {\n return new MailTemplateBuilder<any>()\n }\n\n /** Sets the default subject for the template. */\n withSubject(subject: string) {\n this.subject = subject\n return this\n }\n\n /** Attaches the schema used to validate and infer payload types. */\n withSchema<TNextSchema extends StandardSchemaV1>(schema: TNextSchema) {\n this.schema = schema\n return this as unknown as MailTemplateBuilder<TNextSchema>\n }\n\n /** Sets the React Email render function for the template. */\n withRender(\n render: (\n data: StandardSchemaV1.InferInput<TSchema>,\n ) => ReactElement,\n ) {\n this.render = render as any\n return this\n }\n\n /** Builds the template definition. */\n build(): IgniterMailTemplate<TSchema> {\n if (!this.subject) {\n throw new IgniterMailError({\n code: 'MAIL_TEMPLATE_CONFIGURATION_INVALID',\n message: 'Mail template subject is required',\n })\n }\n\n if (!this.schema) {\n throw new IgniterMailError({\n code: 'MAIL_TEMPLATE_CONFIGURATION_INVALID',\n message: 'Mail template schema is required',\n })\n }\n\n if (!this.render) {\n throw new IgniterMailError({\n code: 'MAIL_TEMPLATE_CONFIGURATION_INVALID',\n message: 'Mail template render is required',\n })\n }\n\n return {\n subject: this.subject,\n schema: this.schema as TSchema,\n render: this.render as IgniterMailTemplate<TSchema>['render'],\n }\n }\n}\n\n","import type { StandardSchemaV1 } from '@igniter-js/core'\nimport { IgniterMailError } from '../errors/igniter-mail.error'\n\n/**\n * Validates an unknown input using `StandardSchemaV1` when the schema provides `~standard.validate`.\n *\n * If the schema does not provide a validator, this function returns the input as-is.\n */\nexport async function validateStandardSchemaInput<TSchema extends StandardSchemaV1>(\n schema: TSchema,\n input: unknown,\n): Promise<StandardSchemaV1.InferInput<TSchema>> {\n const standard = (schema as any)?.['~standard'] as\n | {\n validate: (value: unknown) =>\n | { value?: unknown; issues?: unknown[] }\n | Promise<{ value?: unknown; issues?: unknown[] }>\n }\n | undefined\n\n if (!standard?.validate) {\n return input as StandardSchemaV1.InferInput<TSchema>\n }\n\n const result = await standard.validate(input)\n\n if ((result as any)?.issues?.length) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_TEMPLATE_DATA_INVALID',\n message: 'Invalid mail template payload',\n statusCode: 400,\n details: (result as any).issues,\n })\n }\n\n return ((result as any)?.value ?? input) as StandardSchemaV1.InferInput<TSchema>\n}\n","import type { IgniterLogger, StandardSchemaV1 } from '@igniter-js/core'\nimport React from 'react'\nimport { render } from '@react-email/components'\nimport { IgniterMailBuilder } from '../builders/igniter-mail.builder'\nimport { IgniterMailError } from '../errors/igniter-mail.error'\nimport type { MailAdapter } from '../types/adapter'\nimport type {\n IgniterMailInfer,\n IgniterMailOptions,\n IgniterMailQueueConfig,\n IgniterMailSendParams,\n IIgniterMail,\n LegacyIgniterMailOptions,\n} from '../types/provider'\nimport type {\n IgniterMailTemplate,\n MailTemplateKey,\n MailTemplatePayload,\n} from '../types/templates'\nimport { validateStandardSchemaInput } from '../utils/validate-standard-schema-input'\n\n/**\n * Mail runtime for Igniter.js.\n *\n * This class is designed to be extracted into the `@igniter-js/mail` package.\n */\nexport class IgniterMail<TTemplates extends object>\n implements IIgniterMail<TTemplates>\n{\n private static instance: IIgniterMail<any> | undefined\n\n private readonly adapter: MailAdapter\n private readonly templates: TTemplates\n private readonly logger?: IgniterLogger\n private readonly queue?: IgniterMailQueueConfig\n private queueJobRegistered = false\n private queueJobRegistering?: Promise<void>\n private readonly options: Omit<\n IgniterMailOptions<TTemplates>,\n 'adapter' | 'templates'\n >\n\n /**\n * Type inference helper.\n * Access via `typeof mail.$Infer` (type-level only).\n */\n public readonly $Infer: IgniterMailInfer<TTemplates> =\n undefined as unknown as IgniterMailInfer<TTemplates>\n\n constructor(options: IgniterMailOptions<TTemplates>) {\n const { adapter, templates, logger, queue, ...rest } = options\n\n if (!adapter) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_ADAPTER_REQUIRED',\n message: 'MAIL_PROVIDER_ADAPTER_REQUIRED',\n logger,\n })\n }\n\n if (!templates) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_TEMPLATES_REQUIRED',\n message: 'MAIL_PROVIDER_TEMPLATES_REQUIRED',\n logger,\n })\n }\n\n this.adapter = adapter\n this.templates = templates\n this.logger = logger\n this.queue = queue\n this.options = rest\n }\n\n private async ensureQueueJobRegistered(): Promise<void> {\n const queue = this.queue\n if (!queue) return\n if (this.queueJobRegistered) return\n\n if (this.queueJobRegistering) {\n await this.queueJobRegistering\n return\n }\n\n this.queueJobRegistering = (async () => {\n const queueOptions = queue.options\n const name = queueOptions?.name ?? 'send'\n\n const passthroughSchema = {\n '~standard': {\n vendor: '@igniter-js/mail',\n version: 1,\n validate: async (value: unknown) => ({ value }),\n },\n } satisfies StandardSchemaV1\n\n const definition = queue.adapter.register({\n name,\n input: passthroughSchema,\n handler: async ({ input }) => {\n await this.send(input as any)\n },\n queue: queueOptions?.queue,\n attempts: queueOptions?.attempts,\n priority: queueOptions?.priority,\n removeOnComplete: queueOptions?.removeOnComplete,\n removeOnFail: queueOptions?.removeOnFail,\n metadata: queueOptions?.metadata,\n limiter: queueOptions?.limiter,\n })\n\n await queue.adapter.bulkRegister({\n [queue.id]: definition as any,\n })\n\n this.queueJobRegistered = true\n })()\n\n try {\n await this.queueJobRegistering\n } finally {\n this.queueJobRegistering = undefined\n }\n }\n\n private async validateTemplateData<\n TTemplate extends IgniterMailTemplate<any>,\n >(\n template: TTemplate,\n data: MailTemplatePayload<TTemplate>,\n ): Promise<MailTemplatePayload<TTemplate>> {\n try {\n return (await validateStandardSchemaInput(\n template.schema as any,\n data,\n )) as MailTemplatePayload<TTemplate>\n } catch (error) {\n const normalizedError = IgniterMailError.is(error)\n ? error\n : new IgniterMailError({\n code: 'MAIL_PROVIDER_TEMPLATE_DATA_INVALID',\n message: 'MAIL_PROVIDER_TEMPLATE_DATA_INVALID',\n cause: error,\n logger: this.logger,\n metadata: { subject: String((template as any).subject) },\n })\n\n throw normalizedError\n }\n }\n\n /**\n * Sends an email immediately.\n */\n async send<TSelectedTemplate extends MailTemplateKey<TTemplates>>(\n params: IgniterMailSendParams<TTemplates, TSelectedTemplate>,\n ): Promise<void> {\n try {\n this.logger?.debug('IgniterMail.send started', {\n to: params.to,\n template: String(params.template),\n })\n\n await this.onSendStarted(params)\n\n const template = (this.templates as any)[params.template] as\n | IgniterMailTemplate<any>\n | undefined\n\n if (!template) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_TEMPLATE_NOT_FOUND',\n message: 'MAIL_PROVIDER_TEMPLATE_NOT_FOUND',\n logger: this.logger,\n metadata: {\n template: String(params.template),\n },\n })\n }\n\n const validatedData = await this.validateTemplateData(\n template,\n params.data,\n )\n const MailTemplate = template.render\n\n const html = await render(<MailTemplate {...(validatedData as any)} />)\n const text = await render(<MailTemplate {...(validatedData as any)} />, {\n plainText: true,\n })\n\n await this.adapter.send({\n to: params.to,\n subject: params.subject || template.subject,\n html,\n text,\n })\n\n await this.onSendSuccess(params)\n\n this.logger?.info('IgniterMail.send success', {\n to: params.to,\n template: String(params.template),\n })\n } catch (error) {\n const normalizedError = IgniterMailError.is(error)\n ? error\n : new IgniterMailError({\n code: 'MAIL_PROVIDER_SEND_FAILED',\n message: 'MAIL_PROVIDER_SEND_FAILED',\n cause: error,\n logger: this.logger,\n metadata: {\n to: params.to,\n template: String(params.template),\n },\n })\n\n this.logger?.error('IgniterMail.send failed', normalizedError)\n\n await this.onSendError(params, normalizedError)\n throw normalizedError\n }\n }\n\n /**\n * Schedules an email for a future date.\n *\n * If a queue is configured, this method enqueues a job.\n * Otherwise, it uses a best-effort `setTimeout`.\n */\n async schedule<TSelectedTemplate extends MailTemplateKey<TTemplates>>(\n params: IgniterMailSendParams<TTemplates, TSelectedTemplate>,\n date: Date,\n ): Promise<void> {\n if (date.getTime() <= Date.now()) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_SCHEDULE_DATE_INVALID',\n message: 'MAIL_PROVIDER_SCHEDULE_DATE_INVALID',\n logger: this.logger,\n })\n }\n\n if (this.queue) {\n try {\n await this.ensureQueueJobRegistered()\n const delay = Math.max(0, date.getTime() - Date.now())\n\n this.logger?.info('IgniterMail.schedule enqueued', {\n id: this.queue.id,\n to: params.to,\n template: String(params.template),\n delay,\n })\n\n await this.queue.adapter.invoke({\n id: this.queue.id,\n input: params as any,\n delay,\n })\n\n return\n } catch (error) {\n const normalizedError = IgniterMailError.is(error)\n ? error\n : new IgniterMailError({\n code: 'MAIL_PROVIDER_SCHEDULE_FAILED',\n message: 'MAIL_PROVIDER_SCHEDULE_FAILED',\n cause: error,\n logger: this.logger,\n metadata: {\n to: params.to,\n template: String(params.template),\n date: date.toISOString(),\n },\n })\n\n this.logger?.error('IgniterMail.schedule failed', normalizedError)\n throw normalizedError\n }\n }\n\n const timeout = date.getTime() - Date.now()\n setTimeout(() => {\n this.send(params).catch((error) => {\n console.error('Failed to send scheduled email:', error)\n })\n }, timeout)\n }\n\n private async onSendStarted(\n params: IgniterMailSendParams<TTemplates, any>,\n ): Promise<void> {\n await this.options.onSendStarted?.(params)\n }\n\n private async onSendError(\n params: IgniterMailSendParams<TTemplates, any>,\n error: Error,\n ): Promise<void> {\n await this.options.onSendError?.(params, error)\n }\n\n private async onSendSuccess(\n params: IgniterMailSendParams<TTemplates, any>,\n ): Promise<void> {\n await this.options.onSendSuccess?.(params)\n }\n\n /** Helper to declare adapter factories. */\n static adapter = <TOptions,>(adapter: (options: TOptions) => MailAdapter) =>\n adapter\n\n /** Helper to declare templates with inferred payload types. */\n static template = <TSchema extends StandardSchemaV1>(\n template: IgniterMailTemplate<TSchema>,\n ) => template\n\n /**\n * Creates a new builder instance.\n */\n static create = () =>\n IgniterMailBuilder.create((options) => new IgniterMail<any>(options))\n\n /**\n * Initializes (singleton) instance.\n *\n * Prefer using {@link IgniterMail.create} for new code.\n */\n static initialize = <TEmailTemplates extends object>(\n options:\n | IgniterMailOptions<TEmailTemplates>\n | LegacyIgniterMailOptions<TEmailTemplates>,\n ) => {\n if (IgniterMail.instance) {\n return IgniterMail.instance as IgniterMail<TEmailTemplates>\n }\n\n const adapter = (options as any).adapter\n\n if (typeof adapter === 'function') {\n const legacyOptions = options as LegacyIgniterMailOptions<TEmailTemplates>\n IgniterMail.instance = new IgniterMail<TEmailTemplates>({\n from: legacyOptions.from,\n templates: legacyOptions.templates,\n adapter: legacyOptions.adapter(legacyOptions),\n onSendStarted: legacyOptions.onSendStarted,\n onSendError: legacyOptions.onSendError,\n onSendSuccess: legacyOptions.onSendSuccess,\n }) as unknown as IIgniterMail<any>\n return IgniterMail.instance as IgniterMail<TEmailTemplates>\n }\n\n IgniterMail.instance = new IgniterMail<TEmailTemplates>(\n options as IgniterMailOptions<TEmailTemplates>,\n ) as unknown as IIgniterMail<any>\n return IgniterMail.instance as IgniterMail<TEmailTemplates>\n }\n}\n","import type {\n IgniterJobQueueAdapter,\n IgniterLogger,\n JobLimiter,\n JobQueueConfig,\n StandardSchemaV1,\n} from '@igniter-js/core'\nimport type { MailAdapter } from './adapter'\nimport type { IgniterMailTemplate, MailTemplateKey, MailTemplatePayload } from './templates'\n\n/**\n * Type inference helper exposed by the runtime instance.\n */\nexport type IgniterMailInfer<TTemplates extends object> = {\n /** Union of valid template keys. */\n readonly Templates: MailTemplateKey<TTemplates>\n /** Payloads by template. */\n readonly Payloads: {\n [K in MailTemplateKey<TTemplates>]: MailTemplatePayload<TTemplates[K]>\n }\n\n /**\n * Union of valid `mail.send()` inputs.\n * Useful for type-level consumption.\n */\n readonly SendInput: {\n [K in MailTemplateKey<TTemplates>]: IgniterMailSendParams<TTemplates, K>\n }[MailTemplateKey<TTemplates>]\n\n /**\n * Tuple form of `mail.schedule()` inputs.\n */\n readonly ScheduleInput: [\n {\n [K in MailTemplateKey<TTemplates>]: IgniterMailSendParams<TTemplates, K>\n }[MailTemplateKey<TTemplates>],\n Date,\n ]\n}\n\n/**\n * Queue options used when scheduling or enqueuing send jobs.\n */\nexport type IgniterMailQueueOptions = {\n /** Namespace used to compose the job id (default: \"mail\"). */\n namespace?: string\n /** Task key used to compose the job id (default: \"send\"). */\n task?: string\n /** Human-readable job name (default: \"send\"). */\n name?: string\n /** Queue config for this job. */\n queue?: JobQueueConfig\n /** Number of retry attempts on failure. */\n attempts?: number\n /** Job priority (higher value = higher priority). */\n priority?: number\n /** Remove job after completion. */\n removeOnComplete?: boolean | number\n /** Remove job after failure. */\n removeOnFail?: boolean | number\n /** Additional metadata. */\n metadata?: Record<string, any>\n /** Optional rate limiter config. */\n limiter?: JobLimiter\n}\n\n/**\n * Normalized queue configuration consumed by the runtime.\n */\nexport type IgniterMailQueueConfig = {\n /** Queue adapter instance. */\n adapter: IgniterJobQueueAdapter<any>\n /** Fully qualified job id. */\n id: string\n /** Optional queue options. */\n options?: IgniterMailQueueOptions\n}\n\n/**\n * Parameters required to send an email using a template.\n */\nexport interface IgniterMailSendParams<\n TTemplates extends object,\n TSelectedTemplate extends MailTemplateKey<TTemplates>,\n> {\n /** Recipient email address. */\n to: string\n /** Optional subject override. */\n subject?: string\n /** Template key. */\n template: TSelectedTemplate\n /** Template payload (validated using StandardSchema when provided). */\n data: MailTemplatePayload<TTemplates[TSelectedTemplate]>\n}\n\n/**\n * Hooks invoked by the runtime.\n */\nexport interface IgniterMailHooks<TTemplates extends object> {\n /** Invoked before rendering/sending. */\n onSendStarted?: (params: IgniterMailSendParams<TTemplates, any>) => Promise<void>\n /** Invoked when sending fails. */\n onSendError?: (\n params: IgniterMailSendParams<TTemplates, any>,\n error: Error,\n ) => Promise<void>\n /** Invoked after a successful send. */\n onSendSuccess?: (params: IgniterMailSendParams<TTemplates, any>) => Promise<void>\n}\n\n/**\n * Options used to initialize {@link IgniterMail}.\n */\nexport interface IgniterMailOptions<\n TTemplates extends object = Record<string, IgniterMailTemplate<any>>,\n> extends IgniterMailHooks<TTemplates> {\n /** Default FROM address used by the adapter. */\n from: string\n /** Adapter implementation. */\n adapter: MailAdapter\n /** Template registry. */\n templates: TTemplates\n\n /** Optional logger used for debug/info/error logging. */\n logger?: IgniterLogger\n /** Optional queue configuration for asynchronous delivery. */\n queue?: IgniterMailQueueConfig\n}\n\n/**\n * Legacy initializer options.\n *\n * Kept for backwards compatibility with older integrations.\n */\nexport interface LegacyIgniterMailOptions<\n TTemplates extends object = Record<string, IgniterMailTemplate<any>>,\n> extends IgniterMailHooks<TTemplates> {\n /** Provider secret/token. */\n secret: string\n /** Default FROM address. */\n from: string\n /** Adapter factory. */\n adapter: (options: LegacyIgniterMailOptions<any>) => MailAdapter\n /** Template registry. */\n templates: TTemplates\n}\n\n/**\n * Public interface implemented by {@link IgniterMail}.\n */\nexport interface IIgniterMail<TTemplates extends object> {\n /**\n * Type inference helper.\n * Access via `typeof mail.$Infer` (type-level only).\n */\n readonly $Infer: IgniterMailInfer<TTemplates>\n\n /** Sends an email immediately. */\n send: <TSelectedTemplate extends MailTemplateKey<TTemplates>>(\n params: IgniterMailSendParams<TTemplates, TSelectedTemplate>,\n ) => Promise<void>\n\n /** Schedules an email for a future date (queue if configured, otherwise setTimeout). */\n schedule: <TSelectedTemplate extends MailTemplateKey<TTemplates>>(\n params: IgniterMailSendParams<TTemplates, TSelectedTemplate>,\n date: Date,\n ) => Promise<void>\n}\n\n/**\n * Helper for creating a passthrough `StandardSchemaV1` validator.\n */\nexport function createPassthroughSchema(): StandardSchemaV1 {\n return {\n '~standard': {\n vendor: '@igniter-js/mail',\n version: 1,\n validate: async (value: unknown) => ({ value }),\n },\n } satisfies StandardSchemaV1\n}\n","import { postmarkAdapter } from '../adapters/postmark.adapter'\nimport { resendAdapter } from '../adapters/resend.adapter'\nimport { sendgridAdapter } from '../adapters/sendgrid.adapter'\nimport { smtpAdapter } from '../adapters/smtp.adapter'\nimport { webhookAdapter } from '../adapters/webhook.adapter'\nimport { IgniterMailError } from '../errors/igniter-mail.error'\n\n/**\n * Resolves a legacy adapter factory by key.\n */\nexport const getAdapter = (adapter: string) => {\n switch (adapter) {\n case 'resend':\n return resendAdapter\n case 'smtp':\n return smtpAdapter\n case 'postmark':\n return postmarkAdapter\n case 'sendgrid':\n return sendgridAdapter\n case 'webhook':\n return webhookAdapter\n default:\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_ADAPTER_NOT_FOUND',\n message: `MAIL_PROVIDER_ADAPTER_NOT_FOUND: ${adapter}`,\n metadata: { adapter },\n })\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors/mail.error.ts","../src/adapters/postmark.adapter.ts","../src/adapters/resend.adapter.ts","../src/adapters/sendgrid.adapter.ts","../src/adapters/smtp.adapter.ts","../src/types/telemetry.ts","../src/utils/schema.ts","../src/core/manager.tsx","../src/builders/main.builder.ts","../src/builders/template.builder.ts"],"names":["render"],"mappings":"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","file":"index.mjs","sourcesContent":["import { IgniterError, type IgniterLogger } from '@igniter-js/core'\n\n/**\n * Known error codes thrown by `@igniter-js/mail` runtime.\n */\nexport type IgniterMailErrorCode =\n | 'MAIL_PROVIDER_FROM_REQUIRED'\n | 'MAIL_PROVIDER_ADAPTER_REQUIRED'\n | 'MAIL_PROVIDER_ADAPTER_SECRET_REQUIRED'\n | 'MAIL_PROVIDER_ADAPTER_NOT_FOUND'\n | 'MAIL_PROVIDER_TEMPLATES_REQUIRED'\n | 'MAIL_PROVIDER_TEMPLATE_NOT_FOUND'\n | 'MAIL_PROVIDER_TEMPLATE_DATA_INVALID'\n | 'MAIL_PROVIDER_SCHEDULE_DATE_INVALID'\n | 'MAIL_PROVIDER_SEND_FAILED'\n | 'MAIL_PROVIDER_SCHEDULE_FAILED'\n | 'MAIL_ADAPTER_CONFIGURATION_INVALID'\n | 'MAIL_TEMPLATE_CONFIGURATION_INVALID'\n | 'MAIL_PROVIDER_SCHEDULE_QUEUE_NOT_CONFIGURED'\n\n/**\n * Payload used to create an {@link IgniterMailError}.\n */\nexport type IgniterMailErrorPayload = {\n /** Machine-readable error code. */\n code: IgniterMailErrorCode\n /** Human-readable message. */\n message: string\n /** Optional HTTP status code when surfacing errors through HTTP boundaries. */\n statusCode?: number\n /** Optional original cause. */\n cause?: unknown\n /** Extra diagnostic details (e.g. schema issues). */\n details?: unknown\n /** Arbitrary metadata for debugging. */\n metadata?: Record<string, unknown>\n /** Optional logger used by IgniterError. */\n logger?: IgniterLogger\n}\n\n/**\n * Typed error used by the `IgniterMail` runtime.\n *\n * This is designed to be stable for extraction into `@igniter-js/mail`.\n */\nexport class IgniterMailError extends IgniterError {\n declare readonly code: IgniterMailErrorCode\n\n constructor(payload: IgniterMailErrorPayload) {\n super({\n code: payload.code,\n message: payload.message,\n statusCode: payload.statusCode,\n causer: '@igniter-js/mail',\n details: payload.details,\n metadata: payload.metadata,\n logger: payload.logger,\n })\n\n this.name = 'IgniterMailError'\n }\n\n /**\n * Type guard utility.\n */\n static is(error: unknown): error is IgniterMailError {\n return error instanceof IgniterMailError\n }\n}\n\n","import { IgniterMailError } from '../errors/mail.error'\nimport type {\n IgniterMailAdapter,\n IgniterMailAdapterCredentials,\n IgniterMailAdapterSendParams,\n} from '../types/adapter'\n\n/**\n * Postmark adapter.\n *\n * Notes:\n * - This implementation uses `fetch` (no SDK dependency).\n * - Designed to be extracted to `@igniter-js/mail/adapters/postmark`.\n *\n * @example\n * ```ts\n * const adapter = PostmarkMailAdapter.create({\n * secret: process.env.POSTMARK_SERVER_TOKEN,\n * from: 'no-reply@example.com',\n * })\n * await adapter.send({ to: 'user@example.com', subject: 'Hello', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\nexport class PostmarkMailAdapter implements IgniterMailAdapter {\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Provider credentials (secret/from).\n * @returns A Postmark adapter instance.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n * @example\n * ```ts\n * const adapter = PostmarkMailAdapter.create({ secret: 'token', from: 'no-reply@acme.com' })\n * ```\n */\n static create(credentials: IgniterMailAdapterCredentials) {\n return new PostmarkMailAdapter(credentials)\n }\n\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Provider credentials (secret/from).\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n */\n constructor(private readonly credentials: IgniterMailAdapterCredentials = {}) {}\n\n /**\n * Sends an email using Postmark (HTTP API).\n *\n * @param params - Normalized email parameters.\n * @returns A promise that resolves when the email is accepted.\n * @throws {IgniterMailError} When configuration is invalid or Postmark rejects the request.\n * @example\n * ```ts\n * await adapter.send({ to: 'user@example.com', subject: 'Hello', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\n async send(params: IgniterMailAdapterSendParams) {\n if (!this.credentials.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Postmark adapter secret is required',\n })\n }\n\n if (!this.credentials.from) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Postmark adapter from is required',\n })\n }\n\n const token = this.credentials.secret\n const from = this.credentials.from\n\n const response = await fetch('https://api.postmarkapp.com/email', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'X-Postmark-Server-Token': token,\n },\n body: JSON.stringify({\n From: from,\n To: params.to,\n Subject: params.subject,\n HtmlBody: params.html,\n TextBody: params.text,\n }),\n })\n\n if (!response.ok) {\n const body = await response.text().catch(() => '')\n\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_SEND_FAILED',\n message: 'Postmark send failed',\n metadata: {\n status: response.status,\n body,\n },\n })\n }\n }\n}","import { Resend } from 'resend'\n\nimport { IgniterMailError } from '../errors/mail.error'\nimport type {\n IgniterMailAdapter,\n IgniterMailAdapterCredentials,\n IgniterMailAdapterSendParams,\n} from '../types/adapter'\n\n/**\n * Resend adapter implementation.\n *\n * Notes:\n * - Uses the Resend SDK.\n * - Designed to be extracted to `@igniter-js/mail/adapters/resend`.\n *\n * @example\n * ```ts\n * const adapter = ResendMailAdapter.create({\n * secret: process.env.RESEND_API_KEY,\n * from: 'no-reply@example.com',\n * })\n * await adapter.send({ to: 'user@example.com', subject: 'Hi', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\nexport class ResendMailAdapter implements IgniterMailAdapter {\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Adapter credentials including API secret and default from.\n * @returns A configured Resend adapter.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n * @example\n * ```ts\n * const adapter = ResendMailAdapter.create({ secret: 'token', from: 'no-reply@acme.com' })\n * ```\n */\n static create(credentials: IgniterMailAdapterCredentials) {\n return new ResendMailAdapter(credentials)\n }\n\n /**\n * Creates an adapter with credentials.\n *\n * @param credentials - Adapter credentials including API secret and default from.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n */\n constructor(private readonly credentials: IgniterMailAdapterCredentials = {}) {}\n\n /**\n * Sends an email using Resend.\n *\n * @param params - Email payload to send.\n * @returns Resolves when the email is accepted by Resend.\n * @throws {IgniterMailError} When credentials are missing or Resend rejects the request.\n *\n * @example\n * ```ts\n * await adapter.send({ to: 'user@example.com', subject: 'Welcome', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\n async send(params: IgniterMailAdapterSendParams): Promise<void> {\n if (!this.credentials.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Resend adapter secret is required',\n })\n }\n\n if (!this.credentials.from) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'Resend adapter from is required',\n })\n }\n\n const resend = new Resend(this.credentials.secret)\n const from = this.credentials.from\n\n await resend.emails.create({\n to: params.to,\n from,\n subject: params.subject,\n html: params.html,\n text: params.text,\n scheduledAt: params.scheduledAt?.toISOString(),\n })\n }\n}\n","import { IgniterMailError } from '../errors/mail.error'\nimport type {\n IgniterMailAdapter,\n IgniterMailAdapterCredentials,\n IgniterMailAdapterSendParams,\n} from '../types/adapter'\n\n/**\n * SendGrid adapter implementation.\n *\n * Notes:\n * - This implementation uses `fetch` (no SDK dependency).\n * - Designed to be extracted to `@igniter-js/mail/adapters/sendgrid`.\n *\n * @example\n * ```ts\n * const adapter = SendGridMailAdapter.create({\n * secret: process.env.SENDGRID_API_KEY,\n * from: 'no-reply@example.com',\n * })\n * await adapter.send({ to: 'user@example.com', subject: 'Hello', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\nexport class SendGridMailAdapter implements IgniterMailAdapter {\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Adapter credentials including API secret and default from.\n * @returns A configured SendGrid adapter.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n * @example\n * ```ts\n * const adapter = SendGridMailAdapter.create({ secret: 'token', from: 'no-reply@acme.com' })\n * ```\n */\n static create(credentials: IgniterMailAdapterCredentials) {\n return new SendGridMailAdapter(credentials)\n }\n\n /**\n * Creates an adapter with credentials.\n *\n * @param credentials - Adapter credentials including API secret and default from.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n */\n constructor(private readonly credentials: IgniterMailAdapterCredentials = {}) {}\n\n /**\n * Sends an email using SendGrid (HTTP API).\n *\n * @param params - Email payload to send.\n * @returns Resolves when the email is accepted by SendGrid.\n * @throws {IgniterMailError} When credentials are missing or the API fails.\n *\n * @example\n * ```ts\n * await adapter.send({ to: 'user@example.com', subject: 'Hi', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\n async send(params: IgniterMailAdapterSendParams): Promise<void> {\n if (!this.credentials.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SendGrid adapter secret is required',\n })\n }\n\n if (!this.credentials.from) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SendGrid adapter from is required',\n })\n }\n\n const apiKey = this.credentials.secret\n const from = this.credentials.from\n\n const response = await fetch('https://api.sendgrid.com/v3/mail/send', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n personalizations: [\n {\n to: [{ email: params.to }],\n },\n ],\n from: { email: from },\n subject: params.subject,\n content: [\n { type: 'text/plain', value: params.text },\n { type: 'text/html', value: params.html },\n ],\n }),\n })\n\n if (!response.ok) {\n const body = await response.text().catch(() => '')\n\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_SEND_FAILED',\n message: 'SendGrid send failed',\n metadata: {\n status: response.status,\n body,\n },\n })\n }\n }\n}\n","import nodemailer from 'nodemailer'\n\nimport { IgniterMailError } from '../errors/mail.error'\nimport type {\n IgniterMailAdapter,\n IgniterMailAdapterCredentials,\n IgniterMailAdapterSendParams,\n} from '../types/adapter'\n\n/**\n * SMTP adapter implementation.\n *\n * Notes:\n * - Uses Nodemailer.\n * - `credentials.secret` must be an SMTP connection URL.\n *\n * @example\n * ```ts\n * const adapter = SmtpMailAdapter.create({\n * secret: 'smtps://user:pass@host:465',\n * from: 'no-reply@example.com',\n * })\n * await adapter.send({ to: 'user@example.com', subject: 'Hi', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\nexport class SmtpMailAdapter implements IgniterMailAdapter {\n /**\n * Creates a new adapter instance.\n *\n * @param credentials - Adapter credentials including SMTP URL and default from.\n * @returns A configured SMTP adapter.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n * @example\n * ```ts\n * const adapter = SmtpMailAdapter.create({ secret: 'smtps://user:pass@host:465', from: 'no-reply@acme.com' })\n * ```\n */\n static create(credentials: IgniterMailAdapterCredentials) {\n return new SmtpMailAdapter(credentials)\n }\n\n /**\n * Creates an adapter with credentials.\n *\n * @param credentials - Adapter credentials including SMTP URL and default from.\n * @throws {IgniterMailError} Does not throw on creation; errors surface on send.\n */\n constructor(private readonly credentials: IgniterMailAdapterCredentials = {}) {}\n\n /**\n * Sends an email using Nodemailer over SMTP.\n *\n * @param params - Email payload to send.\n * @returns Resolves when the email is sent.\n * @throws {IgniterMailError} When credentials are missing or the SMTP send fails.\n *\n * @example\n * ```ts\n * await adapter.send({ to: 'user@example.com', subject: 'Hi', html: '<p>Hi</p>', text: 'Hi' })\n * ```\n */\n async send(params: IgniterMailAdapterSendParams): Promise<void> {\n if (!this.credentials.secret) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SMTP adapter secret is required',\n })\n }\n\n if (!this.credentials.from) {\n throw new IgniterMailError({\n code: 'MAIL_ADAPTER_CONFIGURATION_INVALID',\n message: 'SMTP adapter from is required',\n })\n }\n\n const smtpUrl = this.credentials.secret\n const from = this.credentials.from\n\n const transport = nodemailer.createTransport(smtpUrl, {\n connectionTimeout: 10000,\n greetingTimeout: 5000,\n socketTimeout: 10000,\n tls: {\n rejectUnauthorized: false,\n },\n })\n\n try {\n await transport.sendMail({\n from,\n to: params.to,\n subject: params.subject,\n html: params.html,\n text: params.text,\n })\n } catch(error) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_SEND_FAILED',\n message: 'SMTP send failed',\n metadata: {\n originalError: error,\n },\n })\n } finally {\n transport.close()\n }\n }\n}\n","import type { IgniterTelemetryManager } from \"@igniter-js/telemetry\";\nimport type { IgniterMailTelemetryEvents } from \"../telemetry\";\n\n/**\n * Mail telemetry event names.\n */\nexport const IGNITER_MAIL_TELEMETRY_EVENTS = {\n /** Emitted when mail send operation starts */\n SEND_STARTED: \"igniter.mail.send.started\",\n /** Emitted when mail send operation succeeds */\n SEND_SUCCESS: \"igniter.mail.send.success\",\n /** Emitted when mail send operation fails */\n SEND_ERROR: \"igniter.mail.send.error\",\n /** Emitted when mail schedule operation starts */\n SCHEDULE_STARTED: \"igniter.mail.schedule.started\",\n /** Emitted when mail schedule operation succeeds */\n SCHEDULE_SUCCESS: \"igniter.mail.schedule.success\",\n /** Emitted when mail schedule operation fails */\n SCHEDULE_ERROR: \"igniter.mail.schedule.error\",\n} as const;\n\nexport const MAIL_TELEMETRY_EVENTS = IGNITER_MAIL_TELEMETRY_EVENTS;\n\nexport type IgniterMailTelemetryEvent =\n (typeof IGNITER_MAIL_TELEMETRY_EVENTS)[keyof typeof IGNITER_MAIL_TELEMETRY_EVENTS];\n\nexport type IgniterMailTelemetryRegistry = {\n [K in IgniterMailTelemetryEvents[\"namespace\"]]: IgniterMailTelemetryEvents[\"events\"];\n};\n\nexport type IgniterMailTelemetry = IgniterTelemetryManager<IgniterMailTelemetryRegistry>;\n","import type { StandardSchemaV1 } from '@igniter-js/core'\nimport { IgniterMailError } from '../errors/mail.error'\n\n/**\n * Schema utilities for `@igniter-js/mail`.\n */\nexport class IgniterMailSchema {\n /**\n * Validates an unknown input using `StandardSchemaV1` when the schema provides `~standard.validate`.\n *\n * If the schema does not provide a validator, this method returns the input as-is.\n */\n static async validateInput<TSchema extends StandardSchemaV1>(\n schema: TSchema,\n input: unknown,\n ): Promise<StandardSchemaV1.InferInput<TSchema>> {\n const standard = (schema as any)?.['~standard'] as\n | {\n validate: (value: unknown) =>\n | { value?: unknown; issues?: unknown[] }\n | Promise<{ value?: unknown; issues?: unknown[] }>\n }\n | undefined\n\n if (!standard?.validate) {\n return input as StandardSchemaV1.InferInput<TSchema>\n }\n\n const result = await standard.validate(input)\n\n if ((result as any)?.issues?.length) {\n throw new IgniterMailError({\n code: 'MAIL_PROVIDER_TEMPLATE_DATA_INVALID',\n message: 'Invalid mail template payload',\n statusCode: 400,\n details: (result as any).issues,\n })\n }\n\n return ((result as any)?.value ?? input) as StandardSchemaV1.InferInput<TSchema>\n }\n\n /**\n * Creates a passthrough StandardSchema validator.\n */\n static createPassthroughSchema(): StandardSchemaV1 {\n return {\n '~standard': {\n vendor: '@igniter-js/mail',\n version: 1,\n validate: async (value: unknown) => ({ value }),\n },\n } satisfies StandardSchemaV1\n }\n}\n","import type { IgniterLogger } from \"@igniter-js/core\";\nimport React from \"react\";\nimport { render } from \"@react-email/components\";\nimport { IgniterMailError } from \"../errors/mail.error\";\nimport { IGNITER_MAIL_TELEMETRY_EVENTS } from \"../types/telemetry\";\nimport type { IgniterMailAdapter } from \"../types/adapter\";\nimport type {\n IgniterMailInfer,\n IgniterMailOptions,\n IgniterMailQueueConfig,\n IgniterMailSendParams,\n IIgniterMail,\n} from \"../types/provider\";\nimport type { IgniterMailTelemetry } from \"../types/telemetry\";\nimport type {\n IgniterMailTemplateBuilt,\n IgniterMailTemplateKey,\n IgniterMailTemplatePayload,\n} from \"../types/templates\";\nimport { IgniterMailSchema } from \"../utils/schema\";\n\n/**\n * Mail runtime for Igniter.js.\n *\n * This class is designed to be extracted into the `@igniter-js/mail` package.\n */\nexport class IgniterMailManagerCore<\n TTemplates extends object,\n> implements IIgniterMail<TTemplates> {\n private readonly adapter: IgniterMailAdapter;\n private readonly templates: TTemplates;\n private readonly logger?: IgniterLogger;\n private readonly telemetry?: IgniterMailTelemetry;\n private readonly queue?: IgniterMailQueueConfig;\n private queueJobRegistered = false;\n private queueJobRegistering?: Promise<void>;\n private readonly options: Omit<\n IgniterMailOptions<TTemplates>,\n \"adapter\" | \"templates\"\n >;\n\n /**\n * Type inference helper.\n * Access via `typeof mail.$Infer` (type-level only).\n */\n public readonly $Infer: IgniterMailInfer<TTemplates> =\n {} as unknown as IgniterMailInfer<TTemplates>;\n\n constructor(options: IgniterMailOptions<TTemplates>) {\n const { adapter, templates, logger, telemetry, queue, ...rest } = options;\n\n if (!adapter) {\n throw new IgniterMailError({\n code: \"MAIL_PROVIDER_ADAPTER_REQUIRED\",\n message: \"MAIL_PROVIDER_ADAPTER_REQUIRED\",\n logger,\n });\n }\n\n if (!templates) {\n throw new IgniterMailError({\n code: \"MAIL_PROVIDER_TEMPLATES_REQUIRED\",\n message: \"MAIL_PROVIDER_TEMPLATES_REQUIRED\",\n logger,\n });\n }\n\n this.adapter = adapter;\n this.templates = templates;\n this.logger = logger;\n this.telemetry = telemetry;\n this.queue = queue;\n this.options = rest;\n }\n\n private async ensureQueueJobRegistered(): Promise<void> {\n const queue = this.queue;\n if (!queue) return;\n if (this.queueJobRegistered) return;\n\n if (this.queueJobRegistering) {\n await this.queueJobRegistering;\n return;\n }\n\n this.queueJobRegistering = (async () => {\n const queueOptions = queue.options;\n\n const passthroughSchema = IgniterMailSchema.createPassthroughSchema();\n\n queue.adapter.register({\n name: queueOptions?.job ?? \"send\",\n input: passthroughSchema, \n attempts: queueOptions?.attempts,\n priority: queueOptions?.priority,\n removeOnComplete: queueOptions?.removeOnComplete,\n removeOnFail: queueOptions?.removeOnFail,\n metadata: queueOptions?.metadata,\n limiter: queueOptions?.limiter,\n queue: { name: queueOptions?.queue ?? \"mail\" },\n handler: async ({ input }) => {\n await this.send(input as any);\n },\n });\n\n this.queueJobRegistered = true;\n })();\n\n try {\n await this.queueJobRegistering;\n } finally {\n this.queueJobRegistering = undefined;\n }\n }\n\n private async validateTemplateData<\n TTemplate extends IgniterMailTemplateBuilt<any>,\n >(\n template: TTemplate,\n data: IgniterMailTemplatePayload<TTemplate>,\n ): Promise<IgniterMailTemplatePayload<TTemplate>> {\n try {\n return (await IgniterMailSchema.validateInput(\n template.schema as any,\n data,\n )) as IgniterMailTemplatePayload<TTemplate>;\n } catch (error) {\n const normalizedError = IgniterMailError.is(error)\n ? error\n : new IgniterMailError({\n code: \"MAIL_PROVIDER_TEMPLATE_DATA_INVALID\",\n message: \"MAIL_PROVIDER_TEMPLATE_DATA_INVALID\",\n cause: error,\n logger: this.logger,\n metadata: { subject: String((template as any).subject) },\n });\n\n throw normalizedError;\n }\n }\n\n /**\n * Sends an email immediately.\n */\n async send<TSelectedTemplate extends IgniterMailTemplateKey<TTemplates>>(\n params: IgniterMailSendParams<TTemplates, TSelectedTemplate>,\n ): Promise<void> {\n const startTime = Date.now();\n\n try {\n this.logger?.debug(\"IgniterMail.send started\", {\n to: params.to,\n template: String(params.template),\n });\n\n this.telemetry?.emit(IGNITER_MAIL_TELEMETRY_EVENTS.SEND_STARTED, {\n level: \"debug\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.subject\": params.subject,\n },\n });\n\n await this.onSendStarted(params);\n\n const template = (this.templates as any)[params.template] as\n | IgniterMailTemplateBuilt<any>\n | undefined;\n\n if (!template) {\n throw new IgniterMailError({\n code: \"MAIL_PROVIDER_TEMPLATE_NOT_FOUND\",\n message: \"MAIL_PROVIDER_TEMPLATE_NOT_FOUND\",\n logger: this.logger,\n metadata: {\n template: String(params.template),\n },\n });\n }\n\n const validatedData = await this.validateTemplateData(\n template,\n params.data,\n );\n const MailTemplate = template.render;\n\n const html = await render(<MailTemplate {...(validatedData as any)} />);\n const text = await render(<MailTemplate {...(validatedData as any)} />, {\n plainText: true,\n });\n\n await this.adapter.send({\n to: params.to,\n subject: params.subject || template.subject,\n html,\n text,\n });\n\n await this.onSendSuccess(params);\n\n const durationMs = Date.now() - startTime;\n\n this.telemetry?.emit(IGNITER_MAIL_TELEMETRY_EVENTS.SEND_SUCCESS, {\n level: \"info\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.subject\": params.subject || template.subject,\n \"mail.duration_ms\": durationMs,\n },\n });\n\n this.logger?.info(\"IgniterMail.send success\", {\n to: params.to,\n template: String(params.template),\n durationMs,\n });\n } catch (error) {\n const normalizedError = IgniterMailError.is(error)\n ? error\n : new IgniterMailError({\n code: \"MAIL_PROVIDER_SEND_FAILED\",\n message: \"MAIL_PROVIDER_SEND_FAILED\",\n cause: error,\n logger: this.logger,\n metadata: {\n to: params.to,\n template: String(params.template),\n },\n });\n\n const durationMs = Date.now() - startTime;\n\n this.telemetry?.emit(IGNITER_MAIL_TELEMETRY_EVENTS.SEND_ERROR, {\n level: \"error\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.subject\": params.subject,\n \"mail.error.code\": normalizedError.code,\n \"mail.error.message\": normalizedError.message,\n \"mail.duration_ms\": durationMs,\n },\n });\n\n this.logger?.error(\"IgniterMail.send failed\", normalizedError);\n\n await this.onSendError(params, normalizedError);\n throw normalizedError;\n }\n }\n\n /**\n * Schedules an email for a future date.\n *\n * Requires a queue adapter; otherwise it throws.\n */\n async schedule<TSelectedTemplate extends IgniterMailTemplateKey<TTemplates>>(\n params: IgniterMailSendParams<TTemplates, TSelectedTemplate>,\n date: Date,\n ): Promise<void> {\n const startTime = Date.now();\n\n if (date.getTime() <= Date.now()) {\n throw new IgniterMailError({\n code: \"MAIL_PROVIDER_SCHEDULE_DATE_INVALID\",\n message: \"MAIL_PROVIDER_SCHEDULE_DATE_INVALID\",\n logger: this.logger,\n });\n }\n\n const delay = Math.max(0, date.getTime() - Date.now());\n\n this.logger?.debug(\"IgniterMail.schedule started\", {\n to: params.to,\n template: String(params.template),\n scheduledAt: date.toISOString(),\n delayMs: delay,\n });\n\n this.telemetry?.emit(IGNITER_MAIL_TELEMETRY_EVENTS.SCHEDULE_STARTED, {\n level: \"debug\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.scheduled_at\": date.toISOString(),\n \"mail.delay_ms\": delay,\n },\n });\n\n if (!this.queue) {\n throw new IgniterMailError({\n code: \"MAIL_PROVIDER_SCHEDULE_QUEUE_NOT_CONFIGURED\",\n message: \"MAIL_PROVIDER_SCHEDULE_QUEUE_NOT_CONFIGURED\",\n logger: this.logger,\n });\n }\n\n try {\n await this.ensureQueueJobRegistered();\n\n const queue = this.queue.options?.queue ?? \"mail\";\n const job = this.queue.options?.job ?? \"send\";\n const id = `${queue}.${job}`;\n\n this.logger?.info(\"IgniterMail.schedule enqueued\", {\n to: params.to,\n template: String(params.template),\n delay,\n durationMs: Date.now() - startTime,\n });\n\n await this.queue.adapter.invoke({\n id,\n input: params as any,\n delay,\n });\n\n this.telemetry?.emit(IGNITER_MAIL_TELEMETRY_EVENTS.SCHEDULE_SUCCESS, {\n level: \"info\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.scheduled_at\": date.toISOString(),\n \"mail.delay_ms\": delay,\n \"mail.queue_id\": this.queue.options?.queue ?? \"mail\",\n },\n });\n\n return;\n } catch (error) {\n let normalizedError = error as IgniterMailError;\n\n if (!IgniterMailError.is(error)) {\n normalizedError = new IgniterMailError({\n code: \"MAIL_PROVIDER_SCHEDULE_FAILED\",\n message: \"MAIL_PROVIDER_SCHEDULE_FAILED\",\n cause: error,\n logger: this.logger,\n metadata: {\n to: params.to,\n template: String(params.template),\n scheduledAt: date.toISOString(),\n },\n });\n }\n\n this.telemetry?.emit(IGNITER_MAIL_TELEMETRY_EVENTS.SCHEDULE_ERROR, {\n level: \"error\",\n attributes: {\n \"mail.to\": params.to,\n \"mail.template\": String(params.template),\n \"mail.scheduled_at\": date.toISOString(),\n \"mail.error.code\": normalizedError.code,\n \"mail.error.message\": normalizedError.message,\n },\n });\n\n this.logger?.error(\"IgniterMail.schedule failed\", normalizedError);\n throw normalizedError;\n }\n }\n\n private async onSendStarted(\n params: IgniterMailSendParams<TTemplates, any>,\n ): Promise<void> {\n await this.options.onSendStarted?.(params);\n }\n\n private async onSendError(\n params: IgniterMailSendParams<TTemplates, any>,\n error: Error,\n ): Promise<void> {\n await this.options.onSendError?.(params, error);\n }\n\n private async onSendSuccess(\n params: IgniterMailSendParams<TTemplates, any>,\n ): Promise<void> {\n await this.options.onSendSuccess?.(params);\n }\n\n}\n","import type { IgniterJobQueueAdapter, IgniterLogger } from \"@igniter-js/core\";\nimport { PostmarkMailAdapter } from \"../adapters/postmark.adapter\";\nimport { ResendMailAdapter } from \"../adapters/resend.adapter\";\nimport { SendGridMailAdapter } from \"../adapters/sendgrid.adapter\";\nimport { SmtpMailAdapter } from \"../adapters/smtp.adapter\";\nimport { IgniterMailError } from \"../errors/mail.error\";\nimport type { IgniterMailAdapter } from \"../types/adapter\";\nimport type {\n IgniterMailOptions,\n IgniterMailQueueOptions,\n IgniterMailSendParams,\n IIgniterMail,\n} from \"../types/provider\";\nimport type { IgniterMailTelemetry } from \"../types/telemetry\";\nimport type { IgniterMailTemplateBuilt } from \"../types/templates\";\nimport { IgniterMailManagerCore } from \"../core/manager\";\n\n/**\n * Builder for {@link IgniterMail}.\n *\n * This API is designed to remain stable when extracted to `@igniter-js/mail`.\n */\nexport class IgniterMailBuilder<\n TTemplates extends Record<string, IgniterMailTemplateBuilt<any>> = Record<string, IgniterMailTemplateBuilt<any>>,\n> {\n private from?: string;\n private adapter?: IgniterMailAdapter;\n private templates: TTemplates = {} as TTemplates;\n private logger?: IgniterLogger;\n private telemetry?: IgniterMailTelemetry;\n private queue?: {\n adapter: IgniterJobQueueAdapter<any>;\n options?: IgniterMailQueueOptions;\n };\n\n private onSendStartedHandler?: (\n params: IgniterMailSendParams<\n TTemplates,\n any\n >,\n ) => Promise<void>;\n\n private onSendErrorHandler?: (\n params: IgniterMailSendParams<\n TTemplates,\n any\n >,\n error: Error,\n ) => Promise<void>;\n\n private onSendSuccessHandler?: (\n params: IgniterMailSendParams<\n TTemplates,\n any\n >,\n ) => Promise<void>;\n\n private constructor(\n options: IgniterMailOptions<any>,\n ) {\n this.from = options.from;\n this.adapter = options.adapter;\n this.templates = options.templates;\n this.logger = options.logger;\n this.telemetry = options.telemetry;\n this.onSendStartedHandler = options.onSendStarted;\n this.onSendErrorHandler = options.onSendError;\n this.onSendSuccessHandler = options.onSendSuccess;\n if (options.queue) {\n this.queue = {\n adapter: options.queue.adapter,\n options: options.queue.options,\n };\n }\n }\n\n /**\n * Creates a new builder.\n */\n static create() {\n return new IgniterMailBuilder<{}>({ from: '', adapter: {} as any, templates: {} });\n }\n\n /** Sets the default FROM address. */\n withFrom(from: string) {\n this.from = from;\n return this;\n }\n\n /** Attaches a logger instance. */\n withLogger(logger: IgniterLogger) {\n this.logger = logger;\n return this;\n }\n\n /** Attaches a telemetry instance for observability. */\n withTelemetry(telemetry: IgniterMailTelemetry) {\n this.telemetry = telemetry;\n return this;\n }\n\n /**\n * Enables queue delivery.\n *\n * When configured, `IgniterMail.schedule()` will enqueue jobs using the queue adapter.\n */\n withQueue(\n adapter: IgniterJobQueueAdapter<any>,\n options?: IgniterMailQueueOptions,\n ) {\n this.queue = { adapter, options };\n return this;\n }\n\n /**\n * Configures the adapter.\n *\n * - Use an adapter instance for full control.\n * - Or pass a provider key + secret for built-in adapters.\n */\n withAdapter(adapter: IgniterMailAdapter): this;\n withAdapter(provider: string, secret: string): this;\n withAdapter(adapterOrProvider: IgniterMailAdapter | string, secret?: string) {\n if (typeof adapterOrProvider === \"string\") {\n if (!secret) {\n throw new IgniterMailError({\n code: \"MAIL_PROVIDER_ADAPTER_SECRET_REQUIRED\",\n message: \"MAIL_PROVIDER_ADAPTER_SECRET_REQUIRED\",\n logger: this.logger,\n });\n }\n\n switch (adapterOrProvider) {\n case \"resend\":\n this.adapter = ResendMailAdapter.create({\n secret,\n from: this.from,\n })\n return this\n\n case \"smtp\":\n this.adapter = SmtpMailAdapter.create({\n secret,\n from: this.from,\n })\n return this\n\n case \"postmark\":\n this.adapter = PostmarkMailAdapter.create({\n secret,\n from: this.from,\n })\n return this\n\n case \"sendgrid\":\n this.adapter = SendGridMailAdapter.create({\n secret,\n from: this.from,\n })\n return this\n\n default:\n throw new IgniterMailError({\n code: \"MAIL_PROVIDER_ADAPTER_NOT_FOUND\",\n message: `MAIL_PROVIDER_ADAPTER_NOT_FOUND: ${adapterOrProvider}`,\n logger: this.logger,\n metadata: {\n provider: adapterOrProvider,\n },\n });\n }\n }\n\n this.adapter = adapterOrProvider;\n\n return this;\n }\n\n /**\n * Registers a template.\n */\n addTemplate<TKey extends string, TTemplate extends IgniterMailTemplateBuilt<any>>(\n key: TKey,\n template: TTemplate,\n ) {\n return new IgniterMailBuilder<\n TTemplates & { [K in TKey]: TTemplate }\n >({\n from: this.from!,\n adapter: this.adapter!,\n templates: {\n ...this.templates,\n [key]: template,\n } as TTemplates & { [K in TKey]: TTemplate },\n logger: this.logger,\n telemetry: this.telemetry,\n onSendStarted: this.onSendStartedHandler,\n onSendError: this.onSendErrorHandler,\n onSendSuccess: this.onSendSuccessHandler,\n queue: this.queue\n ? {\n adapter: this.queue.adapter,\n options: this.queue.options,\n }\n : undefined,\n });\n }\n\n /** Hook invoked before sending. */\n onSendStarted(\n handler: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplateBuilt<any>>,\n any\n >,\n ) => Promise<void>,\n ) {\n this.onSendStartedHandler = handler;\n return this;\n }\n\n /** Hook invoked on error. */\n onSendError(\n handler: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplateBuilt<any>>,\n any\n >,\n error: Error,\n ) => Promise<void>,\n ) {\n this.onSendErrorHandler = handler;\n return this;\n }\n\n /** Hook invoked on success. */\n onSendSuccess(\n handler: (\n params: IgniterMailSendParams<\n Record<string, IgniterMailTemplateBuilt<any>>,\n any\n >,\n ) => Promise<void>,\n ) {\n this.onSendSuccessHandler = handler;\n return this;\n }\n\n /**\n * Builds the {@link IgniterMail} instance.\n */\n build(): IIgniterMail<TTemplates> {\n if (!this.from) {\n throw new IgniterMailError({\n code: \"MAIL_PROVIDER_FROM_REQUIRED\",\n message: \"MAIL_PROVIDER_FROM_REQUIRED\",\n logger: this.logger,\n });\n }\n\n if (!this.adapter) {\n throw new IgniterMailError({\n code: \"MAIL_PROVIDER_ADAPTER_REQUIRED\",\n message: \"MAIL_PROVIDER_ADAPTER_REQUIRED\",\n logger: this.logger,\n });\n }\n\n return new IgniterMailManagerCore<TTemplates>({\n from: this.from,\n adapter: this.adapter,\n templates: this.templates as TTemplates,\n onSendStarted: this.onSendStartedHandler as any,\n onSendError: this.onSendErrorHandler as any,\n onSendSuccess: this.onSendSuccessHandler as any,\n telemetry: this.telemetry,\n logger: this.logger,\n queue: this.queue\n ? {\n adapter: this.queue.adapter,\n options: this.queue.options,\n }\n : undefined,\n });\n }\n}\n\nexport const IgniterMail = IgniterMailBuilder\n","import type { StandardSchemaV1 } from '@igniter-js/core'\nimport type { ReactElement } from 'react'\nimport { IgniterMailError } from '../errors/mail.error'\nimport type { IgniterMailTemplateBuilt } from '../types/templates'\n\n/**\n * Builder for {@link IgniterMailTemplate}.\n */\nexport class IgniterMailTemplateBuilder<TSchema extends StandardSchemaV1 = StandardSchemaV1> {\n private subject?: string\n private schema?: StandardSchemaV1\n private render?: (data: any) => ReactElement\n\n /** Creates a new builder instance. */\n static create() {\n return new IgniterMailTemplateBuilder<any>()\n }\n\n /** Sets the default subject for the template. */\n withSubject(subject: string) {\n this.subject = subject\n return this\n }\n\n /** Attaches the schema used to validate and infer payload types. */\n withSchema<TNextSchema extends StandardSchemaV1>(schema: TNextSchema) {\n this.schema = schema\n return this as unknown as IgniterMailTemplateBuilder<TNextSchema>\n }\n\n /** Sets the React Email render function for the template. */\n withRender(\n render: (\n data: StandardSchemaV1.InferInput<TSchema>,\n ) => ReactElement,\n ) {\n this.render = render as any\n return this\n }\n\n /** Builds the template definition. */\n build(): IgniterMailTemplateBuilt<TSchema> {\n if (!this.subject) {\n throw new IgniterMailError({\n code: 'MAIL_TEMPLATE_CONFIGURATION_INVALID',\n message: 'Mail template subject is required',\n })\n }\n\n if (!this.schema) {\n throw new IgniterMailError({\n code: 'MAIL_TEMPLATE_CONFIGURATION_INVALID',\n message: 'Mail template schema is required',\n })\n }\n\n if (!this.render) {\n throw new IgniterMailError({\n code: 'MAIL_TEMPLATE_CONFIGURATION_INVALID',\n message: 'Mail template render is required',\n })\n }\n\n return {\n subject: this.subject,\n schema: this.schema as TSchema,\n render: this.render as IgniterMailTemplateBuilt<TSchema>['render'],\n }\n }\n}\n\nexport const IgniterMailTemplate = IgniterMailTemplateBuilder"]}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @fileoverview Browser/client-side shim for @igniter-js/mail
3
+ * @module @igniter-js/mail/shim
4
+ *
5
+ * @description
6
+ * This module prevents @igniter-js/mail from being used in browser environments.
7
+ * The mail package depends on server-only APIs (email providers, queues) and
8
+ * should not be bundled into client-side code.
9
+ */
10
+ declare function throwServerOnlyError(): never;
11
+ declare const IgniterMail: {
12
+ create: typeof throwServerOnlyError;
13
+ };
14
+ declare const IgniterMailBuilder: {
15
+ create: typeof throwServerOnlyError;
16
+ };
17
+ declare const IgniterMailTemplate: {
18
+ create: typeof throwServerOnlyError;
19
+ };
20
+ declare const IgniterMailManager: {
21
+ create: typeof throwServerOnlyError;
22
+ };
23
+ declare const ResendMailAdapter: {
24
+ create: typeof throwServerOnlyError;
25
+ };
26
+ declare const PostmarkMailAdapter: {
27
+ create: typeof throwServerOnlyError;
28
+ };
29
+ declare const SendGridMailAdapter: {
30
+ create: typeof throwServerOnlyError;
31
+ };
32
+ declare const SmtpMailAdapter: {
33
+ create: typeof throwServerOnlyError;
34
+ };
35
+ declare const MockMailAdapter: {
36
+ create: typeof throwServerOnlyError;
37
+ };
38
+ declare class IgniterMailError extends Error {
39
+ constructor();
40
+ }
41
+
42
+ export { IgniterMail, IgniterMailBuilder, IgniterMailError, IgniterMailManager, IgniterMailTemplate, MockMailAdapter, PostmarkMailAdapter, ResendMailAdapter, SendGridMailAdapter, SmtpMailAdapter };
package/dist/shim.d.ts ADDED
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @fileoverview Browser/client-side shim for @igniter-js/mail
3
+ * @module @igniter-js/mail/shim
4
+ *
5
+ * @description
6
+ * This module prevents @igniter-js/mail from being used in browser environments.
7
+ * The mail package depends on server-only APIs (email providers, queues) and
8
+ * should not be bundled into client-side code.
9
+ */
10
+ declare function throwServerOnlyError(): never;
11
+ declare const IgniterMail: {
12
+ create: typeof throwServerOnlyError;
13
+ };
14
+ declare const IgniterMailBuilder: {
15
+ create: typeof throwServerOnlyError;
16
+ };
17
+ declare const IgniterMailTemplate: {
18
+ create: typeof throwServerOnlyError;
19
+ };
20
+ declare const IgniterMailManager: {
21
+ create: typeof throwServerOnlyError;
22
+ };
23
+ declare const ResendMailAdapter: {
24
+ create: typeof throwServerOnlyError;
25
+ };
26
+ declare const PostmarkMailAdapter: {
27
+ create: typeof throwServerOnlyError;
28
+ };
29
+ declare const SendGridMailAdapter: {
30
+ create: typeof throwServerOnlyError;
31
+ };
32
+ declare const SmtpMailAdapter: {
33
+ create: typeof throwServerOnlyError;
34
+ };
35
+ declare const MockMailAdapter: {
36
+ create: typeof throwServerOnlyError;
37
+ };
38
+ declare class IgniterMailError extends Error {
39
+ constructor();
40
+ }
41
+
42
+ export { IgniterMail, IgniterMailBuilder, IgniterMailError, IgniterMailManager, IgniterMailTemplate, MockMailAdapter, PostmarkMailAdapter, ResendMailAdapter, SendGridMailAdapter, SmtpMailAdapter };
package/dist/shim.js ADDED
@@ -0,0 +1,83 @@
1
+ 'use strict';
2
+
3
+ // src/shim.ts
4
+ var SERVER_ONLY_ERROR = `
5
+ ================================================================================
6
+ @igniter-js/mail: Server-Only Package
7
+ ================================================================================
8
+
9
+ This package cannot be used in browser/client environments.
10
+
11
+ @igniter-js/mail is designed exclusively for server-side usage because it:
12
+ - Uses server-side email provider APIs and credentials
13
+ - May integrate with job queues
14
+ - Should never run in browser bundles
15
+
16
+ SOLUTIONS:
17
+
18
+ 1. Next.js App Router:
19
+ - Use Server Components (default in app/ directory)
20
+ - Use Server Actions with "use server" directive
21
+ - Use API routes (app/api/*)
22
+
23
+ 2. Next.js Pages Router:
24
+ - Use getServerSideProps
25
+ - Use API routes (pages/api/*)
26
+
27
+ 3. Other Frameworks:
28
+ - Move email logic to server-side endpoints
29
+ - Use server-side workers or background jobs
30
+
31
+ For documentation, visit: https://igniterjs.com/docs/mail
32
+
33
+ ================================================================================
34
+ `;
35
+ function throwServerOnlyError() {
36
+ throw new Error(SERVER_ONLY_ERROR);
37
+ }
38
+ var IgniterMail = {
39
+ create: throwServerOnlyError
40
+ };
41
+ var IgniterMailBuilder = {
42
+ create: throwServerOnlyError
43
+ };
44
+ var IgniterMailTemplate = {
45
+ create: throwServerOnlyError
46
+ };
47
+ var IgniterMailManager = {
48
+ create: throwServerOnlyError
49
+ };
50
+ var ResendMailAdapter = {
51
+ create: throwServerOnlyError
52
+ };
53
+ var PostmarkMailAdapter = {
54
+ create: throwServerOnlyError
55
+ };
56
+ var SendGridMailAdapter = {
57
+ create: throwServerOnlyError
58
+ };
59
+ var SmtpMailAdapter = {
60
+ create: throwServerOnlyError
61
+ };
62
+ var MockMailAdapter = {
63
+ create: throwServerOnlyError
64
+ };
65
+ var IgniterMailError = class extends Error {
66
+ constructor() {
67
+ super(SERVER_ONLY_ERROR);
68
+ this.name = "IgniterMailError";
69
+ }
70
+ };
71
+
72
+ exports.IgniterMail = IgniterMail;
73
+ exports.IgniterMailBuilder = IgniterMailBuilder;
74
+ exports.IgniterMailError = IgniterMailError;
75
+ exports.IgniterMailManager = IgniterMailManager;
76
+ exports.IgniterMailTemplate = IgniterMailTemplate;
77
+ exports.MockMailAdapter = MockMailAdapter;
78
+ exports.PostmarkMailAdapter = PostmarkMailAdapter;
79
+ exports.ResendMailAdapter = ResendMailAdapter;
80
+ exports.SendGridMailAdapter = SendGridMailAdapter;
81
+ exports.SmtpMailAdapter = SmtpMailAdapter;
82
+ //# sourceMappingURL=shim.js.map
83
+ //# sourceMappingURL=shim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shim.ts"],"names":[],"mappings":";;;AAUA,IAAM,iBAAA,GAAoB;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;AAgC1B,SAAS,oBAAA,GAA8B;AACrC,EAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AACnC;AAEO,IAAM,WAAA,GAAc;AAAA,EACzB,MAAA,EAAQ;AACV;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,MAAA,EAAQ;AACV;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,MAAA,EAAQ;AACV;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,MAAA,EAAQ;AACV;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,MAAA,EAAQ;AACV;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,MAAA,EAAQ;AACV;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,MAAA,EAAQ;AACV;AAEO,IAAM,eAAA,GAAkB;AAAA,EAC7B,MAAA,EAAQ;AACV;AAEO,IAAM,eAAA,GAAkB;AAAA,EAC7B,MAAA,EAAQ;AACV;AAEO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,iBAAiB,CAAA;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF","file":"shim.js","sourcesContent":["/**\n * @fileoverview Browser/client-side shim for @igniter-js/mail\n * @module @igniter-js/mail/shim\n *\n * @description\n * This module prevents @igniter-js/mail from being used in browser environments.\n * The mail package depends on server-only APIs (email providers, queues) and\n * should not be bundled into client-side code.\n */\n\nconst SERVER_ONLY_ERROR = `\n================================================================================\n@igniter-js/mail: Server-Only Package\n================================================================================\n\nThis package cannot be used in browser/client environments.\n\n@igniter-js/mail is designed exclusively for server-side usage because it:\n- Uses server-side email provider APIs and credentials\n- May integrate with job queues\n- Should never run in browser bundles\n\nSOLUTIONS:\n\n1. Next.js App Router:\n - Use Server Components (default in app/ directory)\n - Use Server Actions with \"use server\" directive\n - Use API routes (app/api/*)\n\n2. Next.js Pages Router:\n - Use getServerSideProps\n - Use API routes (pages/api/*)\n\n3. Other Frameworks:\n - Move email logic to server-side endpoints\n - Use server-side workers or background jobs\n\nFor documentation, visit: https://igniterjs.com/docs/mail\n\n================================================================================\n`;\n\nfunction throwServerOnlyError(): never {\n throw new Error(SERVER_ONLY_ERROR);\n}\n\nexport const IgniterMail = {\n create: throwServerOnlyError,\n};\n\nexport const IgniterMailBuilder = {\n create: throwServerOnlyError,\n};\n\nexport const IgniterMailTemplate = {\n create: throwServerOnlyError,\n};\n\nexport const IgniterMailManager = {\n create: throwServerOnlyError,\n};\n\nexport const ResendMailAdapter = {\n create: throwServerOnlyError,\n};\n\nexport const PostmarkMailAdapter = {\n create: throwServerOnlyError,\n};\n\nexport const SendGridMailAdapter = {\n create: throwServerOnlyError,\n};\n\nexport const SmtpMailAdapter = {\n create: throwServerOnlyError,\n};\n\nexport const MockMailAdapter = {\n create: throwServerOnlyError,\n};\n\nexport class IgniterMailError extends Error {\n constructor() {\n super(SERVER_ONLY_ERROR);\n this.name = 'IgniterMailError';\n }\n}\n"]}
package/dist/shim.mjs ADDED
@@ -0,0 +1,72 @@
1
+ // src/shim.ts
2
+ var SERVER_ONLY_ERROR = `
3
+ ================================================================================
4
+ @igniter-js/mail: Server-Only Package
5
+ ================================================================================
6
+
7
+ This package cannot be used in browser/client environments.
8
+
9
+ @igniter-js/mail is designed exclusively for server-side usage because it:
10
+ - Uses server-side email provider APIs and credentials
11
+ - May integrate with job queues
12
+ - Should never run in browser bundles
13
+
14
+ SOLUTIONS:
15
+
16
+ 1. Next.js App Router:
17
+ - Use Server Components (default in app/ directory)
18
+ - Use Server Actions with "use server" directive
19
+ - Use API routes (app/api/*)
20
+
21
+ 2. Next.js Pages Router:
22
+ - Use getServerSideProps
23
+ - Use API routes (pages/api/*)
24
+
25
+ 3. Other Frameworks:
26
+ - Move email logic to server-side endpoints
27
+ - Use server-side workers or background jobs
28
+
29
+ For documentation, visit: https://igniterjs.com/docs/mail
30
+
31
+ ================================================================================
32
+ `;
33
+ function throwServerOnlyError() {
34
+ throw new Error(SERVER_ONLY_ERROR);
35
+ }
36
+ var IgniterMail = {
37
+ create: throwServerOnlyError
38
+ };
39
+ var IgniterMailBuilder = {
40
+ create: throwServerOnlyError
41
+ };
42
+ var IgniterMailTemplate = {
43
+ create: throwServerOnlyError
44
+ };
45
+ var IgniterMailManager = {
46
+ create: throwServerOnlyError
47
+ };
48
+ var ResendMailAdapter = {
49
+ create: throwServerOnlyError
50
+ };
51
+ var PostmarkMailAdapter = {
52
+ create: throwServerOnlyError
53
+ };
54
+ var SendGridMailAdapter = {
55
+ create: throwServerOnlyError
56
+ };
57
+ var SmtpMailAdapter = {
58
+ create: throwServerOnlyError
59
+ };
60
+ var MockMailAdapter = {
61
+ create: throwServerOnlyError
62
+ };
63
+ var IgniterMailError = class extends Error {
64
+ constructor() {
65
+ super(SERVER_ONLY_ERROR);
66
+ this.name = "IgniterMailError";
67
+ }
68
+ };
69
+
70
+ export { IgniterMail, IgniterMailBuilder, IgniterMailError, IgniterMailManager, IgniterMailTemplate, MockMailAdapter, PostmarkMailAdapter, ResendMailAdapter, SendGridMailAdapter, SmtpMailAdapter };
71
+ //# sourceMappingURL=shim.mjs.map
72
+ //# sourceMappingURL=shim.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shim.ts"],"names":[],"mappings":";AAUA,IAAM,iBAAA,GAAoB;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;AAgC1B,SAAS,oBAAA,GAA8B;AACrC,EAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AACnC;AAEO,IAAM,WAAA,GAAc;AAAA,EACzB,MAAA,EAAQ;AACV;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,MAAA,EAAQ;AACV;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,MAAA,EAAQ;AACV;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,MAAA,EAAQ;AACV;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,MAAA,EAAQ;AACV;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,MAAA,EAAQ;AACV;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,MAAA,EAAQ;AACV;AAEO,IAAM,eAAA,GAAkB;AAAA,EAC7B,MAAA,EAAQ;AACV;AAEO,IAAM,eAAA,GAAkB;AAAA,EAC7B,MAAA,EAAQ;AACV;AAEO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,iBAAiB,CAAA;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF","file":"shim.mjs","sourcesContent":["/**\n * @fileoverview Browser/client-side shim for @igniter-js/mail\n * @module @igniter-js/mail/shim\n *\n * @description\n * This module prevents @igniter-js/mail from being used in browser environments.\n * The mail package depends on server-only APIs (email providers, queues) and\n * should not be bundled into client-side code.\n */\n\nconst SERVER_ONLY_ERROR = `\n================================================================================\n@igniter-js/mail: Server-Only Package\n================================================================================\n\nThis package cannot be used in browser/client environments.\n\n@igniter-js/mail is designed exclusively for server-side usage because it:\n- Uses server-side email provider APIs and credentials\n- May integrate with job queues\n- Should never run in browser bundles\n\nSOLUTIONS:\n\n1. Next.js App Router:\n - Use Server Components (default in app/ directory)\n - Use Server Actions with \"use server\" directive\n - Use API routes (app/api/*)\n\n2. Next.js Pages Router:\n - Use getServerSideProps\n - Use API routes (pages/api/*)\n\n3. Other Frameworks:\n - Move email logic to server-side endpoints\n - Use server-side workers or background jobs\n\nFor documentation, visit: https://igniterjs.com/docs/mail\n\n================================================================================\n`;\n\nfunction throwServerOnlyError(): never {\n throw new Error(SERVER_ONLY_ERROR);\n}\n\nexport const IgniterMail = {\n create: throwServerOnlyError,\n};\n\nexport const IgniterMailBuilder = {\n create: throwServerOnlyError,\n};\n\nexport const IgniterMailTemplate = {\n create: throwServerOnlyError,\n};\n\nexport const IgniterMailManager = {\n create: throwServerOnlyError,\n};\n\nexport const ResendMailAdapter = {\n create: throwServerOnlyError,\n};\n\nexport const PostmarkMailAdapter = {\n create: throwServerOnlyError,\n};\n\nexport const SendGridMailAdapter = {\n create: throwServerOnlyError,\n};\n\nexport const SmtpMailAdapter = {\n create: throwServerOnlyError,\n};\n\nexport const MockMailAdapter = {\n create: throwServerOnlyError,\n};\n\nexport class IgniterMailError extends Error {\n constructor() {\n super(SERVER_ONLY_ERROR);\n this.name = 'IgniterMailError';\n }\n}\n"]}
@@ -0,0 +1,59 @@
1
+ import * as _igniter_js_telemetry from '@igniter-js/telemetry';
2
+ import { z } from 'zod';
3
+
4
+ /**
5
+ * Telemetry event definitions for `@igniter-js/mail`.
6
+ */
7
+ declare const IgniterMailTelemetryEvents: _igniter_js_telemetry.TelemetryEventsDescriptor<"igniter.mail", {
8
+ send: {
9
+ started: z.ZodObject<{
10
+ 'mail.to': z.ZodString;
11
+ 'mail.template': z.ZodString;
12
+ 'mail.subject': z.ZodOptional<z.ZodString>;
13
+ }, z.core.$strip>;
14
+ } & {
15
+ success: z.ZodObject<{
16
+ 'mail.to': z.ZodString;
17
+ 'mail.template': z.ZodString;
18
+ 'mail.subject': z.ZodOptional<z.ZodString>;
19
+ 'mail.duration_ms': z.ZodOptional<z.ZodNumber>;
20
+ }, z.core.$strip>;
21
+ } & {
22
+ error: z.ZodObject<{
23
+ 'mail.to': z.ZodString;
24
+ 'mail.template': z.ZodString;
25
+ 'mail.subject': z.ZodOptional<z.ZodString>;
26
+ 'mail.error.code': z.ZodString;
27
+ 'mail.error.message': z.ZodString;
28
+ 'mail.duration_ms': z.ZodOptional<z.ZodNumber>;
29
+ }, z.core.$strip>;
30
+ };
31
+ } & {
32
+ schedule: {
33
+ started: z.ZodObject<{
34
+ 'mail.to': z.ZodString;
35
+ 'mail.template': z.ZodString;
36
+ 'mail.scheduled_at': z.ZodString;
37
+ 'mail.delay_ms': z.ZodNumber;
38
+ }, z.core.$strip>;
39
+ } & {
40
+ success: z.ZodObject<{
41
+ 'mail.to': z.ZodString;
42
+ 'mail.template': z.ZodString;
43
+ 'mail.scheduled_at': z.ZodString;
44
+ 'mail.delay_ms': z.ZodNumber;
45
+ 'mail.queue_id': z.ZodOptional<z.ZodString>;
46
+ }, z.core.$strip>;
47
+ } & {
48
+ error: z.ZodObject<{
49
+ 'mail.to': z.ZodString;
50
+ 'mail.template': z.ZodString;
51
+ 'mail.scheduled_at': z.ZodString;
52
+ 'mail.error.code': z.ZodString;
53
+ 'mail.error.message': z.ZodString;
54
+ }, z.core.$strip>;
55
+ };
56
+ }>;
57
+ type IgniterMailTelemetryEvents = typeof IgniterMailTelemetryEvents;
58
+
59
+ export { IgniterMailTelemetryEvents };