@geekmidas/emailkit 10.0.0-alpha.99 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/client-BkN5BGeJ.mjs +58 -0
  3. package/dist/client-BkN5BGeJ.mjs.map +1 -0
  4. package/dist/client-BrzAoy26.d.mts +21 -0
  5. package/dist/client-BrzAoy26.d.mts.map +1 -0
  6. package/dist/client-CGKPzbG7.d.cts +21 -0
  7. package/dist/client-CGKPzbG7.d.cts.map +1 -0
  8. package/dist/client-sZNHPYYg.cjs +92 -0
  9. package/dist/client-sZNHPYYg.cjs.map +1 -0
  10. package/dist/client.cjs +3 -124
  11. package/dist/client.d.cts +3 -23
  12. package/dist/client.d.mts +3 -23
  13. package/dist/client.mjs +2 -99
  14. package/dist/index.cjs +3 -9
  15. package/dist/index.d.cts +3 -5
  16. package/dist/index.d.mts +3 -5
  17. package/dist/index.mjs +3 -4
  18. package/dist/types-CLVcanCB.d.cts +83 -0
  19. package/dist/types-CLVcanCB.d.cts.map +1 -0
  20. package/dist/types-FrE6exSX.d.mts +83 -0
  21. package/dist/types-FrE6exSX.d.mts.map +1 -0
  22. package/dist/types.d.cts +2 -88
  23. package/dist/types.d.mts +2 -88
  24. package/dist/types.mjs +0 -1
  25. package/package.json +9 -25
  26. package/src/__tests__/client.spec.ts +372 -0
  27. package/src/__tests__/client.spec.tsx +185 -0
  28. package/src/client.ts +90 -0
  29. package/src/index.ts +11 -0
  30. package/src/types.ts +99 -0
  31. package/tsconfig.json +10 -0
  32. package/dist/client.cjs.map +0 -1
  33. package/dist/client.d.cts.map +0 -1
  34. package/dist/client.d.mts.map +0 -1
  35. package/dist/client.mjs.map +0 -1
  36. package/dist/errors.cjs +0 -53
  37. package/dist/errors.cjs.map +0 -1
  38. package/dist/errors.d.cts +0 -39
  39. package/dist/errors.d.cts.map +0 -1
  40. package/dist/errors.d.mts +0 -39
  41. package/dist/errors.d.mts.map +0 -1
  42. package/dist/errors.mjs +0 -50
  43. package/dist/errors.mjs.map +0 -1
  44. package/dist/types.d.cts.map +0 -1
  45. package/dist/types.d.mts.map +0 -1
  46. package/dist/url.cjs +0 -61
  47. package/dist/url.cjs.map +0 -1
  48. package/dist/url.d.cts +0 -16
  49. package/dist/url.d.cts.map +0 -1
  50. package/dist/url.d.mts +0 -16
  51. package/dist/url.d.mts.map +0 -1
  52. package/dist/url.mjs +0 -60
  53. package/dist/url.mjs.map +0 -1
package/CHANGELOG.md ADDED
@@ -0,0 +1,42 @@
1
+ # @geekmidas/emailkit
2
+
3
+ ## 10.0.0
4
+
5
+ ## 9.0.2
6
+
7
+ ### Patch Changes
8
+
9
+ - [#12](https://github.com/geekmidas/toolbox/pull/12) [`d53863a`](https://github.com/geekmidas/toolbox/commit/d53863a84db2e4ab5420e08f79128b637043fc42) Thanks [@geekmidas](https://github.com/geekmidas)! - Align every published package on a single version and keep them in step.
10
+
11
+ All packages now share one version, enforced by a changesets `fixed` group. The
12
+ baseline is 9.0.1 — @geekmidas/client's published version — so nothing moves
13
+ backwards; this release takes the whole set to 9.0.2 together.
14
+
15
+ Independent versions made "which version of the docs applies to me"
16
+ unanswerable: a reader on constructs@7 and cli@2 was on no version at all. One
17
+ number per release makes versioned documentation possible, and lets 9 freeze as
18
+ the current paradigm while the constructs rework is developed against it.
19
+
20
+ Every release now publishes every package, and a major anywhere is a major
21
+ everywhere. Peer ranges get simpler in return.
22
+
23
+ ## 1.0.2
24
+
25
+ ### Patch Changes
26
+
27
+ - 🐛 [#11](https://github.com/geekmidas/toolbox/pull/11) [`40f4dc0`](https://github.com/geekmidas/toolbox/commit/40f4dc095911b2223a255029d8f776caf7781309) Thanks [@geekmidas](https://github.com/geekmidas)! - Patch release across all packages to realign published versions with the
28
+ registry. The previous release only published the four packages that had
29
+ version bumps; the remaining packages failed with "cannot publish over the
30
+ previously published versions" because their versions were unchanged.
31
+
32
+ ## 1.0.1
33
+
34
+ ### Patch Changes
35
+
36
+ - 🐛 [`d70c6c0`](https://github.com/geekmidas/toolbox/commit/d70c6c0aeb8a79da2473ac77dbd8255a4a2f5651) Thanks [@geekmidas](https://github.com/geekmidas)! - Fix `package.json` exports so TypeScript declarations resolve correctly under NodeNext/Bundler module resolution. Each subpath export now nests `types` inside its `import`/`require` condition, pointing at the `.d.mts` and `.d.cts` files that `tsdown` actually emits (previously the exports referenced non-existent `.d.ts` files, causing type-resolution failures for consumers). Both ESM (`.mjs`) and CJS (`.cjs`) runtime entry points are preserved. Additionally, `@geekmidas/ui` had `import` paths pointing at `.js` files that were never emitted — those are corrected to `.mjs`.
37
+
38
+ ## 1.0.0
39
+
40
+ ### Major Changes
41
+
42
+ - [`ff7b115`](https://github.com/geekmidas/toolbox/commit/ff7b11599f60f84ac6cdc73714c853ecf786b2e8) Thanks [@geekmidas](https://github.com/geekmidas)! - Version 1 Stable release
@@ -0,0 +1,58 @@
1
+ import { render } from "@react-email/components";
2
+ import nodemailer from "nodemailer";
3
+
4
+ //#region src/client.ts
5
+ var SMTPClient = class {
6
+ transporter;
7
+ config;
8
+ constructor(config) {
9
+ this.config = config;
10
+ this.transporter = nodemailer.createTransport(config.smtp);
11
+ }
12
+ async send(options) {
13
+ const mailOptions = {
14
+ ...this.config.defaults,
15
+ ...options
16
+ };
17
+ if (!mailOptions.from) throw new Error("The \"from\" field is required in email options or defaults");
18
+ if (!mailOptions.text && !mailOptions.html) throw new Error("Either text or html content must be provided");
19
+ const info = await this.transporter.sendMail(mailOptions);
20
+ return {
21
+ messageId: info.messageId,
22
+ accepted: info.accepted || [],
23
+ rejected: info.rejected || [],
24
+ response: info.response
25
+ };
26
+ }
27
+ async sendTemplate(template, options) {
28
+ const Component = this.config.templates[template];
29
+ if (!Component) throw new Error(`Template "${String(template)}" not found`);
30
+ const element = Component(options.props);
31
+ const html = await render(element);
32
+ return this.send({
33
+ ...options,
34
+ html
35
+ });
36
+ }
37
+ async verify() {
38
+ try {
39
+ await this.transporter.verify();
40
+ return true;
41
+ } catch {
42
+ return false;
43
+ }
44
+ }
45
+ async close() {
46
+ this.transporter.close();
47
+ }
48
+ getTemplateNames() {
49
+ return Object.keys(this.config.templates);
50
+ }
51
+ };
52
+ function createEmailClient(config) {
53
+ return new SMTPClient(config);
54
+ }
55
+
56
+ //#endregion
57
+ export { SMTPClient, createEmailClient };
58
+ //# sourceMappingURL=client-BkN5BGeJ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-BkN5BGeJ.mjs","names":["config: EmailClientConfig<T>","options: SendOptions","template: K","options: Omit<SendOptions, 'template'> & {\n\t\t\tprops: TemplatePropsFor<T, K>;\n\t\t}"],"sources":["../src/client.ts"],"sourcesContent":["import { render } from '@react-email/components';\nimport nodemailer, { type Transporter } from 'nodemailer';\nimport type {\n\tEmailClient,\n\tEmailClientConfig,\n\tSendOptions,\n\tSendResult,\n\tTemplateNames,\n\tTemplatePropsFor,\n\tTemplateRecord,\n} from './types';\n\nexport class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {\n\tprivate transporter: Transporter;\n\tprivate config: EmailClientConfig<T>;\n\n\tconstructor(config: EmailClientConfig<T>) {\n\t\tthis.config = config;\n\t\tthis.transporter = nodemailer.createTransport(config.smtp as any);\n\t}\n\n\tasync send(options: SendOptions): Promise<SendResult> {\n\t\tconst mailOptions = {\n\t\t\t...this.config.defaults,\n\t\t\t...options,\n\t\t};\n\n\t\tif (!mailOptions.from) {\n\t\t\tthrow new Error(\n\t\t\t\t'The \"from\" field is required in email options or defaults',\n\t\t\t);\n\t\t}\n\n\t\tif (!mailOptions.text && !mailOptions.html) {\n\t\t\tthrow new Error('Either text or html content must be provided');\n\t\t}\n\n\t\tconst info = await this.transporter.sendMail(mailOptions);\n\n\t\treturn {\n\t\t\tmessageId: info.messageId,\n\t\t\taccepted: info.accepted || [],\n\t\t\trejected: info.rejected || [],\n\t\t\tresponse: info.response,\n\t\t};\n\t}\n\n\tasync sendTemplate<K extends TemplateNames<T>>(\n\t\ttemplate: K,\n\t\toptions: Omit<SendOptions, 'template'> & {\n\t\t\tprops: TemplatePropsFor<T, K>;\n\t\t},\n\t): Promise<SendResult> {\n\t\tconst Component = this.config.templates[template];\n\t\tif (!Component) {\n\t\t\tthrow new Error(`Template \"${String(template)}\" not found`);\n\t\t}\n\n\t\tconst element = Component(options.props);\n\t\tconst html = await render(element);\n\n\t\treturn this.send({\n\t\t\t...options,\n\t\t\thtml,\n\t\t});\n\t}\n\n\tasync verify(): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this.transporter.verify();\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync close(): Promise<void> {\n\t\tthis.transporter.close();\n\t}\n\n\tgetTemplateNames(): TemplateNames<T>[] {\n\t\treturn Object.keys(this.config.templates) as TemplateNames<T>[];\n\t}\n}\n\nexport function createEmailClient<T extends TemplateRecord>(\n\tconfig: EmailClientConfig<T>,\n): SMTPClient<T> {\n\treturn new SMTPClient(config);\n}\n"],"mappings":";;;;AAYA,IAAa,aAAb,MAA4E;CAC3E,AAAQ;CACR,AAAQ;CAER,YAAYA,QAA8B;AACzC,OAAK,SAAS;AACd,OAAK,cAAc,WAAW,gBAAgB,OAAO,KAAY;CACjE;CAED,MAAM,KAAKC,SAA2C;EACrD,MAAM,cAAc;GACnB,GAAG,KAAK,OAAO;GACf,GAAG;EACH;AAED,OAAK,YAAY,KAChB,OAAM,IAAI,MACT;AAIF,OAAK,YAAY,SAAS,YAAY,KACrC,OAAM,IAAI,MAAM;EAGjB,MAAM,OAAO,MAAM,KAAK,YAAY,SAAS,YAAY;AAEzD,SAAO;GACN,WAAW,KAAK;GAChB,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK;EACf;CACD;CAED,MAAM,aACLC,UACAC,SAGsB;EACtB,MAAM,YAAY,KAAK,OAAO,UAAU;AACxC,OAAK,UACJ,OAAM,IAAI,OAAO,YAAY,OAAO,SAAS,CAAC;EAG/C,MAAM,UAAU,UAAU,QAAQ,MAAM;EACxC,MAAM,OAAO,MAAM,OAAO,QAAQ;AAElC,SAAO,KAAK,KAAK;GAChB,GAAG;GACH;EACA,EAAC;CACF;CAED,MAAM,SAA2B;AAChC,MAAI;AACH,SAAM,KAAK,YAAY,QAAQ;AAC/B,UAAO;EACP,QAAO;AACP,UAAO;EACP;CACD;CAED,MAAM,QAAuB;AAC5B,OAAK,YAAY,OAAO;CACxB;CAED,mBAAuC;AACtC,SAAO,OAAO,KAAK,KAAK,OAAO,UAAU;CACzC;AACD;AAED,SAAgB,kBACfH,QACgB;AAChB,QAAO,IAAI,WAAW;AACtB"}
@@ -0,0 +1,21 @@
1
+ import { EmailClient, EmailClientConfig, SendOptions, SendResult, TemplateNames, TemplatePropsFor, TemplateRecord } from "./types-FrE6exSX.mjs";
2
+
3
+ //#region src/client.d.ts
4
+ declare class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {
5
+ private transporter;
6
+ private config;
7
+ constructor(config: EmailClientConfig<T>);
8
+ send(options: SendOptions): Promise<SendResult>;
9
+ sendTemplate<K extends TemplateNames<T>>(template: K, options: Omit<SendOptions, 'template'> & {
10
+ props: TemplatePropsFor<T, K>;
11
+ }): Promise<SendResult>;
12
+ verify(): Promise<boolean>;
13
+ close(): Promise<void>;
14
+ getTemplateNames(): TemplateNames<T>[];
15
+ }
16
+ declare function createEmailClient<T extends TemplateRecord>(config: EmailClientConfig<T>): SMTPClient<T>;
17
+ //# sourceMappingURL=client.d.ts.map
18
+
19
+ //#endregion
20
+ export { SMTPClient, createEmailClient };
21
+ //# sourceMappingURL=client-BrzAoy26.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-BrzAoy26.d.mts","names":[],"sources":["../src/client.ts"],"sourcesContent":[],"mappings":";;;cAYa,qBAAqB,2BAA2B,YAAY;;EAA5D,QAAA,MAAU;EAAA,WAAA,CAAA,MAAA,EAIF,iBAJE,CAIgB,CAJhB,CAAA;EAAA,IAAW,CAAA,OAAA,EASb,WATa,CAAA,EASC,OATD,CASS,UATT,CAAA;EAAc,YAAyB,CAAA,UAmC3C,aAnC2C,CAmC7B,CAnC6B,CAAA,CAAA,CAAA,QAAA,EAoC7D,CApC6D,EAAA,OAAA,EAqC9D,IArC8D,CAqCzD,WArCyD,EAAA,UAAA,CAAA,GAAA;IAIlC,KAAA,EAkC7B,gBAlC6B,CAkCZ,CAlCY,EAkCT,CAlCS,CAAA;EAAC,CAAA,CAAA,EAoCpC,OApCiB,CAoCT,UApCS,CAAA;EAAiB,MAKjB,CAAA,CAAA,EA8CJ,OA9CI,CAAA,OAAA,CAAA;EAAW,KAAW,CAAA,CAAA,EAuD3B,OAvD2B,CAAA,IAAA,CAAA;EAAU,gBAAlB,CAAA,CAAA,EA2Dd,aA3Dc,CA2DA,CA3DA,CAAA,EAAA;;AA0BL,iBAsCd,iBAtCc,CAAA,UAsCc,cAtCd,CAAA,CAAA,MAAA,EAuCrB,iBAvCqB,CAuCH,CAvCG,CAAA,CAAA,EAwC3B,UAxC2B,CAwChB,CAxCgB,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { EmailClient, EmailClientConfig, SendOptions, SendResult, TemplateNames, TemplatePropsFor, TemplateRecord } from "./types-CLVcanCB.cjs";
2
+
3
+ //#region src/client.d.ts
4
+ declare class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {
5
+ private transporter;
6
+ private config;
7
+ constructor(config: EmailClientConfig<T>);
8
+ send(options: SendOptions): Promise<SendResult>;
9
+ sendTemplate<K extends TemplateNames<T>>(template: K, options: Omit<SendOptions, 'template'> & {
10
+ props: TemplatePropsFor<T, K>;
11
+ }): Promise<SendResult>;
12
+ verify(): Promise<boolean>;
13
+ close(): Promise<void>;
14
+ getTemplateNames(): TemplateNames<T>[];
15
+ }
16
+ declare function createEmailClient<T extends TemplateRecord>(config: EmailClientConfig<T>): SMTPClient<T>;
17
+ //# sourceMappingURL=client.d.ts.map
18
+
19
+ //#endregion
20
+ export { SMTPClient, createEmailClient };
21
+ //# sourceMappingURL=client-CGKPzbG7.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-CGKPzbG7.d.cts","names":[],"sources":["../src/client.ts"],"sourcesContent":[],"mappings":";;;cAYa,qBAAqB,2BAA2B,YAAY;;EAA5D,QAAA,MAAU;EAAA,WAAA,CAAA,MAAA,EAIF,iBAJE,CAIgB,CAJhB,CAAA;EAAA,IAAW,CAAA,OAAA,EASb,WATa,CAAA,EASC,OATD,CASS,UATT,CAAA;EAAc,YAAyB,CAAA,UAmC3C,aAnC2C,CAmC7B,CAnC6B,CAAA,CAAA,CAAA,QAAA,EAoC7D,CApC6D,EAAA,OAAA,EAqC9D,IArC8D,CAqCzD,WArCyD,EAAA,UAAA,CAAA,GAAA;IAIlC,KAAA,EAkC7B,gBAlC6B,CAkCZ,CAlCY,EAkCT,CAlCS,CAAA;EAAC,CAAA,CAAA,EAoCpC,OApCiB,CAoCT,UApCS,CAAA;EAAiB,MAKjB,CAAA,CAAA,EA8CJ,OA9CI,CAAA,OAAA,CAAA;EAAW,KAAW,CAAA,CAAA,EAuD3B,OAvD2B,CAAA,IAAA,CAAA;EAAU,gBAAlB,CAAA,CAAA,EA2Dd,aA3Dc,CA2DA,CA3DA,CAAA,EAAA;;AA0BL,iBAsCd,iBAtCc,CAAA,UAsCc,cAtCd,CAAA,CAAA,MAAA,EAuCrB,iBAvCqB,CAuCH,CAvCG,CAAA,CAAA,EAwC3B,UAxC2B,CAwChB,CAxCgB,CAAA"}
@@ -0,0 +1,92 @@
1
+ //#region rolldown:runtime
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
19
+ value: mod,
20
+ enumerable: true
21
+ }) : target, mod));
22
+
23
+ //#endregion
24
+ const __react_email_components = __toESM(require("@react-email/components"));
25
+ const nodemailer = __toESM(require("nodemailer"));
26
+
27
+ //#region src/client.ts
28
+ var SMTPClient = class {
29
+ transporter;
30
+ config;
31
+ constructor(config) {
32
+ this.config = config;
33
+ this.transporter = nodemailer.default.createTransport(config.smtp);
34
+ }
35
+ async send(options) {
36
+ const mailOptions = {
37
+ ...this.config.defaults,
38
+ ...options
39
+ };
40
+ if (!mailOptions.from) throw new Error("The \"from\" field is required in email options or defaults");
41
+ if (!mailOptions.text && !mailOptions.html) throw new Error("Either text or html content must be provided");
42
+ const info = await this.transporter.sendMail(mailOptions);
43
+ return {
44
+ messageId: info.messageId,
45
+ accepted: info.accepted || [],
46
+ rejected: info.rejected || [],
47
+ response: info.response
48
+ };
49
+ }
50
+ async sendTemplate(template, options) {
51
+ const Component = this.config.templates[template];
52
+ if (!Component) throw new Error(`Template "${String(template)}" not found`);
53
+ const element = Component(options.props);
54
+ const html = await (0, __react_email_components.render)(element);
55
+ return this.send({
56
+ ...options,
57
+ html
58
+ });
59
+ }
60
+ async verify() {
61
+ try {
62
+ await this.transporter.verify();
63
+ return true;
64
+ } catch {
65
+ return false;
66
+ }
67
+ }
68
+ async close() {
69
+ this.transporter.close();
70
+ }
71
+ getTemplateNames() {
72
+ return Object.keys(this.config.templates);
73
+ }
74
+ };
75
+ function createEmailClient(config) {
76
+ return new SMTPClient(config);
77
+ }
78
+
79
+ //#endregion
80
+ Object.defineProperty(exports, 'SMTPClient', {
81
+ enumerable: true,
82
+ get: function () {
83
+ return SMTPClient;
84
+ }
85
+ });
86
+ Object.defineProperty(exports, 'createEmailClient', {
87
+ enumerable: true,
88
+ get: function () {
89
+ return createEmailClient;
90
+ }
91
+ });
92
+ //# sourceMappingURL=client-sZNHPYYg.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-sZNHPYYg.cjs","names":["config: EmailClientConfig<T>","options: SendOptions","template: K","options: Omit<SendOptions, 'template'> & {\n\t\t\tprops: TemplatePropsFor<T, K>;\n\t\t}"],"sources":["../src/client.ts"],"sourcesContent":["import { render } from '@react-email/components';\nimport nodemailer, { type Transporter } from 'nodemailer';\nimport type {\n\tEmailClient,\n\tEmailClientConfig,\n\tSendOptions,\n\tSendResult,\n\tTemplateNames,\n\tTemplatePropsFor,\n\tTemplateRecord,\n} from './types';\n\nexport class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {\n\tprivate transporter: Transporter;\n\tprivate config: EmailClientConfig<T>;\n\n\tconstructor(config: EmailClientConfig<T>) {\n\t\tthis.config = config;\n\t\tthis.transporter = nodemailer.createTransport(config.smtp as any);\n\t}\n\n\tasync send(options: SendOptions): Promise<SendResult> {\n\t\tconst mailOptions = {\n\t\t\t...this.config.defaults,\n\t\t\t...options,\n\t\t};\n\n\t\tif (!mailOptions.from) {\n\t\t\tthrow new Error(\n\t\t\t\t'The \"from\" field is required in email options or defaults',\n\t\t\t);\n\t\t}\n\n\t\tif (!mailOptions.text && !mailOptions.html) {\n\t\t\tthrow new Error('Either text or html content must be provided');\n\t\t}\n\n\t\tconst info = await this.transporter.sendMail(mailOptions);\n\n\t\treturn {\n\t\t\tmessageId: info.messageId,\n\t\t\taccepted: info.accepted || [],\n\t\t\trejected: info.rejected || [],\n\t\t\tresponse: info.response,\n\t\t};\n\t}\n\n\tasync sendTemplate<K extends TemplateNames<T>>(\n\t\ttemplate: K,\n\t\toptions: Omit<SendOptions, 'template'> & {\n\t\t\tprops: TemplatePropsFor<T, K>;\n\t\t},\n\t): Promise<SendResult> {\n\t\tconst Component = this.config.templates[template];\n\t\tif (!Component) {\n\t\t\tthrow new Error(`Template \"${String(template)}\" not found`);\n\t\t}\n\n\t\tconst element = Component(options.props);\n\t\tconst html = await render(element);\n\n\t\treturn this.send({\n\t\t\t...options,\n\t\t\thtml,\n\t\t});\n\t}\n\n\tasync verify(): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this.transporter.verify();\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync close(): Promise<void> {\n\t\tthis.transporter.close();\n\t}\n\n\tgetTemplateNames(): TemplateNames<T>[] {\n\t\treturn Object.keys(this.config.templates) as TemplateNames<T>[];\n\t}\n}\n\nexport function createEmailClient<T extends TemplateRecord>(\n\tconfig: EmailClientConfig<T>,\n): SMTPClient<T> {\n\treturn new SMTPClient(config);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,IAAa,aAAb,MAA4E;CAC3E,AAAQ;CACR,AAAQ;CAER,YAAYA,QAA8B;AACzC,OAAK,SAAS;AACd,OAAK,cAAc,mBAAW,gBAAgB,OAAO,KAAY;CACjE;CAED,MAAM,KAAKC,SAA2C;EACrD,MAAM,cAAc;GACnB,GAAG,KAAK,OAAO;GACf,GAAG;EACH;AAED,OAAK,YAAY,KAChB,OAAM,IAAI,MACT;AAIF,OAAK,YAAY,SAAS,YAAY,KACrC,OAAM,IAAI,MAAM;EAGjB,MAAM,OAAO,MAAM,KAAK,YAAY,SAAS,YAAY;AAEzD,SAAO;GACN,WAAW,KAAK;GAChB,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK;EACf;CACD;CAED,MAAM,aACLC,UACAC,SAGsB;EACtB,MAAM,YAAY,KAAK,OAAO,UAAU;AACxC,OAAK,UACJ,OAAM,IAAI,OAAO,YAAY,OAAO,SAAS,CAAC;EAG/C,MAAM,UAAU,UAAU,QAAQ,MAAM;EACxC,MAAM,OAAO,MAAM,qCAAO,QAAQ;AAElC,SAAO,KAAK,KAAK;GAChB,GAAG;GACH;EACA,EAAC;CACF;CAED,MAAM,SAA2B;AAChC,MAAI;AACH,SAAM,KAAK,YAAY,QAAQ;AAC/B,UAAO;EACP,QAAO;AACP,UAAO;EACP;CACD;CAED,MAAM,QAAuB;AAC5B,OAAK,YAAY,OAAO;CACxB;CAED,mBAAuC;AACtC,SAAO,OAAO,KAAK,KAAK,OAAO,UAAU;CACzC;AACD;AAED,SAAgB,kBACfH,QACgB;AAChB,QAAO,IAAI,WAAW;AACtB"}
package/dist/client.cjs CHANGED
@@ -1,125 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region \0rolldown/runtime.js
3
- var __create = Object.create;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
- var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getProtoOf = Object.getPrototypeOf;
8
- var __hasOwnProp = Object.prototype.hasOwnProperty;
9
- var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
- key = keys[i];
12
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
13
- get: ((k) => from[k]).bind(null, key),
14
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
- });
16
- }
17
- return to;
18
- };
19
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
20
- value: mod,
21
- enumerable: true
22
- }) : target, mod));
23
- //#endregion
24
- let _opentelemetry_api = require("@opentelemetry/api");
25
- let _react_email_components = require("@react-email/components");
26
- let nodemailer = require("nodemailer");
27
- nodemailer = __toESM(nodemailer, 1);
28
- //#region src/client.ts
29
- var SMTPClient = class {
30
- transporter;
31
- config;
32
- constructor(config) {
33
- this.config = config;
34
- this.transporter = nodemailer.default.createTransport(config.smtp);
35
- }
36
- /**
37
- * Send one message. An `email.send` span covers it, through the global
38
- * OpenTelemetry tracer: the transport and how many were accepted or
39
- * rejected, never an address, subject or body.
40
- */
41
- async send(options) {
42
- return traceSend({ "email.recipients": recipients(options) }, () => this.deliver(options));
43
- }
44
- async deliver(options) {
45
- const mailOptions = {
46
- ...this.config.defaults,
47
- ...options
48
- };
49
- if (!mailOptions.from) throw new Error("The \"from\" field is required in email options or defaults");
50
- if (!mailOptions.text && !mailOptions.html) throw new Error("Either text or html content must be provided");
51
- const info = await this.transporter.sendMail(mailOptions);
52
- return {
53
- messageId: info.messageId,
54
- accepted: info.accepted || [],
55
- rejected: info.rejected || [],
56
- response: info.response
57
- };
58
- }
59
- async sendTemplate(template, options) {
60
- const Component = this.config.templates[template];
61
- if (!Component) throw new Error(`Template "${String(template)}" not found`);
62
- const element = Component(options.props);
63
- const html = await (0, _react_email_components.render)(element);
64
- return traceSend({
65
- "email.template": String(template),
66
- "email.recipients": recipients(options)
67
- }, () => this.deliver({
68
- ...options,
69
- html
70
- }));
71
- }
72
- async verify() {
73
- try {
74
- await this.transporter.verify();
75
- return true;
76
- } catch {
77
- return false;
78
- }
79
- }
80
- async close() {
81
- this.transporter.close();
82
- }
83
- getTemplateNames() {
84
- return Object.keys(this.config.templates);
85
- }
86
- };
87
- function createEmailClient(config) {
88
- return new SMTPClient(config);
89
- }
90
- /** How many addresses a message is for: to, cc and bcc. */
91
- function recipients(options) {
92
- return count(options.to) + count(options.cc) + count(options.bcc);
93
- }
94
- function count(value) {
95
- if (!value) return 0;
96
- return Array.isArray(value) ? value.length : 1;
97
- }
98
- async function traceSend(attributes, send) {
99
- const span = _opentelemetry_api.trace.getTracer("@geekmidas/emailkit").startSpan("email.send", {
100
- kind: _opentelemetry_api.SpanKind.CLIENT,
101
- attributes: {
102
- "email.transport": "smtp",
103
- ...attributes
104
- }
105
- });
106
- try {
107
- const result = await send();
108
- if (result.accepted.length || result.rejected.length) span.setAttributes({
109
- "email.accepted": count(result.accepted),
110
- "email.rejected": count(result.rejected)
111
- });
112
- return result;
113
- } catch (error) {
114
- if (error instanceof Error) span.recordException(error);
115
- span.setStatus({ code: _opentelemetry_api.SpanStatusCode.ERROR });
116
- throw error;
117
- } finally {
118
- span.end();
119
- }
120
- }
121
- //#endregion
122
- exports.SMTPClient = SMTPClient;
123
- exports.createEmailClient = createEmailClient;
1
+ const require_client = require('./client-sZNHPYYg.cjs');
124
2
 
125
- //# sourceMappingURL=client.cjs.map
3
+ exports.SMTPClient = require_client.SMTPClient;
4
+ exports.createEmailClient = require_client.createEmailClient;
package/dist/client.d.cts CHANGED
@@ -1,23 +1,3 @@
1
- import { EmailClient, EmailClientConfig, SendOptions, SendResult, TemplateNames, TemplatePropsFor, TemplateRecord } from "./types.cjs";
2
- //#region src/client.d.ts
3
- export declare class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {
4
- private transporter;
5
- private config;
6
- constructor(config: EmailClientConfig<T>);
7
- /**
8
- * Send one message. An `email.send` span covers it, through the global
9
- * OpenTelemetry tracer: the transport and how many were accepted or
10
- * rejected, never an address, subject or body.
11
- */
12
- send(options: SendOptions): Promise<SendResult>;
13
- private deliver;
14
- sendTemplate<K extends TemplateNames<T>>(template: K, options: Omit<SendOptions, 'template'> & {
15
- props: TemplatePropsFor<T, K>;
16
- }): Promise<SendResult>;
17
- verify(): Promise<boolean>;
18
- close(): Promise<void>;
19
- getTemplateNames(): TemplateNames<T>[];
20
- }
21
- export declare function createEmailClient<T extends TemplateRecord>(config: EmailClientConfig<T>): SMTPClient<T>;
22
- //#endregion
23
- //# sourceMappingURL=client.d.cts.map
1
+ import "./types-CLVcanCB.cjs";
2
+ import { SMTPClient, createEmailClient } from "./client-CGKPzbG7.cjs";
3
+ export { SMTPClient, createEmailClient };
package/dist/client.d.mts CHANGED
@@ -1,23 +1,3 @@
1
- import { EmailClient, EmailClientConfig, SendOptions, SendResult, TemplateNames, TemplatePropsFor, TemplateRecord } from "./types.mjs";
2
- //#region src/client.d.ts
3
- export declare class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {
4
- private transporter;
5
- private config;
6
- constructor(config: EmailClientConfig<T>);
7
- /**
8
- * Send one message. An `email.send` span covers it, through the global
9
- * OpenTelemetry tracer: the transport and how many were accepted or
10
- * rejected, never an address, subject or body.
11
- */
12
- send(options: SendOptions): Promise<SendResult>;
13
- private deliver;
14
- sendTemplate<K extends TemplateNames<T>>(template: K, options: Omit<SendOptions, 'template'> & {
15
- props: TemplatePropsFor<T, K>;
16
- }): Promise<SendResult>;
17
- verify(): Promise<boolean>;
18
- close(): Promise<void>;
19
- getTemplateNames(): TemplateNames<T>[];
20
- }
21
- export declare function createEmailClient<T extends TemplateRecord>(config: EmailClientConfig<T>): SMTPClient<T>;
22
- //#endregion
23
- //# sourceMappingURL=client.d.mts.map
1
+ import "./types-FrE6exSX.mjs";
2
+ import { SMTPClient, createEmailClient } from "./client-BrzAoy26.mjs";
3
+ export { SMTPClient, createEmailClient };
package/dist/client.mjs CHANGED
@@ -1,100 +1,3 @@
1
- import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
2
- import { render } from "@react-email/components";
3
- import nodemailer from "nodemailer";
4
- //#region src/client.ts
5
- var SMTPClient = class {
6
- transporter;
7
- config;
8
- constructor(config) {
9
- this.config = config;
10
- this.transporter = nodemailer.createTransport(config.smtp);
11
- }
12
- /**
13
- * Send one message. An `email.send` span covers it, through the global
14
- * OpenTelemetry tracer: the transport and how many were accepted or
15
- * rejected, never an address, subject or body.
16
- */
17
- async send(options) {
18
- return traceSend({ "email.recipients": recipients(options) }, () => this.deliver(options));
19
- }
20
- async deliver(options) {
21
- const mailOptions = {
22
- ...this.config.defaults,
23
- ...options
24
- };
25
- if (!mailOptions.from) throw new Error("The \"from\" field is required in email options or defaults");
26
- if (!mailOptions.text && !mailOptions.html) throw new Error("Either text or html content must be provided");
27
- const info = await this.transporter.sendMail(mailOptions);
28
- return {
29
- messageId: info.messageId,
30
- accepted: info.accepted || [],
31
- rejected: info.rejected || [],
32
- response: info.response
33
- };
34
- }
35
- async sendTemplate(template, options) {
36
- const Component = this.config.templates[template];
37
- if (!Component) throw new Error(`Template "${String(template)}" not found`);
38
- const element = Component(options.props);
39
- const html = await render(element);
40
- return traceSend({
41
- "email.template": String(template),
42
- "email.recipients": recipients(options)
43
- }, () => this.deliver({
44
- ...options,
45
- html
46
- }));
47
- }
48
- async verify() {
49
- try {
50
- await this.transporter.verify();
51
- return true;
52
- } catch {
53
- return false;
54
- }
55
- }
56
- async close() {
57
- this.transporter.close();
58
- }
59
- getTemplateNames() {
60
- return Object.keys(this.config.templates);
61
- }
62
- };
63
- function createEmailClient(config) {
64
- return new SMTPClient(config);
65
- }
66
- /** How many addresses a message is for: to, cc and bcc. */
67
- function recipients(options) {
68
- return count(options.to) + count(options.cc) + count(options.bcc);
69
- }
70
- function count(value) {
71
- if (!value) return 0;
72
- return Array.isArray(value) ? value.length : 1;
73
- }
74
- async function traceSend(attributes, send) {
75
- const span = trace.getTracer("@geekmidas/emailkit").startSpan("email.send", {
76
- kind: SpanKind.CLIENT,
77
- attributes: {
78
- "email.transport": "smtp",
79
- ...attributes
80
- }
81
- });
82
- try {
83
- const result = await send();
84
- if (result.accepted.length || result.rejected.length) span.setAttributes({
85
- "email.accepted": count(result.accepted),
86
- "email.rejected": count(result.rejected)
87
- });
88
- return result;
89
- } catch (error) {
90
- if (error instanceof Error) span.recordException(error);
91
- span.setStatus({ code: SpanStatusCode.ERROR });
92
- throw error;
93
- } finally {
94
- span.end();
95
- }
96
- }
97
- //#endregion
98
- export { SMTPClient, createEmailClient };
1
+ import { SMTPClient, createEmailClient } from "./client-BkN5BGeJ.mjs";
99
2
 
100
- //# sourceMappingURL=client.mjs.map
3
+ export { SMTPClient, createEmailClient };
package/dist/index.cjs CHANGED
@@ -1,10 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_client = require("./client.cjs");
3
- const require_errors = require("./errors.cjs");
4
- const require_url = require("./url.cjs");
5
- exports.EmailUrlError = require_errors.EmailUrlError;
6
- exports.MalformedEmailUrl = require_errors.MalformedEmailUrl;
1
+ const require_client = require('./client-sZNHPYYg.cjs');
2
+
7
3
  exports.SMTPClient = require_client.SMTPClient;
8
- exports.UnsupportedEmailScheme = require_errors.UnsupportedEmailScheme;
9
- exports.createEmailClient = require_client.createEmailClient;
10
- exports.parseEmailUrl = require_url.parseEmailUrl;
4
+ exports.createEmailClient = require_client.createEmailClient;
package/dist/index.d.cts CHANGED
@@ -1,5 +1,3 @@
1
- import { Attachment, EmailClient, EmailClientConfig, EmailOptions, EmailTemplate, PlainEmailOptions, SMTPConfig, SendOptions, SendResult, TemplateNames, TemplatePropsFor, TemplateRecord } from "./types.cjs";
2
- import { SMTPClient, createEmailClient } from "./client.cjs";
3
- import { EmailUrlError, MalformedEmailUrl, UnsupportedEmailScheme } from "./errors.cjs";
4
- import { parseEmailUrl } from "./url.cjs";
5
- export { type Attachment, type EmailClient, type EmailClientConfig, type EmailOptions, type EmailTemplate, EmailUrlError, MalformedEmailUrl, type PlainEmailOptions, SMTPClient, type SMTPConfig, type SendOptions, type SendResult, type TemplateNames, type TemplatePropsFor, type TemplateRecord, UnsupportedEmailScheme, createEmailClient, parseEmailUrl };
1
+ import { Attachment, EmailClient, EmailClientConfig, EmailOptions, EmailTemplate, PlainEmailOptions, SMTPConfig, SendResult } from "./types-CLVcanCB.cjs";
2
+ import { SMTPClient, createEmailClient } from "./client-CGKPzbG7.cjs";
3
+ export { Attachment, EmailClient, EmailClientConfig, EmailOptions, EmailTemplate, PlainEmailOptions, SMTPClient, SMTPConfig, SendResult, createEmailClient };
package/dist/index.d.mts CHANGED
@@ -1,5 +1,3 @@
1
- import { Attachment, EmailClient, EmailClientConfig, EmailOptions, EmailTemplate, PlainEmailOptions, SMTPConfig, SendOptions, SendResult, TemplateNames, TemplatePropsFor, TemplateRecord } from "./types.mjs";
2
- import { SMTPClient, createEmailClient } from "./client.mjs";
3
- import { EmailUrlError, MalformedEmailUrl, UnsupportedEmailScheme } from "./errors.mjs";
4
- import { parseEmailUrl } from "./url.mjs";
5
- export { type Attachment, type EmailClient, type EmailClientConfig, type EmailOptions, type EmailTemplate, EmailUrlError, MalformedEmailUrl, type PlainEmailOptions, SMTPClient, type SMTPConfig, type SendOptions, type SendResult, type TemplateNames, type TemplatePropsFor, type TemplateRecord, UnsupportedEmailScheme, createEmailClient, parseEmailUrl };
1
+ import { Attachment, EmailClient, EmailClientConfig, EmailOptions, EmailTemplate, PlainEmailOptions, SMTPConfig, SendResult } from "./types-FrE6exSX.mjs";
2
+ import { SMTPClient, createEmailClient } from "./client-BrzAoy26.mjs";
3
+ export { Attachment, EmailClient, EmailClientConfig, EmailOptions, EmailTemplate, PlainEmailOptions, SMTPClient, SMTPConfig, SendResult, createEmailClient };
package/dist/index.mjs CHANGED
@@ -1,4 +1,3 @@
1
- import { SMTPClient, createEmailClient } from "./client.mjs";
2
- import { EmailUrlError, MalformedEmailUrl, UnsupportedEmailScheme } from "./errors.mjs";
3
- import { parseEmailUrl } from "./url.mjs";
4
- export { EmailUrlError, MalformedEmailUrl, SMTPClient, UnsupportedEmailScheme, createEmailClient, parseEmailUrl };
1
+ import { SMTPClient, createEmailClient } from "./client-BkN5BGeJ.mjs";
2
+
3
+ export { SMTPClient, createEmailClient };