@zintrust/core 1.8.3 → 1.8.5

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 (43) hide show
  1. package/package.json +8 -6
  2. package/src/cli/CLI.d.ts.map +1 -1
  3. package/src/cli/CLI.js +2 -0
  4. package/src/cli/commands/EmailProxyCommand.d.ts +6 -0
  5. package/src/cli/commands/EmailProxyCommand.d.ts.map +1 -0
  6. package/src/cli/commands/EmailProxyCommand.js +108 -0
  7. package/src/cli/commands/ProxyCommand.d.ts +1 -0
  8. package/src/cli/commands/ProxyCommand.d.ts.map +1 -1
  9. package/src/cli/commands/ProxyCommand.js +6 -0
  10. package/src/cli/commands/WranglerProxyCommandUtils.d.ts +1 -0
  11. package/src/cli/commands/WranglerProxyCommandUtils.d.ts.map +1 -1
  12. package/src/cli/commands/WranglerProxyCommandUtils.js +2 -1
  13. package/src/cli/scaffolding/env.d.ts.map +1 -1
  14. package/src/cli/scaffolding/env.js +5 -0
  15. package/src/config/env.d.ts +18 -0
  16. package/src/config/env.d.ts.map +1 -1
  17. package/src/config/env.js +19 -0
  18. package/src/config/mail.d.ts.map +1 -1
  19. package/src/config/mail.js +6 -0
  20. package/src/config/type.d.ts +6 -2
  21. package/src/config/type.d.ts.map +1 -1
  22. package/src/index.js +3 -3
  23. package/src/proxy/email/ZintrustEmailProxy.d.ts +20 -0
  24. package/src/proxy/email/ZintrustEmailProxy.d.ts.map +1 -0
  25. package/src/proxy/email/ZintrustEmailProxy.js +129 -0
  26. package/src/proxy/email/register.d.ts +2 -0
  27. package/src/proxy/email/register.d.ts.map +1 -0
  28. package/src/proxy/email/register.js +5 -0
  29. package/src/proxy.d.ts +1 -0
  30. package/src/proxy.d.ts.map +1 -1
  31. package/src/proxy.js +1 -0
  32. package/src/tools/mail/MailMessage.d.ts +18 -0
  33. package/src/tools/mail/MailMessage.d.ts.map +1 -0
  34. package/src/tools/mail/MailMessage.js +75 -0
  35. package/src/tools/mail/drivers/Cloudflare.d.ts +13 -0
  36. package/src/tools/mail/drivers/Cloudflare.d.ts.map +1 -0
  37. package/src/tools/mail/drivers/Cloudflare.js +105 -0
  38. package/src/tools/mail/drivers/Smtp.d.ts +2 -16
  39. package/src/tools/mail/drivers/Smtp.d.ts.map +1 -1
  40. package/src/tools/mail/drivers/Smtp.js +1 -64
  41. package/src/tools/mail/index.d.ts +1 -1
  42. package/src/tools/mail/index.d.ts.map +1 -1
  43. package/src/tools/mail/index.js +12 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zintrust/core",
3
- "version": "1.8.3",
3
+ "version": "1.8.5",
4
4
  "description": "Production-grade TypeScript backend framework for JavaScript",
5
5
  "homepage": "https://zintrust.com",
6
6
  "repository": {
@@ -57,16 +57,16 @@
57
57
  "./package.json": "./package.json"
58
58
  },
59
59
  "dependencies": {
60
- "@cloudflare/containers": "^0.3.3",
60
+ "@cloudflare/containers": "^0.3.4",
61
61
  "bcryptjs": "^3.0.3",
62
- "bullmq": "^5.76.6",
62
+ "bullmq": "^5.76.8",
63
63
  "chalk": "^5.6.2",
64
64
  "commander": "^14.0.3",
65
- "inquirer": "^13.4.2",
65
+ "inquirer": "^13.4.3",
66
66
  "jsonwebtoken": "^9.0.3",
67
67
  "mysql2": "^3.22.3",
68
68
  "pg": "^8.20.0",
69
- "tsx": "^4.21.0"
69
+ "tsx": "^4.22.0"
70
70
  },
71
71
  "overrides": {
72
72
  "ajv": "^8.18.0",
@@ -75,7 +75,9 @@
75
75
  "follow-redirects": "^1.16.0",
76
76
  "@tootallnate/once": "3.0.1",
77
77
  "node-forge": "^1.4.0",
78
- "fast-xml-parser": "5.7.1",
78
+ "fast-uri": "3.1.2",
79
+ "fast-xml-builder": "1.2.0",
80
+ "fast-xml-parser": "5.8.0",
79
81
  "brace-expansion": "^5.0.5",
80
82
  "picomatch": "^4.0.4",
81
83
  "cross-spawn": "^7.0.5",
@@ -1 +1 @@
1
- {"version":3,"file":"CLI.d.ts","sourceRoot":"","sources":["../../../src/cli/CLI.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA0EH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,MAAM,WAAW,IAAI;IACnB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,UAAU,IAAI,OAAO,CAAC;CACvB;AAqQD;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG;cACJ,IAAI;EAed,CAAC"}
1
+ {"version":3,"file":"CLI.d.ts","sourceRoot":"","sources":["../../../src/cli/CLI.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2EH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,MAAM,WAAW,IAAI;IACnB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,UAAU,IAAI,OAAO,CAAC;CACvB;AAsQD;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG;cACJ,IAAI;EAed,CAAC"}
package/src/cli/CLI.js CHANGED
@@ -21,6 +21,7 @@ import { DeployContainerWorkersCommand } from './commands/DeployContainerWorkers
21
21
  import { DockerCommand } from './commands/DockerCommand.js';
22
22
  import { DockerPushCommand } from './commands/DockerPushCommand.js';
23
23
  import { DoctorArchitectureCommand } from './commands/DoctorArchitectureCommand.js';
24
+ import { EmailProxyCommand } from './commands/EmailProxyCommand.js';
24
25
  import { EnvKeyGenerateCommand } from './commands/EnvKeyGenerateCommand.js';
25
26
  import { FixCommand } from './commands/FixCommand.js';
26
27
  import { InitContainerCommand } from './commands/InitContainerCommand.js';
@@ -135,6 +136,7 @@ const buildCommandRegistry = () => {
135
136
  JwtDevCommand,
136
137
  ProxyCommand.create(),
137
138
  D1ProxyCommand.create(),
139
+ EmailProxyCommand.create(),
138
140
  KvProxyCommand.create(),
139
141
  MySqlProxyCommand.create(),
140
142
  PostgresProxyCommand.create(),
@@ -0,0 +1,6 @@
1
+ import type { IBaseCommand } from '../BaseCommand';
2
+ export declare const EmailProxyCommand: Readonly<{
3
+ create(): IBaseCommand;
4
+ }>;
5
+ export default EmailProxyCommand;
6
+ //# sourceMappingURL=EmailProxyCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailProxyCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/EmailProxyCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA4IrD,eAAO,MAAM,iBAAiB;cAClB,YAAY;EAmBtB,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,108 @@
1
+ import { findQuotedValue, trimNonEmptyOption } from '../commands/ProxyScaffoldUtils.js';
2
+ import { createWranglerProxyCommand, } from '../commands/WranglerProxyCommandUtils.js';
3
+ import { Env } from '../../config/env.js';
4
+ import { Logger } from '../../config/logger.js';
5
+ const DEFAULT_CONFIG = 'wrangler.jsonc';
6
+ const DEFAULT_COMPATIBILITY_DATE = '2026-03-12';
7
+ const DEFAULT_BINDING = 'SEND_EMAIL';
8
+ const DEFAULT_ENTRY_FILE = 'src/proxy/email/ZintrustEmailProxy.ts';
9
+ const DEFAULT_ROUTE_PATTERN = 'email-proxy.example.com';
10
+ const CORE_PROXY_MODULE = ['@zintrust', 'core', 'proxy'].join('/');
11
+ const parseCsv = (value) => {
12
+ const parsed = (value ?? '')
13
+ .split(',')
14
+ .map((item) => item.trim())
15
+ .filter((item, index, items) => item !== '' && items.indexOf(item) === index);
16
+ return parsed.length === 0 ? undefined : parsed;
17
+ };
18
+ const renderArray = (values) => {
19
+ return `[${values.map((value) => JSON.stringify(value)).join(', ')}]`;
20
+ };
21
+ const resolveConfigValues = (content, options) => {
22
+ const fileContent = content ?? '';
23
+ return {
24
+ binding: trimNonEmptyOption(options.binding) ??
25
+ trimNonEmptyOption(Env.get('MAIL_CLOUDFLARE_BINDING', '')) ??
26
+ findQuotedValue(fileContent, 'MAIL_CLOUDFLARE_BINDING') ??
27
+ findQuotedValue(fileContent, 'name') ??
28
+ DEFAULT_BINDING,
29
+ destinationAddress: trimNonEmptyOption(options.destinationAddress) ??
30
+ trimNonEmptyOption(findQuotedValue(fileContent, 'destination_address')),
31
+ allowedDestinationAddresses: parseCsv(options.allowedDestinationAddresses) ??
32
+ parseCsv(Env.get('MAIL_CLOUDFLARE_ALLOWED_DESTINATION_ADDRESSES', '')),
33
+ allowedSenderAddresses: parseCsv(options.allowedSenderAddresses) ??
34
+ parseCsv(Env.get('MAIL_CLOUDFLARE_ALLOWED_SENDER_ADDRESSES', '')),
35
+ };
36
+ };
37
+ const renderSendEmailBinding = (values) => {
38
+ const lines = [' {', ` "name": "${values.binding}"`];
39
+ if (values.destinationAddress !== undefined) {
40
+ lines.push(` ,"destination_address": "${values.destinationAddress}"`);
41
+ }
42
+ if (values.allowedDestinationAddresses !== undefined) {
43
+ lines.push(` ,"allowed_destination_addresses": ${renderArray(values.allowedDestinationAddresses)}`);
44
+ }
45
+ if (values.allowedSenderAddresses !== undefined) {
46
+ lines.push(` ,"allowed_sender_addresses": ${renderArray(values.allowedSenderAddresses)}`);
47
+ }
48
+ lines.push(' }');
49
+ return lines;
50
+ };
51
+ const renderEmailProxyEnvBlock = (values) => {
52
+ return [
53
+ ' "email-proxy": {',
54
+ ' "name": "zintrust-email-proxy",',
55
+ ' "main": "./src/proxy/email/ZintrustEmailProxy.ts",',
56
+ ' "compatibility_flags": ["nodejs_compat"],',
57
+ ` "compatibility_date": "${DEFAULT_COMPATIBILITY_DATE}",`,
58
+ ' "vars": {',
59
+ ` "MAIL_CLOUDFLARE_BINDING": "${values.binding}",`,
60
+ ' "ZT_PROXY_SIGNING_WINDOW_MS": "60000",',
61
+ ' "ZT_MAX_BODY_BYTES": "131072",',
62
+ ' "NODE_ENV": "development"',
63
+ ' },',
64
+ ' "send_email": [',
65
+ ...renderSendEmailBinding(values),
66
+ ' ],',
67
+ ' // Add routes here when ready:',
68
+ ` // "routes": [{ "pattern": "${DEFAULT_ROUTE_PATTERN}", "custom_domain": true }]`,
69
+ ' }',
70
+ ].join('\n');
71
+ };
72
+ const warnOnMissingSigningSecret = () => {
73
+ const directSecret = trimNonEmptyOption(Env.get('MAIL_CLOUDFLARE_PROXY_SECRET', ''));
74
+ const fallbackSecret = trimNonEmptyOption(Env.get('APP_KEY', ''));
75
+ if (directSecret !== undefined || fallbackSecret !== undefined)
76
+ return;
77
+ Logger.warn('Email proxy signing will fail: the resolved project env does not expose MAIL_CLOUDFLARE_PROXY_SECRET or APP_KEY to the Worker runtime. Signed requests will be rejected with 401 CONFIG_ERROR until one of those keys is set.');
78
+ };
79
+ const addOptions = (command) => {
80
+ command.option('-c, --config <path>', 'Wrangler config file', DEFAULT_CONFIG);
81
+ command.option('--port <port>', 'Local Wrangler dev port', '5777');
82
+ command.option('--watch', 'Auto-restart proxy on file changes');
83
+ command.option('--binding <name>', 'send_email binding name', DEFAULT_BINDING);
84
+ command.option('--destination-address <email>', 'Restrict the binding to one destination');
85
+ command.option('--allowed-destination-addresses <emails>', 'Comma-separated allowlist of destination addresses');
86
+ command.option('--allowed-sender-addresses <emails>', 'Comma-separated allowlist of sender addresses');
87
+ };
88
+ export const EmailProxyCommand = Object.freeze({
89
+ create() {
90
+ return createWranglerProxyCommand({
91
+ name: 'proxy:email',
92
+ aliases: ['email:proxy', 'proxy:cl:mail', 'proxy:cloudflare:mail'],
93
+ description: 'Start the local Cloudflare email proxy Worker via Wrangler and scaffold env.email-proxy in wrangler.jsonc when missing',
94
+ envName: 'email-proxy',
95
+ defaultPort: 5777,
96
+ defaultConfig: DEFAULT_CONFIG,
97
+ compatibilityDate: DEFAULT_COMPATIBILITY_DATE,
98
+ entryFile: DEFAULT_ENTRY_FILE,
99
+ exportName: 'ZintrustEmailProxy',
100
+ moduleSpecifier: CORE_PROXY_MODULE,
101
+ addOptions,
102
+ resolveValues: resolveConfigValues,
103
+ renderEnvBlock: renderEmailProxyEnvBlock,
104
+ afterConfigResolved: warnOnMissingSigningSecret,
105
+ });
106
+ },
107
+ });
108
+ export default EmailProxyCommand;
@@ -1,5 +1,6 @@
1
1
  import type { IBaseCommand } from '../BaseCommand';
2
2
  import '../../proxy/d1/register';
3
+ import '../../proxy/email/register';
3
4
  import '../../proxy/kv/register';
4
5
  import '../../proxy/mysql/register';
5
6
  import '../../proxy/postgres/register';
@@ -1 +1 @@
1
- {"version":3,"file":"ProxyCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ProxyCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAMrE,OAAO,oBAAoB,CAAC;AAC5B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,0BAA0B,CAAC;AAClC,OAAO,uBAAuB,CAAC;AAC/B,OAAO,sBAAsB,CAAC;AA2D9B,eAAO,MAAM,YAAY;cACb,YAAY;EAyBtB,CAAC;AAEH,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ProxyCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ProxyCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAMrE,OAAO,oBAAoB,CAAC;AAC5B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,0BAA0B,CAAC;AAClC,OAAO,uBAAuB,CAAC;AAC/B,OAAO,sBAAsB,CAAC;AAgE9B,eAAO,MAAM,YAAY;cACb,YAAY;EAyBtB,CAAC;AAEH,eAAe,YAAY,CAAC"}
@@ -4,6 +4,7 @@ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
4
4
  import * as path from '../../node-singletons/path.js';
5
5
  import { ProxyRegistry } from '../../proxy/ProxyRegistry.js';
6
6
  import '../../proxy/d1/register.js';
7
+ import '../../proxy/email/register.js';
7
8
  import '../../proxy/kv/register.js';
8
9
  import '../../proxy/mysql/register.js';
9
10
  import '../../proxy/postgres/register.js';
@@ -11,6 +12,11 @@ import '../../proxy/redis/register.js';
11
12
  import '../../proxy/smtp/register.js';
12
13
  const PROXY_TARGET_MAP = Object.freeze({
13
14
  d1: 'proxy:d1',
15
+ email: 'proxy:email',
16
+ cl: 'proxy:email',
17
+ 'cl:mail': 'proxy:email',
18
+ 'cloudflare:mail': 'proxy:email',
19
+ 'cloudflare-mail': 'proxy:email',
14
20
  kv: 'proxy:kv',
15
21
  mysql: 'proxy:mysql',
16
22
  my: 'proxy:mysql',
@@ -10,6 +10,7 @@ type CreateWranglerProxyCommandInput<TValues, TOptions extends WranglerProxyComm
10
10
  aliases: string[];
11
11
  description: string;
12
12
  envName: string;
13
+ defaultPort?: number;
13
14
  defaultConfig: string;
14
15
  compatibilityDate: string;
15
16
  entryFile: string;
@@ -1 +1 @@
1
- {"version":3,"file":"WranglerProxyCommandUtils.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/WranglerProxyCommandUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAkBrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,2BAA2B,GAAG,cAAc,GAAG;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,KAAK,+BAA+B,CAAC,OAAO,EAAE,QAAQ,SAAS,2BAA2B,IAAI;IAC5F,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC;IAC3E,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC;IAC5C,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,2BAA2B,GAAI,SAAS,OAAO,EAAE,eAAe,MAAM,KAAG,IAIrF,CAAC;AAMF,eAAO,MAAM,0BAA0B,GAAI,OAAO,EAAE,QAAQ,SAAS,2BAA2B,EAC9F,OAAO,+BAA+B,CAAC,OAAO,EAAE,QAAQ,CAAC,KACxD,YAoFF,CAAC"}
1
+ {"version":3,"file":"WranglerProxyCommandUtils.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/WranglerProxyCommandUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAkBrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,2BAA2B,GAAG,cAAc,GAAG;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,KAAK,+BAA+B,CAAC,OAAO,EAAE,QAAQ,SAAS,2BAA2B,IAAI;IAC5F,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC;IAC3E,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC;IAC5C,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,2BAA2B,GAAI,SAAS,OAAO,EAAE,eAAe,MAAM,KAAG,IAIrF,CAAC;AAMF,eAAO,MAAM,0BAA0B,GAAI,OAAO,EAAE,QAAQ,SAAS,2BAA2B,EAC9F,OAAO,+BAA+B,CAAC,OAAO,EAAE,QAAQ,CAAC,KACxD,YAwFF,CAAC"}
@@ -23,7 +23,8 @@ export const createWranglerProxyCommand = (input) => {
23
23
  execute: async (options) => {
24
24
  const typedOptions = options;
25
25
  await maybeRunProxyWatchMode(typedOptions.watch);
26
- const port = parseIntOption(typedOptions.port, 'port');
26
+ const port = parseIntOption(typedOptions.port ??
27
+ (input.defaultPort === undefined ? undefined : String(input.defaultPort)), 'port');
27
28
  const cwd = process.cwd();
28
29
  const projectRoot = ensureProxyEnvLoadedForCwd(cwd);
29
30
  const entrypoint = ensureProxyEntrypoint({
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../../src/cli/scaffolding/env.ts"],"names":[],"mappings":"AAqiBA,eAAO,MAAM,OAAO,GAClB,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,SAAS,MAAM,EACf,QAAQ,MAAM,EACd,oBAAoB,MAAM,EAC1B,SAAS,MAAM,EAAE,EACjB,cAAc,MAAM,KACnB,MAAM,EAWR,CAAC"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../../src/cli/scaffolding/env.ts"],"names":[],"mappings":"AA0iBA,eAAO,MAAM,OAAO,GAClB,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,SAAS,MAAM,EACf,QAAQ,MAAM,EACd,oBAAoB,MAAM,EAC1B,SAAS,MAAM,EAAE,EACjB,cAAc,MAAM,KACnB,MAAM,EAWR,CAAC"}
@@ -430,6 +430,11 @@ const LoggingAndMail = () => [
430
430
  'MAIL_CONNECTION=',
431
431
  'MAIL_FROM_ADDRESS=',
432
432
  'MAIL_FROM_NAME=',
433
+ 'MAIL_CLOUDFLARE_BINDING=SEND_EMAIL',
434
+ 'MAIL_CLOUDFLARE_PROXY_URL=',
435
+ 'MAIL_CLOUDFLARE_PROXY_KEY_ID=',
436
+ 'MAIL_CLOUDFLARE_PROXY_SECRET=',
437
+ 'MAIL_CLOUDFLARE_PROXY_TIMEOUT_MS=30000',
433
438
  'MAIL_HOST=',
434
439
  'MAIL_PORT=587',
435
440
  'MAIL_USERNAME=',
@@ -116,6 +116,24 @@ export declare const Env: Readonly<{
116
116
  SMTP_PROXY_REQUIRE_SIGNING: boolean;
117
117
  SMTP_PROXY_SIGNING_WINDOW_MS: number;
118
118
  USE_SMTP_PROXY: boolean;
119
+ MAIL_DRIVER: string;
120
+ MAIL_CONNECTION: string;
121
+ MAIL_FROM_ADDRESS: string;
122
+ MAIL_FROM_NAME: string;
123
+ MAIL_CLOUDFLARE_BINDING: string;
124
+ MAIL_CLOUDFLARE_PROXY_URL: string;
125
+ MAIL_CLOUDFLARE_PROXY_KEY_ID: string;
126
+ MAIL_CLOUDFLARE_PROXY_SECRET: string;
127
+ MAIL_CLOUDFLARE_PROXY_TIMEOUT_MS: number;
128
+ MAIL_HOST: string;
129
+ MAIL_PORT: number;
130
+ MAIL_USERNAME: string;
131
+ MAIL_PASSWORD: string;
132
+ MAIL_SECURE: string;
133
+ SENDGRID_API_KEY: string;
134
+ MAILGUN_API_KEY: string;
135
+ MAILGUN_DOMAIN: string;
136
+ MAILGUN_BASE_URL: string;
119
137
  MONGODB_PROXY_URL: string;
120
138
  MONGODB_PROXY_HOST: string;
121
139
  MONGODB_PROXY_PORT: number;
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/config/env.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/config/env.ts"],"names":[],"mappings":"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"}
package/src/config/env.js CHANGED
@@ -356,6 +356,25 @@ export const Env = Object.freeze({
356
356
  SMTP_PROXY_REQUIRE_SIGNING: getBool('SMTP_PROXY_REQUIRE_SIGNING', true),
357
357
  SMTP_PROXY_SIGNING_WINDOW_MS: getInt('SMTP_PROXY_SIGNING_WINDOW_MS', getInt('ZT_PROXY_SIGNING_WINDOW_MS', 60000)),
358
358
  USE_SMTP_PROXY: getBool('USE_SMTP_PROXY', false),
359
+ // Mail
360
+ MAIL_DRIVER: get('MAIL_DRIVER', 'disabled'),
361
+ MAIL_CONNECTION: get('MAIL_CONNECTION', ''),
362
+ MAIL_FROM_ADDRESS: get('MAIL_FROM_ADDRESS', ''),
363
+ MAIL_FROM_NAME: get('MAIL_FROM_NAME', ''),
364
+ MAIL_CLOUDFLARE_BINDING: get('MAIL_CLOUDFLARE_BINDING', get('MAIL_CL_BINDING', 'SEND_EMAIL')),
365
+ MAIL_CLOUDFLARE_PROXY_URL: get('MAIL_CLOUDFLARE_PROXY_URL', ''),
366
+ MAIL_CLOUDFLARE_PROXY_KEY_ID: get('MAIL_CLOUDFLARE_PROXY_KEY_ID', PROXY_KEY_ID_FALLBACK),
367
+ MAIL_CLOUDFLARE_PROXY_SECRET: get('MAIL_CLOUDFLARE_PROXY_SECRET', PROXY_SECRET_FALLBACK),
368
+ MAIL_CLOUDFLARE_PROXY_TIMEOUT_MS: getInt('MAIL_CLOUDFLARE_PROXY_TIMEOUT_MS', ZT_PROXY_TIMEOUT_MS),
369
+ MAIL_HOST: get('MAIL_HOST', ''),
370
+ MAIL_PORT: getInt('MAIL_PORT', 587),
371
+ MAIL_USERNAME: get('MAIL_USERNAME', ''),
372
+ MAIL_PASSWORD: get('MAIL_PASSWORD', ''),
373
+ MAIL_SECURE: get('MAIL_SECURE', ''),
374
+ SENDGRID_API_KEY: get('SENDGRID_API_KEY', ''),
375
+ MAILGUN_API_KEY: get('MAILGUN_API_KEY', ''),
376
+ MAILGUN_DOMAIN: get('MAILGUN_DOMAIN', ''),
377
+ MAILGUN_BASE_URL: get('MAILGUN_BASE_URL', 'https://api.mailgun.net'),
359
378
  MONGODB_PROXY_URL: get('MONGODB_PROXY_URL', ''),
360
379
  MONGODB_PROXY_HOST: get('MONGODB_PROXY_HOST', '127.0.0.1'),
361
380
  MONGODB_PROXY_PORT: getInt('MONGODB_PROXY_PORT', 8792),
@@ -1 +1 @@
1
- {"version":3,"file":"mail.d.ts","sourceRoot":"","sources":["../../../src/config/mail.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAItE,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC3C,CAAC,CAAC;AA6FH,QAAA,MAAM,gBAAgB,QAAO;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC1C,SAAS,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,gBAAgB,CAAC;CA6CvE,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAqB7D,eAAO,MAAM,UAAU,EAAE,UAYvB,CAAC"}
1
+ {"version":3,"file":"mail.d.ts","sourceRoot":"","sources":["../../../src/config/mail.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAItE,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC3C,CAAC,CAAC;AAsGH,QAAA,MAAM,gBAAgB,QAAO;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC1C,SAAS,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,gBAAgB,CAAC;CA6CvE,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAkB7D,eAAO,MAAM,UAAU,EAAE,UAYvB,CAAC"}
@@ -39,10 +39,16 @@ const getMailDriver = (config, name) => {
39
39
  * Create base mail drivers configuration
40
40
  */
41
41
  const createMailDrivers = () => {
42
+ const cloudflareDriver = {
43
+ driver: 'cl',
44
+ binding: Env.get('MAIL_CLOUDFLARE_BINDING', Env.get('MAIL_CL_BINDING', 'SEND_EMAIL')).trim(),
45
+ };
42
46
  return {
43
47
  disabled: {
44
48
  driver: 'disabled',
45
49
  },
50
+ cl: cloudflareDriver,
51
+ cloudflare: cloudflareDriver,
46
52
  sendgrid: {
47
53
  driver: 'sendgrid',
48
54
  apiKey: Env.get('SENDGRID_API_KEY', ''),
@@ -181,7 +181,7 @@ export type MiddlewareConfigType = {
181
181
  global: MiddlewareFn[];
182
182
  route: Record<string, MiddlewareFn>;
183
183
  };
184
- export type MailDriverName = 'disabled' | 'sendgrid' | 'smtp' | 'ses' | 'mailgun' | 'nodemailer';
184
+ export type MailDriverName = 'disabled' | 'sendgrid' | 'smtp' | 'ses' | 'mailgun' | 'nodemailer' | 'cl';
185
185
  export type DisabledMailDriverConfig = {
186
186
  driver: 'disabled';
187
187
  };
@@ -211,11 +211,15 @@ export type NodemailerMailDriverConfig = {
211
211
  password: string;
212
212
  secure: boolean | 'starttls';
213
213
  };
214
+ export type CloudflareMailDriverConfig = {
215
+ driver: 'cl';
216
+ binding: string;
217
+ };
214
218
  export type SesMailDriverConfig = {
215
219
  driver: 'ses';
216
220
  region: string;
217
221
  };
218
- export type MailDriverConfig = DisabledMailDriverConfig | SendGridMailDriverConfig | MailgunMailDriverConfig | SmtpMailDriverConfig | NodemailerMailDriverConfig | SesMailDriverConfig;
222
+ export type MailDriverConfig = DisabledMailDriverConfig | SendGridMailDriverConfig | MailgunMailDriverConfig | SmtpMailDriverConfig | NodemailerMailDriverConfig | CloudflareMailDriverConfig | SesMailDriverConfig;
219
223
  export type MailDrivers = Record<string, MailDriverConfig>;
220
224
  export type MailConfigInput = {
221
225
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../../src/config/type.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../../src/config/type.ts"],"names":[],"mappings":"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"}
package/src/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @zintrust/core v1.8.3
2
+ * @zintrust/core v1.8.5
3
3
  *
4
4
  * ZinTrust Framework - Production-Grade TypeScript Backend
5
5
  * Built for performance, type safety, and exceptional developer experience
6
6
  *
7
7
  * Build Information:
8
- * Built: 2026-05-08T12:00:25.928Z
8
+ * Built: 2026-05-15T16:02:47.614Z
9
9
  * Node: >=20.0.0
10
10
  * License: MIT
11
11
  *
@@ -21,7 +21,7 @@
21
21
  * Available at runtime for debugging and health checks
22
22
  */
23
23
  export const ZINTRUST_VERSION = '0.1.41';
24
- export const ZINTRUST_BUILD_DATE = '2026-05-08T12:00:25.882Z'; // Replaced during build
24
+ export const ZINTRUST_BUILD_DATE = '2026-05-15T16:02:47.579Z'; // Replaced during build
25
25
  export { Application } from './boot/Application.js';
26
26
  export { AwsSigV4 } from './common/index.js';
27
27
  export { SignedRequest } from './security/SignedRequest.js';
@@ -0,0 +1,20 @@
1
+ type SendEmailBinding = {
2
+ send: (message: unknown) => Promise<unknown>;
3
+ };
4
+ type EmailProxyEnv = {
5
+ APP_KEY?: string;
6
+ MAIL_CLOUDFLARE_PROXY_SECRET?: string;
7
+ MAIL_CLOUDFLARE_BINDING?: string;
8
+ SEND_EMAIL?: SendEmailBinding;
9
+ SEB?: SendEmailBinding;
10
+ ZT_NONCES?: unknown;
11
+ ZT_PROXY_SIGNING_WINDOW_MS?: string;
12
+ ZT_MAX_BODY_BYTES?: string;
13
+ } & Record<string, unknown>;
14
+ export declare const ZintrustEmailProxy: Readonly<{
15
+ _ZINTRUST_CLOUDFLARE_EMAIL_PROXY_VERSION: "0.1.15";
16
+ _ZINTRUST_CLOUDFLARE_EMAIL_PROXY_BUILD_DATE: "__BUILD_DATE__";
17
+ fetch(request: Request, env: EmailProxyEnv): Promise<Response>;
18
+ }>;
19
+ export default ZintrustEmailProxy;
20
+ //# sourceMappingURL=ZintrustEmailProxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZintrustEmailProxy.d.ts","sourceRoot":"","sources":["../../../../src/proxy/email/ZintrustEmailProxy.ts"],"names":[],"mappings":"AAUA,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C,CAAC;AAMF,KAAK,aAAa,GAAG;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,GAAG,CAAC,EAAE,gBAAgB,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA8I5B,eAAO,MAAM,kBAAkB;;;mBAGR,OAAO,OAAO,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;EAcpE,CAAC;AAEH,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,129 @@
1
+ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
2
+ import { isArray, isNonEmptyString, isObject } from '../../helper/index.js';
3
+ import { readAndVerifyJson, toErrorResponse } from '../CloudflareProxyShared.js';
4
+ import { RequestValidator } from '../RequestValidator.js';
5
+ import { buildRfc2822Message, } from '../../tools/mail/MailMessage.js';
6
+ const DEFAULT_SIGNING_WINDOW_MS = 60_000;
7
+ const DEFAULT_MAX_BODY_BYTES = 128 * 1024;
8
+ const normalizeRecipients = (to) => (Array.isArray(to) ? to : [to]);
9
+ const importCloudflareEmail = async () => {
10
+ try {
11
+ return (await import('cloudflare:email'));
12
+ }
13
+ catch {
14
+ throw ErrorFactory.createConfigError('Cloudflare email runtime API is unavailable');
15
+ }
16
+ };
17
+ const resolveBinding = (env, requestedBinding) => {
18
+ const candidateNames = [
19
+ requestedBinding,
20
+ env.MAIL_CLOUDFLARE_BINDING,
21
+ 'SEND_EMAIL',
22
+ 'SEB',
23
+ ].filter((value, index, values) => typeof value === 'string' && value.trim() !== '' && values.indexOf(value) === index);
24
+ for (const name of candidateNames) {
25
+ const binding = env[name];
26
+ if (binding !== undefined && typeof binding.send === 'function')
27
+ return binding;
28
+ }
29
+ throw ErrorFactory.createConfigError(`Missing Cloudflare send_email binding (tried: ${candidateNames.length > 0 ? candidateNames.join(', ') : 'none'})`);
30
+ };
31
+ const decodeAttachment = (payload) => ({
32
+ filename: payload.filename,
33
+ content: Buffer.from(payload.contentBase64, 'base64'),
34
+ });
35
+ const parseAttachments = (value) => {
36
+ if (value === undefined)
37
+ return undefined;
38
+ if (!isArray(value))
39
+ throw ErrorFactory.createValidationError('attachments must be an array');
40
+ return value.map((entry) => {
41
+ if (!isObject(entry)) {
42
+ throw ErrorFactory.createValidationError('attachments entries must be objects');
43
+ }
44
+ const filename = entry['filename'];
45
+ const contentBase64 = entry['contentBase64'];
46
+ if (!isNonEmptyString(filename)) {
47
+ throw ErrorFactory.createValidationError('attachment filename is required');
48
+ }
49
+ if (!isNonEmptyString(contentBase64)) {
50
+ throw ErrorFactory.createValidationError('attachment contentBase64 is required');
51
+ }
52
+ return decodeAttachment({ filename, contentBase64 });
53
+ });
54
+ };
55
+ const parseMessage = (payload) => {
56
+ if (!isObject(payload))
57
+ throw ErrorFactory.createValidationError('message is required');
58
+ const fromRaw = payload['from'];
59
+ if (!isObject(fromRaw) || !isNonEmptyString(fromRaw['email'])) {
60
+ throw ErrorFactory.createValidationError('message.from.email is required');
61
+ }
62
+ const toRaw = payload['to'];
63
+ if (!isNonEmptyString(payload['subject']) ||
64
+ !isNonEmptyString(payload['text']) ||
65
+ !(isNonEmptyString(toRaw) || (isArray(toRaw) && toRaw.every((item) => isNonEmptyString(item))))) {
66
+ throw ErrorFactory.createValidationError('message.to, message.subject, and message.text are required');
67
+ }
68
+ return {
69
+ to: toRaw,
70
+ from: {
71
+ email: fromRaw['email'],
72
+ name: isNonEmptyString(fromRaw['name']) ? fromRaw['name'] : undefined,
73
+ },
74
+ subject: payload['subject'],
75
+ text: payload['text'],
76
+ html: isNonEmptyString(payload['html']) ? payload['html'] : undefined,
77
+ attachments: parseAttachments(payload['attachments']),
78
+ };
79
+ };
80
+ const handleSend = async (request, env) => {
81
+ const check = await readAndVerifyJson(request, env, {
82
+ secretEnvVar: 'MAIL_CLOUDFLARE_PROXY_SECRET',
83
+ missingSecretStatus: 401,
84
+ missingSecretMessage: 'Missing signing secret (MAIL_CLOUDFLARE_PROXY_SECRET or APP_KEY)',
85
+ defaultSigningWindowMs: DEFAULT_SIGNING_WINDOW_MS,
86
+ defaultMaxBodyBytes: DEFAULT_MAX_BODY_BYTES,
87
+ });
88
+ if (!check.ok)
89
+ return check.response;
90
+ try {
91
+ const payload = check.payload;
92
+ if (!isObject(payload)) {
93
+ return toErrorResponse(400, 'VALIDATION_ERROR', 'Invalid body');
94
+ }
95
+ const message = parseMessage(payload['message']);
96
+ const requestedBinding = isNonEmptyString(payload['binding']) ? payload['binding'] : undefined;
97
+ const binding = resolveBinding(env, requestedBinding);
98
+ const { EmailMessage } = await importCloudflareEmail();
99
+ const raw = buildRfc2822Message(message);
100
+ await Promise.all(normalizeRecipients(message.to).map(async (recipient) => binding.send(new EmailMessage(message.from.email, recipient, raw))));
101
+ return new Response(JSON.stringify({ ok: true }), {
102
+ status: 200,
103
+ headers: {
104
+ 'Content-Type': 'application/json; charset=utf-8',
105
+ 'Cache-Control': 'no-store',
106
+ },
107
+ });
108
+ }
109
+ catch (error) {
110
+ const message = error instanceof Error ? error.message : 'Email send failed';
111
+ return toErrorResponse(500, 'EMAIL_SEND_ERROR', message);
112
+ }
113
+ };
114
+ export const ZintrustEmailProxy = Object.freeze({
115
+ _ZINTRUST_CLOUDFLARE_EMAIL_PROXY_VERSION: '0.1.15',
116
+ _ZINTRUST_CLOUDFLARE_EMAIL_PROXY_BUILD_DATE: '__BUILD_DATE__',
117
+ async fetch(request, env) {
118
+ const url = new URL(request.url);
119
+ const methodError = RequestValidator.requirePost(request.method);
120
+ if (methodError !== null) {
121
+ return toErrorResponse(405, methodError.code, 'Method not allowed');
122
+ }
123
+ if (url.pathname === '/zin/mail/cloudflare/send') {
124
+ return handleSend(request, env);
125
+ }
126
+ return toErrorResponse(404, 'NOT_FOUND', 'Not found');
127
+ },
128
+ });
129
+ export default ZintrustEmailProxy;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../../src/proxy/email/register.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { ProxyRegistry } from '../ProxyRegistry.js';
2
+ ProxyRegistry.register({
3
+ name: 'email',
4
+ description: 'Cloudflare email Worker proxy endpoint',
5
+ });
package/src/proxy.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { ZintrustD1Proxy } from './proxy/d1/ZintrustD1Proxy';
2
+ export { ZintrustEmailProxy } from './proxy/email/ZintrustEmailProxy';
2
3
  export { ErrorHandler } from './proxy/ErrorHandler';
3
4
  export { ZintrustKvProxy } from './proxy/kv/ZintrustKvProxy';
4
5
  export { RequestValidator } from './proxy/RequestValidator';
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
package/src/proxy.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { ZintrustD1Proxy } from './proxy/d1/ZintrustD1Proxy.js';
2
+ export { ZintrustEmailProxy } from './proxy/email/ZintrustEmailProxy.js';
2
3
  export { ErrorHandler } from './proxy/ErrorHandler.js';
3
4
  export { ZintrustKvProxy } from './proxy/kv/ZintrustKvProxy.js';
4
5
  export { RequestValidator } from './proxy/RequestValidator.js';
@@ -0,0 +1,18 @@
1
+ export type MailAddress = {
2
+ email: string;
3
+ name?: string;
4
+ };
5
+ export type MailAttachment = {
6
+ filename: string;
7
+ content: Buffer;
8
+ };
9
+ export type MailMessage = {
10
+ to: string | string[];
11
+ from: MailAddress;
12
+ subject: string;
13
+ text: string;
14
+ html?: string;
15
+ attachments?: MailAttachment[];
16
+ };
17
+ export declare const buildRfc2822Message: (msg: MailMessage) => string;
18
+ //# sourceMappingURL=MailMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MailMessage.d.ts","sourceRoot":"","sources":["../../../../src/tools/mail/MailMessage.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;CAChC,CAAC;AAgBF,eAAO,MAAM,mBAAmB,GAAI,KAAK,WAAW,KAAG,MAuFtD,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { generateUuid } from '../../common/utility.js';
2
+ import { isNonEmptyString } from '../../helper/index.js';
3
+ const normalizeRecipients = (to) => (Array.isArray(to) ? to : [to]);
4
+ const resolveMessageIdDomain = (senderEmail) => {
5
+ const domainCandidate = senderEmail.split('@')[1]?.trim().toLowerCase() ?? '';
6
+ if (!isNonEmptyString(domainCandidate))
7
+ return 'localhost';
8
+ const normalizedDomain = domainCandidate.replace(/^<+|>+$/g, '').replace(/\.+$/g, '');
9
+ if (!isNonEmptyString(normalizedDomain) || !normalizedDomain.includes('.')) {
10
+ return normalizedDomain === '' ? 'localhost' : normalizedDomain;
11
+ }
12
+ return normalizedDomain;
13
+ };
14
+ export const buildRfc2822Message = (msg) => {
15
+ const toList = normalizeRecipients(msg.to);
16
+ const fromNameRaw = msg.from.name;
17
+ const fromName = typeof fromNameRaw === 'string' ? fromNameRaw.trim() : '';
18
+ const fromHeader = fromName === '' ? msg.from.email : `${fromName} <${msg.from.email}>`;
19
+ const toHeader = toList.join(', ');
20
+ const subject = msg.subject;
21
+ const messageId = `<${generateUuid().replaceAll('-', '')}@${resolveMessageIdDomain(msg.from.email)}>`;
22
+ const headers = [
23
+ `From: ${fromHeader}`,
24
+ `To: ${toHeader}`,
25
+ `Subject: ${subject}`,
26
+ `Date: ${new Date().toUTCString()}`,
27
+ `Message-ID: ${messageId}`,
28
+ 'MIME-Version: 1.0',
29
+ ];
30
+ const attachParts = (attachments, innerBody) => {
31
+ const mixedBoundary = `mixed_${generateUuid().replaceAll('-', '')}`;
32
+ const lines = [];
33
+ lines.push(`Content-Type: multipart/mixed; boundary="${mixedBoundary}"`, '', `--${mixedBoundary}`, innerBody);
34
+ for (const attachment of attachments) {
35
+ const b64 = attachment.content.toString('base64');
36
+ lines.push(`--${mixedBoundary}`, `Content-Type: application/octet-stream; name="${attachment.filename}"`, 'Content-Transfer-Encoding: base64', `Content-Disposition: attachment; filename="${attachment.filename}"`, '');
37
+ for (let index = 0; index < b64.length; index += 76) {
38
+ lines.push(b64.slice(index, index + 76));
39
+ }
40
+ }
41
+ lines.push(`--${mixedBoundary}--`, '');
42
+ return lines.join('\r\n');
43
+ };
44
+ if (typeof msg.html === 'string' && msg.html !== '') {
45
+ const boundary = `zintrust_${generateUuid().replaceAll('-', '')}`;
46
+ headers.push(`Content-Type: multipart/alternative; boundary="${boundary}"`);
47
+ const parts = [
48
+ `--${boundary}`,
49
+ 'Content-Type: text/plain; charset=utf-8',
50
+ 'Content-Transfer-Encoding: 7bit',
51
+ '',
52
+ msg.text,
53
+ `--${boundary}`,
54
+ 'Content-Type: text/html; charset=utf-8',
55
+ 'Content-Transfer-Encoding: 7bit',
56
+ '',
57
+ msg.html,
58
+ `--${boundary}--`,
59
+ '',
60
+ ];
61
+ const inner = `${parts.join('\r\n')}`;
62
+ if (msg.attachments && msg.attachments.length > 0) {
63
+ const mixed = attachParts(msg.attachments, inner);
64
+ return `${headers.join('\r\n')}\r\n\r\n${mixed}`;
65
+ }
66
+ return `${headers.join('\r\n')}\r\n\r\n${inner}`;
67
+ }
68
+ if (msg.attachments && msg.attachments.length > 0) {
69
+ const inner = ['Content-Type: text/plain; charset=utf-8', '', msg.text, ''].join('\r\n');
70
+ const mixed = attachParts(msg.attachments, inner);
71
+ return `${headers.join('\r\n')}\r\n\r\n${mixed}`;
72
+ }
73
+ headers.push('Content-Type: text/plain; charset=utf-8');
74
+ return `${headers.join('\r\n')}\r\n\r\n${msg.text}\r\n`;
75
+ };
@@ -0,0 +1,13 @@
1
+ import { type MailMessage } from '../../mail/MailMessage';
2
+ export type CloudflareMailConfig = {
3
+ driver: 'cl';
4
+ binding: string;
5
+ };
6
+ export declare const CloudflareDriver: Readonly<{
7
+ send(config: CloudflareMailConfig, message: MailMessage): Promise<{
8
+ ok: boolean;
9
+ messageId?: string;
10
+ }>;
11
+ }>;
12
+ export default CloudflareDriver;
13
+ //# sourceMappingURL=Cloudflare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cloudflare.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mail/drivers/Cloudflare.ts"],"names":[],"mappings":"AAKA,OAAO,EAAyC,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAElG,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,IAAI,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAuIF,eAAO,MAAM,gBAAgB;iBAEjB,oBAAoB,WACnB,WAAW,GACnB,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;EA8B/C,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,105 @@
1
+ import { RemoteSignedJson } from '../../../common/RemoteSignedJson.js';
2
+ import { Cloudflare } from '../../../config/cloudflare.js';
3
+ import { Env } from '../../../config/env.js';
4
+ import { ErrorFactory } from '../../../exceptions/ZintrustError.js';
5
+ import { buildRfc2822Message } from '../../mail/MailMessage.js';
6
+ const resolveSigningPrefix = (baseUrl) => {
7
+ try {
8
+ const parsed = new URL(baseUrl);
9
+ const path = parsed.pathname.endsWith('/') ? parsed.pathname.slice(0, -1) : parsed.pathname;
10
+ if (path === '' || path === '/')
11
+ return undefined;
12
+ return path;
13
+ }
14
+ catch {
15
+ return undefined;
16
+ }
17
+ };
18
+ const normalizeRecipients = (to) => (Array.isArray(to) ? to : [to]);
19
+ const shouldUseProxy = () => Env.get('MAIL_CLOUDFLARE_PROXY_URL', '').trim() !== '';
20
+ const createRemoteConfig = () => {
21
+ const baseUrl = Env.get('MAIL_CLOUDFLARE_PROXY_URL', '');
22
+ const timeoutMs = Env.getInt('MAIL_CLOUDFLARE_PROXY_TIMEOUT_MS', Env.getInt('ZT_PROXY_TIMEOUT_MS', Env.REQUEST_TIMEOUT));
23
+ return {
24
+ baseUrl,
25
+ keyId: Env.get('MAIL_CLOUDFLARE_PROXY_KEY_ID', ''),
26
+ secret: Env.get('MAIL_CLOUDFLARE_PROXY_SECRET', ''),
27
+ timeoutMs,
28
+ signaturePathPrefixToStrip: resolveSigningPrefix(baseUrl),
29
+ missingUrlMessage: 'Cloudflare mail proxy URL is missing (MAIL_CLOUDFLARE_PROXY_URL)',
30
+ missingCredentialsMessage: 'Cloudflare mail proxy signing credentials are missing (MAIL_CLOUDFLARE_PROXY_KEY_ID / MAIL_CLOUDFLARE_PROXY_SECRET). Fallbacks: APP_NAME and APP_KEY.',
31
+ messages: {
32
+ unauthorized: 'Cloudflare mail proxy unauthorized',
33
+ forbidden: 'Cloudflare mail proxy forbidden',
34
+ rateLimited: 'Cloudflare mail proxy rate limited',
35
+ rejected: 'Cloudflare mail proxy rejected request',
36
+ error: 'Cloudflare mail proxy error',
37
+ timedOut: 'Cloudflare mail proxy request timed out',
38
+ },
39
+ };
40
+ };
41
+ const serializeMessage = (message) => ({
42
+ to: message.to,
43
+ from: message.from,
44
+ subject: message.subject,
45
+ text: message.text,
46
+ html: message.html,
47
+ attachments: message.attachments?.map((attachment) => ({
48
+ filename: attachment.filename,
49
+ contentBase64: attachment.content.toString('base64'),
50
+ })),
51
+ });
52
+ const sendViaProxy = async (config, message) => {
53
+ const response = await RemoteSignedJson.request(createRemoteConfig(), '/zin/mail/cloudflare/send', {
54
+ binding: config.binding,
55
+ message: serializeMessage(message),
56
+ });
57
+ return {
58
+ ok: response.ok === true,
59
+ messageId: response.messageId,
60
+ };
61
+ };
62
+ const resolveBinding = (config) => {
63
+ const env = Cloudflare.getWorkersEnv();
64
+ if (env === null) {
65
+ throw ErrorFactory.createConfigError('Cloudflare mail driver requires a Cloudflare Workers runtime with a send_email binding');
66
+ }
67
+ const candidateNames = [config.binding, 'SEND_EMAIL', 'SEB'].filter((name, index, all) => name.trim() !== '' && all.indexOf(name) === index);
68
+ for (const name of candidateNames) {
69
+ const binding = env[name];
70
+ if (binding !== undefined && typeof binding.send === 'function')
71
+ return binding;
72
+ }
73
+ throw ErrorFactory.createConfigError(`Cloudflare mail binding not found. Set MAIL_CLOUDFLARE_BINDING to a Wrangler send_email binding name (tried: ${candidateNames.join(', ')})`);
74
+ };
75
+ const importCloudflareEmail = async () => {
76
+ try {
77
+ return (await import('cloudflare:email'));
78
+ }
79
+ catch {
80
+ throw ErrorFactory.createConfigError('Cloudflare mail driver could not load the cloudflare:email runtime API');
81
+ }
82
+ };
83
+ export const CloudflareDriver = Object.freeze({
84
+ async send(config, message) {
85
+ const from = message.from.email.trim();
86
+ if (from === '') {
87
+ throw ErrorFactory.createConfigError('Cloudflare mail driver requires from.email');
88
+ }
89
+ const recipients = normalizeRecipients(message.to)
90
+ .map((recipient) => recipient.trim())
91
+ .filter((recipient) => recipient !== '');
92
+ if (recipients.length === 0) {
93
+ throw ErrorFactory.createConfigError('Cloudflare mail driver requires at least one recipient');
94
+ }
95
+ if (shouldUseProxy()) {
96
+ return sendViaProxy(config, message);
97
+ }
98
+ const binding = resolveBinding(config);
99
+ const { EmailMessage } = await importCloudflareEmail();
100
+ const raw = buildRfc2822Message(message);
101
+ await Promise.all(recipients.map(async (recipient) => binding.send(new EmailMessage(from, recipient, raw))));
102
+ return { ok: true };
103
+ },
104
+ });
105
+ export default CloudflareDriver;
@@ -1,3 +1,4 @@
1
+ import { type MailAddress, type MailAttachment, type MailMessage } from '../../mail/MailMessage';
1
2
  export type SmtpConfig = {
2
3
  host: string;
3
4
  port: number;
@@ -5,22 +6,7 @@ export type SmtpConfig = {
5
6
  password?: string;
6
7
  secure?: boolean | 'starttls';
7
8
  };
8
- export type MailAddress = {
9
- email: string;
10
- name?: string;
11
- };
12
- export type MailAttachment = {
13
- filename: string;
14
- content: Buffer;
15
- };
16
- export type MailMessage = {
17
- to: string | string[];
18
- from: MailAddress;
19
- subject: string;
20
- text: string;
21
- html?: string;
22
- attachments?: MailAttachment[];
23
- };
9
+ export type { MailAddress, MailAttachment, MailMessage };
24
10
  export type SendResult = {
25
11
  ok: boolean;
26
12
  provider: 'smtp';
@@ -1 +1 @@
1
- {"version":3,"file":"Smtp.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mail/drivers/Smtp.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAuqBF,eAAO,MAAM,UAAU;IACrB;;;;OAIG;iBACgB,UAAU,WAAW,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;EAuDzE,CAAC;AAEH,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"Smtp.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mail/drivers/Smtp.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CAC/B,CAAC;AAEF,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AAEzD,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA6kBF,eAAO,MAAM,UAAU;IACrB;;;;OAIG;iBACgB,UAAU,WAAW,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;EAuDzE,CAAC;AAEH,eAAe,UAAU,CAAC"}
@@ -1,4 +1,3 @@
1
- import { generateUuid } from '../../../common/utility.js';
2
1
  import { RemoteSignedJson } from '../../../common/RemoteSignedJson.js';
3
2
  import { Cloudflare } from '../../../config/cloudflare.js';
4
3
  import { Env } from '../../../config/env.js';
@@ -7,6 +6,7 @@ import { ErrorFactory } from '../../../exceptions/ZintrustError.js';
7
6
  import * as net from '../../../node-singletons/net.js';
8
7
  import * as tls from '../../../node-singletons/tls.js';
9
8
  import { normalizeSigningCredentials } from '../../../proxy/SigningService.js';
9
+ import { buildRfc2822Message, } from '../../mail/MailMessage.js';
10
10
  const resolveSigningPrefix = (baseUrl) => {
11
11
  try {
12
12
  const parsed = new URL(baseUrl);
@@ -434,69 +434,6 @@ const doQuit = async (socket, reader) => {
434
434
  const quit = await reader.readResponse();
435
435
  assertCode(quit, [221, 250], 'QUIT');
436
436
  };
437
- const buildRfc2822Message = (msg) => {
438
- const toList = normalizeRecipients(msg.to);
439
- const fromNameRaw = msg.from.name;
440
- const fromName = typeof fromNameRaw === 'string' ? fromNameRaw.trim() : '';
441
- const fromHeader = fromName === '' ? msg.from.email : `${fromName} <${msg.from.email}>`;
442
- const toHeader = toList.join(', ');
443
- const subject = msg.subject;
444
- const headers = [
445
- `From: ${fromHeader}`,
446
- `To: ${toHeader}`,
447
- `Subject: ${subject}`,
448
- 'MIME-Version: 1.0',
449
- ];
450
- const attachParts = (attachments, innerBody) => {
451
- const mixedBoundary = `mixed_${generateUuid().replaceAll('-', '')}`;
452
- const lines = [];
453
- lines.push(`Content-Type: multipart/mixed; boundary="${mixedBoundary}"`, '', `--${mixedBoundary}`, innerBody);
454
- // attachments
455
- for (const a of attachments) {
456
- const b64 = a.content.toString('base64');
457
- lines.push(`--${mixedBoundary}`, `Content-Type: application/octet-stream; name="${a.filename}"`, 'Content-Transfer-Encoding: base64', `Content-Disposition: attachment; filename="${a.filename}"`, '');
458
- // break base64 into 76 char lines per RFC
459
- for (let i = 0; i < b64.length; i += 76) {
460
- lines.push(b64.slice(i, i + 76));
461
- }
462
- }
463
- lines.push(`--${mixedBoundary}--`, '');
464
- return lines.join('\r\n');
465
- };
466
- if (typeof msg.html === 'string' && msg.html !== '') {
467
- const boundary = `zintrust_${generateUuid().replaceAll('-', '')}`;
468
- headers.push(`Content-Type: multipart/alternative; boundary="${boundary}"`);
469
- const parts = [
470
- `--${boundary}`,
471
- 'Content-Type: text/plain; charset=utf-8',
472
- 'Content-Transfer-Encoding: 7bit',
473
- '',
474
- msg.text,
475
- `--${boundary}`,
476
- 'Content-Type: text/html; charset=utf-8',
477
- 'Content-Transfer-Encoding: 7bit',
478
- '',
479
- msg.html,
480
- `--${boundary}--`,
481
- '',
482
- ];
483
- const inner = `${parts.join('\r\n')}`;
484
- if (msg.attachments && msg.attachments.length > 0) {
485
- // wrap in multipart/mixed
486
- const mixed = attachParts(msg.attachments, inner);
487
- return `${headers.join('\r\n')}\r\n\r\n${mixed}`;
488
- }
489
- return `${headers.join('\r\n')}\r\n\r\n${inner}`;
490
- }
491
- // plain text
492
- if (msg.attachments && msg.attachments.length > 0) {
493
- const inner = ['Content-Type: text/plain; charset=utf-8', '', msg.text, ''].join('\r\n');
494
- const mixed = attachParts(msg.attachments, inner);
495
- return `${headers.join('\r\n')}\r\n\r\n${mixed}`;
496
- }
497
- headers.push('Content-Type: text/plain; charset=utf-8');
498
- return `${headers.join('\r\n')}\r\n\r\n${msg.text}\r\n`;
499
- };
500
437
  const dotStuff = (data) => data
501
438
  .replaceAll(/\r?\n/g, '\r\n')
502
439
  .split('\r\n')
@@ -12,7 +12,7 @@ export type SendMailInput = {
12
12
  };
13
13
  export type SendMailResult = {
14
14
  ok: boolean;
15
- driver: 'sendgrid' | 'disabled' | 'smtp' | 'ses' | 'mailgun' | 'nodemailer';
15
+ driver: 'sendgrid' | 'disabled' | 'smtp' | 'ses' | 'mailgun' | 'nodemailer' | 'cl';
16
16
  messageId?: string;
17
17
  };
18
18
  export interface RenderMailInput {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tools/mail/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAI7E,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,YAAY,CAAC;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA6JF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAsBD,eAAO,MAAM,IAAI;IACf;;OAEG;kBACiB,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrD,sBAAsB;gBACJ,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAGnD;;;;OAIG;iBACU,MAAM;cA5Eb,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,cAAc,CAAC;;gBAgFrC,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;EAGzD,CAAC;AAEH,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tools/mail/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAI7E,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,YAAY,GAAG,IAAI,CAAC;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAuKF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAgBD,eAAO,MAAM,IAAI;IACf;;OAEG;kBACiB,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrD,sBAAsB;gBACJ,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAGnD;;;;OAIG;iBACU,MAAM;cAtEb,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,cAAc,CAAC;;gBA0ErC,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;EAGzD,CAAC;AAEH,eAAe,IAAI,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { SystemTraceBridge } from '../../trace/SystemTraceBridge.js';
2
2
  import { mailConfig } from '../../config/mail.js';
3
3
  import { ErrorFactory } from '../../exceptions/ZintrustError.js';
4
+ import { CloudflareDriver } from './drivers/Cloudflare.js';
4
5
  import { SesDriver } from './drivers/Ses.js';
5
6
  import { resolveAttachments } from './attachments.js';
6
7
  import { MailDriverRegistry } from './MailDriverRegistry.js';
@@ -56,6 +57,10 @@ const normalizeMailRecipients = (to) => {
56
57
  return Array.isArray(to) ? to.join(', ') : to;
57
58
  };
58
59
  const sendWithDriver = async (driver, message) => {
60
+ if (driver.driver === 'cl') {
61
+ const result = await CloudflareDriver.send({ driver: 'cl', binding: driver.binding }, message);
62
+ return { ok: result.ok, driver: 'cl', messageId: result.messageId };
63
+ }
59
64
  if (driver.driver === 'ses') {
60
65
  const result = await SesDriver.send({ region: driver.region }, message);
61
66
  return { ok: result.ok, driver: 'ses', messageId: result.messageId };
@@ -70,11 +75,14 @@ const sendWithDriver = async (driver, message) => {
70
75
  messageId: typeof result?.messageId === 'string' ? result.messageId : undefined,
71
76
  };
72
77
  }
73
- if (driver.driver === 'sendgrid' || driver.driver === 'mailgun' || driver.driver === 'smtp') {
78
+ if (driver.driver === 'sendgrid' ||
79
+ driver.driver === 'mailgun' ||
80
+ driver.driver === 'smtp' ||
81
+ driver.driver === 'nodemailer') {
74
82
  throw ErrorFactory.createConfigError(`Mail driver not registered: ${driver.driver} (run \`zin add mail:${driver.driver}\` / \`npm i @zintrust/mail-${driver.driver}\`)`);
75
83
  }
76
84
  // Config exists for future drivers, but implementations are intentionally CLI/runtime-safe and added incrementally.
77
- throw ErrorFactory.createConfigError(`Mail driver not registered: ${mailConfig.default}. Available drivers: ses, sendgrid, mailgun, smtp. Run \`zin add mail:${mailConfig.default}\` to install.`);
85
+ throw ErrorFactory.createConfigError(`Mail driver not registered: ${mailConfig.default}. Available drivers: cl, ses, sendgrid, mailgun, smtp, nodemailer. Run \`zin add mail:${mailConfig.default}\` to install.`);
78
86
  };
79
87
  const createMailer = (name) => Object.freeze({
80
88
  async send(input) {
@@ -104,11 +112,11 @@ async function renderTemplateToHtml(input) {
104
112
  // Import lazily to avoid circular deps
105
113
  const { loadTemplate } = await import('./template-loader.js');
106
114
  if (looksLikeHtml(template)) {
107
- return loadTemplate(template, (variables ?? {}));
115
+ return loadTemplate(template, variables ?? {});
108
116
  }
109
117
  // template-loader expects full filename
110
118
  const fileName = template.endsWith('.html') ? template : `${template}.html`;
111
- return loadTemplate(fileName, (variables ?? {}));
119
+ return loadTemplate(fileName, variables ?? {});
112
120
  }
113
121
  export const Mail = Object.freeze({
114
122
  /**