@kernhq/module-mail 0.1.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 (83) hide show
  1. package/LICENSE +662 -0
  2. package/dist/contract.d.ts +285 -0
  3. package/dist/contract.d.ts.map +1 -0
  4. package/dist/contract.js +115 -0
  5. package/dist/contract.js.map +1 -0
  6. package/dist/server/index.d.ts +29 -0
  7. package/dist/server/index.d.ts.map +1 -0
  8. package/dist/server/index.js +189 -0
  9. package/dist/server/index.js.map +1 -0
  10. package/dist/server/providers/index.d.ts +13 -0
  11. package/dist/server/providers/index.d.ts.map +1 -0
  12. package/dist/server/providers/index.js +36 -0
  13. package/dist/server/providers/index.js.map +1 -0
  14. package/dist/server/providers/mailgun.d.ts +9 -0
  15. package/dist/server/providers/mailgun.d.ts.map +1 -0
  16. package/dist/server/providers/mailgun.js +42 -0
  17. package/dist/server/providers/mailgun.js.map +1 -0
  18. package/dist/server/providers/postmark.d.ts +7 -0
  19. package/dist/server/providers/postmark.d.ts.map +1 -0
  20. package/dist/server/providers/postmark.js +38 -0
  21. package/dist/server/providers/postmark.js.map +1 -0
  22. package/dist/server/providers/resend.d.ts +7 -0
  23. package/dist/server/providers/resend.d.ts.map +1 -0
  24. package/dist/server/providers/resend.js +34 -0
  25. package/dist/server/providers/resend.js.map +1 -0
  26. package/dist/server/providers/ses.d.ts +9 -0
  27. package/dist/server/providers/ses.d.ts.map +1 -0
  28. package/dist/server/providers/ses.js +59 -0
  29. package/dist/server/providers/ses.js.map +1 -0
  30. package/dist/server/providers/smtp.d.ts +13 -0
  31. package/dist/server/providers/smtp.d.ts.map +1 -0
  32. package/dist/server/providers/smtp.js +36 -0
  33. package/dist/server/providers/smtp.js.map +1 -0
  34. package/dist/server/providers/types.d.ts +38 -0
  35. package/dist/server/providers/types.d.ts.map +1 -0
  36. package/dist/server/providers/types.js +2 -0
  37. package/dist/server/providers/types.js.map +1 -0
  38. package/dist/server/schema.d.ts +469 -0
  39. package/dist/server/schema.d.ts.map +1 -0
  40. package/dist/server/schema.js +40 -0
  41. package/dist/server/schema.js.map +1 -0
  42. package/dist/server/send.d.ts +32 -0
  43. package/dist/server/send.d.ts.map +1 -0
  44. package/dist/server/send.js +119 -0
  45. package/dist/server/send.js.map +1 -0
  46. package/dist/server/settings.d.ts +9 -0
  47. package/dist/server/settings.d.ts.map +1 -0
  48. package/dist/server/settings.js +35 -0
  49. package/dist/server/settings.js.map +1 -0
  50. package/dist/server/suppressions.d.ts +17 -0
  51. package/dist/server/suppressions.d.ts.map +1 -0
  52. package/dist/server/suppressions.js +46 -0
  53. package/dist/server/suppressions.js.map +1 -0
  54. package/dist/server/templates.d.ts +19 -0
  55. package/dist/server/templates.d.ts.map +1 -0
  56. package/dist/server/templates.js +55 -0
  57. package/dist/server/templates.js.map +1 -0
  58. package/migrations/0000_init.sql +39 -0
  59. package/migrations/0001_notes.sql +6 -0
  60. package/migrations/meta/0000_snapshot.json +288 -0
  61. package/migrations/meta/_journal.json +20 -0
  62. package/package.json +80 -0
  63. package/src/client/MailSettings.svelte +214 -0
  64. package/src/client/index.ts +29 -0
  65. package/templates/_layout.mjml +34 -0
  66. package/templates/invitation.mjml +16 -0
  67. package/templates/invitation.subject.txt +1 -0
  68. package/templates/invitation.txt +8 -0
  69. package/templates/magic-link.mjml +16 -0
  70. package/templates/magic-link.subject.txt +1 -0
  71. package/templates/magic-link.txt +6 -0
  72. package/templates/notification-digest.mjml +24 -0
  73. package/templates/notification-digest.subject.txt +1 -0
  74. package/templates/notification-digest.txt +8 -0
  75. package/templates/reset-password.mjml +16 -0
  76. package/templates/reset-password.subject.txt +1 -0
  77. package/templates/reset-password.txt +7 -0
  78. package/templates/test.mjml +12 -0
  79. package/templates/test.subject.txt +1 -0
  80. package/templates/test.txt +5 -0
  81. package/templates/verify-email.mjml +17 -0
  82. package/templates/verify-email.subject.txt +1 -0
  83. package/templates/verify-email.txt +7 -0
@@ -0,0 +1,13 @@
1
+ import type { MailProvider, MailProviderConfig, PlatformMailEnv } from './types.js';
2
+ export * from './mailgun.js';
3
+ export * from './postmark.js';
4
+ export * from './resend.js';
5
+ export * from './ses.js';
6
+ export * from './smtp.js';
7
+ export * from './types.js';
8
+ /**
9
+ * Build the provider for a workspace config, falling back to the platform SMTP
10
+ * (SMTP_URL + MAIL_FROM) when the config is null or `provider: 'platform'`.
11
+ */
12
+ export declare function providerFor(config: MailProviderConfig | null, env?: PlatformMailEnv): MailProvider;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/providers/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEnF,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAE1B;;;GAGG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,kBAAkB,GAAG,IAAI,EACjC,GAAG,GAAE,eAA6B,GACjC,YAAY,CAkBd"}
@@ -0,0 +1,36 @@
1
+ import { KernError } from '@kernhq/kernel';
2
+ import { mailgunProvider } from './mailgun.js';
3
+ import { postmarkProvider } from './postmark.js';
4
+ import { resendProvider } from './resend.js';
5
+ import { sesProvider } from './ses.js';
6
+ import { smtpProvider } from './smtp.js';
7
+ export * from './mailgun.js';
8
+ export * from './postmark.js';
9
+ export * from './resend.js';
10
+ export * from './ses.js';
11
+ export * from './smtp.js';
12
+ export * from './types.js';
13
+ /**
14
+ * Build the provider for a workspace config, falling back to the platform SMTP
15
+ * (SMTP_URL + MAIL_FROM) when the config is null or `provider: 'platform'`.
16
+ */
17
+ export function providerFor(config, env = process.env) {
18
+ if (!config || config.provider === 'platform') {
19
+ if (!env.SMTP_URL)
20
+ throw new KernError('UNAVAILABLE', 'No mail provider configured and no platform SMTP_URL set');
21
+ return smtpProvider({ url: env.SMTP_URL, from: env.MAIL_FROM ?? 'kern@localhost' });
22
+ }
23
+ switch (config.provider) {
24
+ case 'smtp':
25
+ return smtpProvider(config);
26
+ case 'mailgun':
27
+ return mailgunProvider(config);
28
+ case 'ses':
29
+ return sesProvider(config);
30
+ case 'postmark':
31
+ return postmarkProvider(config);
32
+ case 'resend':
33
+ return resendProvider(config);
34
+ }
35
+ }
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAGxC,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAE1B;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,MAAiC,EACjC,MAAuB,OAAO,CAAC,GAAG;IAElC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,QAAQ;YACf,MAAM,IAAI,SAAS,CAAC,aAAa,EAAE,0DAA0D,CAAC,CAAA;QAChG,OAAO,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,gBAAgB,EAAE,CAAC,CAAA;IACrF,CAAC;IACD,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,MAAM,CAAC,CAAA;QAC7B,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC,MAAM,CAAC,CAAA;QAChC,KAAK,KAAK;YACR,OAAO,WAAW,CAAC,MAAM,CAAC,CAAA;QAC5B,KAAK,UAAU;YACb,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAA;QACjC,KAAK,QAAQ;YACX,OAAO,cAAc,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { MailProvider } from './types.js';
2
+ export interface MailgunOptions {
3
+ apiKey: string;
4
+ domain: string;
5
+ region?: 'us' | 'eu';
6
+ from: string;
7
+ }
8
+ export declare function mailgunProvider(opts: MailgunOptions): MailProvider;
9
+ //# sourceMappingURL=mailgun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailgun.d.ts","sourceRoot":"","sources":["../../../src/server/providers/mailgun.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,YAAY,CAAA;AAE3E,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CA+BlE"}
@@ -0,0 +1,42 @@
1
+ export function mailgunProvider(opts) {
2
+ const base = opts.region === 'eu' ? 'https://api.eu.mailgun.net' : 'https://api.mailgun.net';
3
+ const auth = `Basic ${Buffer.from(`api:${opts.apiKey}`).toString('base64')}`;
4
+ return {
5
+ name: 'mailgun',
6
+ from: opts.from,
7
+ async send(m) {
8
+ const form = new FormData();
9
+ form.set('from', m.from);
10
+ for (const to of m.to)
11
+ form.append('to', to);
12
+ for (const cc of m.cc ?? [])
13
+ form.append('cc', cc);
14
+ for (const bcc of m.bcc ?? [])
15
+ form.append('bcc', bcc);
16
+ form.set('subject', m.subject);
17
+ if (m.text)
18
+ form.set('text', m.text);
19
+ if (m.html)
20
+ form.set('html', m.html);
21
+ if (m.replyTo)
22
+ form.set('h:Reply-To', m.replyTo);
23
+ for (const [k, v] of Object.entries(m.headers ?? {}))
24
+ form.set(`h:${k}`, v);
25
+ for (const tag of m.tags ?? [])
26
+ form.append('o:tag', tag);
27
+ for (const a of m.attachments ?? [])
28
+ form.append('attachment', new Blob([new Uint8Array(a.content)], { type: a.contentType }), a.filename);
29
+ const res = await fetch(`${base}/v3/${opts.domain}/messages`, {
30
+ method: 'POST',
31
+ headers: { authorization: auth },
32
+ body: form,
33
+ });
34
+ if (!res.ok)
35
+ throw new Error(`mailgun ${res.status}: ${(await res.text()).slice(0, 500)}`);
36
+ const body = (await res.json());
37
+ // mailgun wraps the message id in angle brackets
38
+ return { messageId: body.id?.replace(/^<|>$/g, '') ?? null };
39
+ },
40
+ };
41
+ }
42
+ //# sourceMappingURL=mailgun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailgun.js","sourceRoot":"","sources":["../../../src/server/providers/mailgun.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { MailProvider } from './types.js';
2
+ export interface PostmarkOptions {
3
+ serverToken: string;
4
+ from: string;
5
+ }
6
+ export declare function postmarkProvider(opts: PostmarkOptions): MailProvider;
7
+ //# sourceMappingURL=postmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postmark.d.ts","sourceRoot":"","sources":["../../../src/server/providers/postmark.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,YAAY,CAAA;AAE3E,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,YAAY,CAmCpE"}
@@ -0,0 +1,38 @@
1
+ export function postmarkProvider(opts) {
2
+ return {
3
+ name: 'postmark',
4
+ from: opts.from,
5
+ async send(m) {
6
+ const res = await fetch('https://api.postmarkapp.com/email', {
7
+ method: 'POST',
8
+ headers: {
9
+ 'content-type': 'application/json',
10
+ accept: 'application/json',
11
+ 'x-postmark-server-token': opts.serverToken,
12
+ },
13
+ body: JSON.stringify({
14
+ From: m.from,
15
+ To: m.to.join(','),
16
+ Cc: m.cc?.join(','),
17
+ Bcc: m.bcc?.join(','),
18
+ ReplyTo: m.replyTo,
19
+ Subject: m.subject,
20
+ TextBody: m.text,
21
+ HtmlBody: m.html,
22
+ Tag: m.tags?.[0],
23
+ Headers: Object.entries(m.headers ?? {}).map(([Name, Value]) => ({ Name, Value })),
24
+ Attachments: m.attachments?.map((a) => ({
25
+ Name: a.filename,
26
+ ContentType: a.contentType,
27
+ Content: a.content.toString('base64'),
28
+ })),
29
+ }),
30
+ });
31
+ const body = (await res.json().catch(() => ({})));
32
+ if (!res.ok)
33
+ throw new Error(`postmark ${res.status}: ${body.Message ?? 'send failed'}`);
34
+ return { messageId: body.MessageID ?? null };
35
+ },
36
+ };
37
+ }
38
+ //# sourceMappingURL=postmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postmark.js","sourceRoot":"","sources":["../../../src/server/providers/postmark.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,gBAAgB,CAAC,IAAqB;IACpD,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,CAAC,IAAI,CAAC,CAAkB;YAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,mCAAmC,EAAE;gBAC3D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,MAAM,EAAE,kBAAkB;oBAC1B,yBAAyB,EAAE,IAAI,CAAC,WAAW;iBAC5C;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;oBAClB,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;oBACnB,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;oBACrB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,QAAQ,EAAE,CAAC,CAAC,IAAI;oBAChB,QAAQ,EAAE,CAAC,CAAC,IAAI;oBAChB,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;oBAChB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;oBAClF,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACtC,IAAI,EAAE,CAAC,CAAC,QAAQ;wBAChB,WAAW,EAAE,CAAC,CAAC,WAAW;wBAC1B,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;qBACtC,CAAC,CAAC;iBACJ,CAAC;aACH,CAAC,CAAA;YACF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA6C,CAAA;YAC7F,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC,CAAA;YACxF,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE,CAAA;QAC9C,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { MailProvider } from './types.js';
2
+ export interface ResendOptions {
3
+ apiKey: string;
4
+ from: string;
5
+ }
6
+ export declare function resendProvider(opts: ResendOptions): MailProvider;
7
+ //# sourceMappingURL=resend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resend.d.ts","sourceRoot":"","sources":["../../../src/server/providers/resend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,YAAY,CAAA;AAE3E,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CA+BhE"}
@@ -0,0 +1,34 @@
1
+ export function resendProvider(opts) {
2
+ return {
3
+ name: 'resend',
4
+ from: opts.from,
5
+ async send(m) {
6
+ const res = await fetch('https://api.resend.com/emails', {
7
+ method: 'POST',
8
+ headers: { 'content-type': 'application/json', authorization: `Bearer ${opts.apiKey}` },
9
+ body: JSON.stringify({
10
+ from: m.from,
11
+ to: m.to,
12
+ cc: m.cc,
13
+ bcc: m.bcc,
14
+ reply_to: m.replyTo,
15
+ subject: m.subject,
16
+ text: m.text,
17
+ html: m.html,
18
+ headers: m.headers,
19
+ attachments: m.attachments?.map((a) => ({
20
+ filename: a.filename,
21
+ content: a.content.toString('base64'),
22
+ content_type: a.contentType,
23
+ })),
24
+ tags: m.tags?.map((t) => ({ name: t, value: 'true' })),
25
+ }),
26
+ });
27
+ const body = (await res.json().catch(() => ({})));
28
+ if (!res.ok)
29
+ throw new Error(`resend ${res.status}: ${body.message ?? 'send failed'}`);
30
+ return { messageId: body.id ?? null };
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=resend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resend.js","sourceRoot":"","sources":["../../../src/server/providers/resend.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,cAAc,CAAC,IAAmB;IAChD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,CAAC,IAAI,CAAC,CAAkB;YAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,+BAA+B,EAAE;gBACvD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE;gBACvF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,GAAG,EAAE,CAAC,CAAC,GAAG;oBACV,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACtC,QAAQ,EAAE,CAAC,CAAC,QAAQ;wBACpB,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;wBACrC,YAAY,EAAE,CAAC,CAAC,WAAW;qBAC5B,CAAC,CAAC;oBACH,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;iBACvD,CAAC;aACH,CAAC,CAAA;YACF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAsC,CAAA;YACtF,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC,CAAA;YACtF,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;QACvC,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { MailProvider } from './types.js';
2
+ export interface SesOptions {
3
+ accessKeyId: string;
4
+ secretAccessKey: string;
5
+ region: string;
6
+ from: string;
7
+ }
8
+ export declare function sesProvider(opts: SesOptions): MailProvider;
9
+ //# sourceMappingURL=ses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ses.d.ts","sourceRoot":"","sources":["../../../src/server/providers/ses.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,YAAY,CAAA;AAE3E,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,CAoC1D"}
@@ -0,0 +1,59 @@
1
+ import { SESv2Client, SendEmailCommand } from '@aws-sdk/client-sesv2';
2
+ import MailComposer from 'nodemailer/lib/mail-composer/index.js';
3
+ export function sesProvider(opts) {
4
+ const client = new SESv2Client({
5
+ region: opts.region,
6
+ credentials: { accessKeyId: opts.accessKeyId, secretAccessKey: opts.secretAccessKey },
7
+ });
8
+ return {
9
+ name: 'ses',
10
+ from: opts.from,
11
+ async send(m) {
12
+ const destination = { ToAddresses: m.to, CcAddresses: m.cc, BccAddresses: m.bcc };
13
+ // attachments and custom headers need a raw MIME message; plain messages use Simple content
14
+ const needsRaw = (m.attachments?.length ?? 0) > 0 || Object.keys(m.headers ?? {}).length > 0;
15
+ const command = needsRaw
16
+ ? new SendEmailCommand({
17
+ FromEmailAddress: m.from,
18
+ Destination: destination,
19
+ Content: { Raw: { Data: await composeRaw(m) } },
20
+ })
21
+ : new SendEmailCommand({
22
+ FromEmailAddress: m.from,
23
+ Destination: destination,
24
+ ReplyToAddresses: m.replyTo ? [m.replyTo] : undefined,
25
+ Content: {
26
+ Simple: {
27
+ Subject: { Data: m.subject, Charset: 'UTF-8' },
28
+ Body: {
29
+ Text: m.text ? { Data: m.text, Charset: 'UTF-8' } : undefined,
30
+ Html: m.html ? { Data: m.html, Charset: 'UTF-8' } : undefined,
31
+ },
32
+ },
33
+ },
34
+ });
35
+ const res = await client.send(command);
36
+ return { messageId: res.MessageId ?? null };
37
+ },
38
+ };
39
+ }
40
+ async function composeRaw(m) {
41
+ const composer = new MailComposer({
42
+ from: m.from,
43
+ to: m.to,
44
+ cc: m.cc,
45
+ bcc: m.bcc,
46
+ replyTo: m.replyTo,
47
+ subject: m.subject,
48
+ text: m.text,
49
+ html: m.html,
50
+ headers: m.headers,
51
+ attachments: m.attachments?.map((a) => ({
52
+ filename: a.filename,
53
+ contentType: a.contentType,
54
+ content: a.content,
55
+ })),
56
+ });
57
+ return composer.compile().build();
58
+ }
59
+ //# sourceMappingURL=ses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ses.js","sourceRoot":"","sources":["../../../src/server/providers/ses.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { MailProvider } from './types.js';
2
+ export interface SmtpOptions {
3
+ /** smtp(s)://user:pass@host:port — overrides the individual fields */
4
+ url?: string;
5
+ host?: string;
6
+ port?: number;
7
+ secure?: boolean;
8
+ user?: string;
9
+ pass?: string;
10
+ from: string;
11
+ }
12
+ export declare function smtpProvider(opts: SmtpOptions): MailProvider;
13
+ //# sourceMappingURL=smtp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smtp.d.ts","sourceRoot":"","sources":["../../../src/server/providers/smtp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,YAAY,CAAA;AAE3E,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CAiC5D"}
@@ -0,0 +1,36 @@
1
+ import nodemailer, {} from 'nodemailer';
2
+ export function smtpProvider(opts) {
3
+ const transport = opts.url
4
+ ? nodemailer.createTransport(opts.url)
5
+ : nodemailer.createTransport({
6
+ host: opts.host,
7
+ port: opts.port,
8
+ secure: opts.secure ?? true,
9
+ auth: opts.user ? { user: opts.user, pass: opts.pass ?? '' } : undefined,
10
+ });
11
+ return {
12
+ name: 'smtp',
13
+ from: opts.from,
14
+ async send(m) {
15
+ const info = await transport.sendMail({
16
+ from: m.from,
17
+ to: m.to,
18
+ cc: m.cc,
19
+ bcc: m.bcc,
20
+ replyTo: m.replyTo,
21
+ subject: m.subject,
22
+ text: m.text,
23
+ html: m.html,
24
+ headers: m.headers,
25
+ attachments: m.attachments?.map((a) => ({
26
+ filename: a.filename,
27
+ contentType: a.contentType,
28
+ content: a.content,
29
+ })),
30
+ });
31
+ return { messageId: info.messageId ?? null };
32
+ },
33
+ close: () => transport.close(),
34
+ };
35
+ }
36
+ //# sourceMappingURL=smtp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smtp.js","sourceRoot":"","sources":["../../../src/server/providers/smtp.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,EAAE,EAAoB,MAAM,YAAY,CAAA;AAczD,MAAM,UAAU,YAAY,CAAC,IAAiB;IAC5C,MAAM,SAAS,GAAgB,IAAI,CAAC,GAAG;QACrC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;QACtC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;YAC3B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;SACzE,CAAC,CAAA;IACN,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,CAAC,IAAI,CAAC,CAAkB;YAC3B,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC;gBACpC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACtC,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;iBACnB,CAAC,CAAC;aACJ,CAAC,CAAA;YACF,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE,CAAA;QAC9C,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE;KAC/B,CAAA;AACH,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { core } from '@kernhq/contracts';
2
+ /** Fully resolved message, ready for a provider (attachments already fetched). */
3
+ export interface OutgoingMessage {
4
+ from: string;
5
+ to: string[];
6
+ cc?: string[];
7
+ bcc?: string[];
8
+ replyTo?: string;
9
+ subject: string;
10
+ text?: string;
11
+ html?: string;
12
+ headers?: Record<string, string>;
13
+ attachments?: Array<{
14
+ filename: string;
15
+ contentType: string;
16
+ content: Buffer;
17
+ }>;
18
+ tags?: string[];
19
+ }
20
+ export interface SendResult {
21
+ /** provider message id, used to correlate webhook events; null when the provider returns none */
22
+ messageId: string | null;
23
+ }
24
+ export interface MailProvider {
25
+ readonly name: string;
26
+ readonly from: string;
27
+ send(message: OutgoingMessage): Promise<SendResult>;
28
+ /** close pooled connections (SMTP); optional */
29
+ close?(): void;
30
+ }
31
+ export type MailProviderConfig = core.MailProviderConfig;
32
+ /** Instance-level fallback used when a workspace has no provider configured. */
33
+ export interface PlatformMailEnv {
34
+ /** smtp(s)://user:pass@host:port */
35
+ SMTP_URL?: string;
36
+ MAIL_FROM?: string;
37
+ }
38
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/providers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAE7C,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,EAAE,CAAA;IACZ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/E,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,iGAAiG;IACjG,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACnD,gDAAgD;IAChD,KAAK,CAAC,IAAI,IAAI,CAAA;CACf;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAA;AAExD,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/server/providers/types.ts"],"names":[],"mappings":""}