@soulbatical/tetra-core 0.1.29 → 0.1.31
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.
Potentially problematic release.
This version of @soulbatical/tetra-core might be problematic. Click here for more details.
- package/dist/shared/email/EmailService.d.ts +6 -0
- package/dist/shared/email/EmailService.d.ts.map +1 -1
- package/dist/shared/email/EmailService.js +33 -10
- package/dist/shared/email/EmailService.js.map +1 -1
- package/dist/shared/email/index.d.ts +2 -1
- package/dist/shared/email/index.d.ts.map +1 -1
- package/dist/shared/email/index.js +2 -1
- package/dist/shared/email/index.js.map +1 -1
- package/dist/shared/email/smtp.d.ts +17 -0
- package/dist/shared/email/smtp.d.ts.map +1 -0
- package/dist/shared/email/smtp.js +41 -0
- package/dist/shared/email/smtp.js.map +1 -0
- package/dist/shared/email/types.d.ts +19 -0
- package/dist/shared/email/types.d.ts.map +1 -1
- package/package.json +8 -5
|
@@ -25,6 +25,12 @@ export declare class EmailService {
|
|
|
25
25
|
success: boolean;
|
|
26
26
|
logId?: string;
|
|
27
27
|
}>;
|
|
28
|
+
/**
|
|
29
|
+
* Resolve transport and send email.
|
|
30
|
+
* Priority: explicit config.transport > auto-detect (smtp if smtpHost set, else mailgun).
|
|
31
|
+
*/
|
|
32
|
+
private deliver;
|
|
33
|
+
private resolveTransport;
|
|
28
34
|
/**
|
|
29
35
|
* Template lookup with language + org fallback chain.
|
|
30
36
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailService.d.ts","sourceRoot":"","sources":["../../../src/shared/email/EmailService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"EmailService.d.ts","sourceRoot":"","sources":["../../../src/shared/email/EmailService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAoC,MAAM,YAAY,CAAC;AAI/F,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;gBADN,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,WAAW;IAG7B;;;;;;;;OAQG;IACG,IAAI,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAwC9E;;;OAGG;YACW,OAAO;IA2BrB,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;YACW,YAAY;IAgD1B;;;OAGG;IACH,OAAO,CAAC,MAAM;IAQd;;OAEG;YACW,SAAS;IAsCvB;;OAEG;YACW,SAAS;CAkBxB"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import Handlebars from 'handlebars';
|
|
10
10
|
import { sendMailgunEmail } from './mailgun.js';
|
|
11
|
+
import { sendSmtpEmail } from './smtp.js';
|
|
11
12
|
export class EmailService {
|
|
12
13
|
supabase;
|
|
13
14
|
config;
|
|
@@ -44,16 +45,8 @@ export class EmailService {
|
|
|
44
45
|
variables: opts.variables,
|
|
45
46
|
feedbackId: opts.feedbackId,
|
|
46
47
|
});
|
|
47
|
-
// 3. Send via
|
|
48
|
-
const result = await
|
|
49
|
-
from: this.config.fromAddress,
|
|
50
|
-
to: opts.to,
|
|
51
|
-
subject,
|
|
52
|
-
html,
|
|
53
|
-
apiKey: this.config.mailgunApiKey,
|
|
54
|
-
domain: this.config.mailgunDomain,
|
|
55
|
-
endpoint: this.config.mailgunEndpoint,
|
|
56
|
-
});
|
|
48
|
+
// 3. Send via configured transport
|
|
49
|
+
const result = await this.deliver({ from: this.config.fromAddress, to: opts.to, subject, html });
|
|
57
50
|
// 4. Update log
|
|
58
51
|
if (logId) {
|
|
59
52
|
await this.updateLog(logId, {
|
|
@@ -64,6 +57,36 @@ export class EmailService {
|
|
|
64
57
|
}
|
|
65
58
|
return { success: result.success, logId: logId || undefined };
|
|
66
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Resolve transport and send email.
|
|
62
|
+
* Priority: explicit config.transport > auto-detect (smtp if smtpHost set, else mailgun).
|
|
63
|
+
*/
|
|
64
|
+
async deliver(params) {
|
|
65
|
+
const transport = this.resolveTransport();
|
|
66
|
+
if (transport === 'smtp') {
|
|
67
|
+
return sendSmtpEmail({
|
|
68
|
+
...params,
|
|
69
|
+
smtpHost: this.config.smtpHost,
|
|
70
|
+
smtpPort: this.config.smtpPort ?? 587,
|
|
71
|
+
smtpUser: this.config.smtpUser,
|
|
72
|
+
smtpPass: this.config.smtpPass,
|
|
73
|
+
smtpSecure: this.config.smtpSecure,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return sendMailgunEmail({
|
|
77
|
+
...params,
|
|
78
|
+
apiKey: this.config.mailgunApiKey,
|
|
79
|
+
domain: this.config.mailgunDomain,
|
|
80
|
+
endpoint: this.config.mailgunEndpoint,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
resolveTransport() {
|
|
84
|
+
if (this.config.transport)
|
|
85
|
+
return this.config.transport;
|
|
86
|
+
if (this.config.smtpHost && this.config.smtpUser && this.config.smtpPass)
|
|
87
|
+
return 'smtp';
|
|
88
|
+
return 'mailgun';
|
|
89
|
+
}
|
|
67
90
|
/**
|
|
68
91
|
* Template lookup with language + org fallback chain.
|
|
69
92
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailService.js","sourceRoot":"","sources":["../../../src/shared/email/EmailService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"EmailService.js","sourceRoot":"","sources":["../../../src/shared/email/EmailService.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export { EmailService } from './EmailService.js';
|
|
7
7
|
export { sendMailgunEmail } from './mailgun.js';
|
|
8
|
+
export { sendSmtpEmail } from './smtp.js';
|
|
8
9
|
export { escapeHtml } from './sanitize.js';
|
|
9
|
-
export type { EmailConfig, SendEmailOpts, EmailTemplate, EmailLogEntry, MailgunResponse, } from './types.js';
|
|
10
|
+
export type { EmailConfig, SendEmailOpts, EmailTemplate, EmailLogEntry, MailgunResponse, SmtpResponse, EmailSendResponse, } from './types.js';
|
|
10
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/email/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/email/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,YAAY,EACV,WAAW,EACX,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
*/
|
|
6
6
|
// Service
|
|
7
7
|
export { EmailService } from './EmailService.js';
|
|
8
|
-
//
|
|
8
|
+
// Transport helpers
|
|
9
9
|
export { sendMailgunEmail } from './mailgun.js';
|
|
10
|
+
export { sendSmtpEmail } from './smtp.js';
|
|
10
11
|
// Sanitization
|
|
11
12
|
export { escapeHtml } from './sanitize.js';
|
|
12
13
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/email/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/email/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,oBAAoB;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,eAAe;AACf,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMTP email helper — uses nodemailer for sending via SMTP (Gmail, Outlook, etc.).
|
|
3
|
+
* Graceful no-op when credentials are missing.
|
|
4
|
+
*/
|
|
5
|
+
import type { SmtpResponse } from './types.js';
|
|
6
|
+
export declare function sendSmtpEmail(params: {
|
|
7
|
+
from: string;
|
|
8
|
+
to: string;
|
|
9
|
+
subject: string;
|
|
10
|
+
html: string;
|
|
11
|
+
smtpHost: string;
|
|
12
|
+
smtpPort: number;
|
|
13
|
+
smtpUser: string;
|
|
14
|
+
smtpPass: string;
|
|
15
|
+
smtpSecure?: boolean;
|
|
16
|
+
}): Promise<SmtpResponse>;
|
|
17
|
+
//# sourceMappingURL=smtp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smtp.d.ts","sourceRoot":"","sources":["../../../src/shared/email/smtp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAuCxB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMTP email helper — uses nodemailer for sending via SMTP (Gmail, Outlook, etc.).
|
|
3
|
+
* Graceful no-op when credentials are missing.
|
|
4
|
+
*/
|
|
5
|
+
export async function sendSmtpEmail(params) {
|
|
6
|
+
const { smtpHost, smtpUser, smtpPass } = params;
|
|
7
|
+
if (!smtpHost || !smtpUser || !smtpPass) {
|
|
8
|
+
console.warn('[email/smtp] credentials missing — email not sent');
|
|
9
|
+
return { success: false, message: 'SMTP not configured' };
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
// Dynamic import to keep nodemailer optional at runtime
|
|
13
|
+
const nodemailer = await import('nodemailer');
|
|
14
|
+
const transporter = nodemailer.default.createTransport({
|
|
15
|
+
host: params.smtpHost,
|
|
16
|
+
port: params.smtpPort,
|
|
17
|
+
secure: params.smtpSecure ?? params.smtpPort === 465,
|
|
18
|
+
auth: {
|
|
19
|
+
user: params.smtpUser,
|
|
20
|
+
pass: params.smtpPass,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
const info = await transporter.sendMail({
|
|
24
|
+
from: params.from,
|
|
25
|
+
to: params.to,
|
|
26
|
+
subject: params.subject,
|
|
27
|
+
html: params.html,
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
30
|
+
success: true,
|
|
31
|
+
message: 'Email sent via SMTP',
|
|
32
|
+
messageId: info.messageId,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
37
|
+
console.error('[email/smtp] send failed:', msg);
|
|
38
|
+
return { success: false, message: `SMTP send failed: ${msg}` };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=smtp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smtp.js","sourceRoot":"","sources":["../../../src/shared/email/smtp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAUnC;IACC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAEhD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAClE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC;IAC5D,CAAC;IAED,IAAI,CAAC;QACH,wDAAwD;QACxD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAE9C,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC;YACrD,IAAI,EAAE,MAAM,CAAC,QAAQ;YACrB,IAAI,EAAE,MAAM,CAAC,QAAQ;YACrB,MAAM,EAAE,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG;YACpD,IAAI,EAAE;gBACJ,IAAI,EAAE,MAAM,CAAC,QAAQ;gBACrB,IAAI,EAAE,MAAM,CAAC,QAAQ;aACtB;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;YACtC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,qBAAqB;YAC9B,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,qBAAqB,GAAG,EAAE,EAAE,CAAC;IACjE,CAAC;AACH,CAAC"}
|
|
@@ -10,12 +10,24 @@ export interface EmailConfig {
|
|
|
10
10
|
defaultLanguage: 'nl' | 'en';
|
|
11
11
|
/** Frontend URL for unsubscribe links etc. */
|
|
12
12
|
frontendUrl: string;
|
|
13
|
+
/** Transport: 'smtp' or 'mailgun' (default: auto-detect based on which credentials are set) */
|
|
14
|
+
transport?: 'smtp' | 'mailgun';
|
|
13
15
|
/** Mailgun API key — no-op when missing */
|
|
14
16
|
mailgunApiKey?: string;
|
|
15
17
|
/** Mailgun domain, e.g. mg.vincifox.com */
|
|
16
18
|
mailgunDomain?: string;
|
|
17
19
|
/** Mailgun API endpoint — defaults to EU endpoint */
|
|
18
20
|
mailgunEndpoint?: string;
|
|
21
|
+
/** SMTP host, e.g. smtp.gmail.com */
|
|
22
|
+
smtpHost?: string;
|
|
23
|
+
/** SMTP port — defaults to 587 */
|
|
24
|
+
smtpPort?: number;
|
|
25
|
+
/** SMTP username (for Gmail: full email address) */
|
|
26
|
+
smtpUser?: string;
|
|
27
|
+
/** SMTP password (for Gmail: App Password, not account password) */
|
|
28
|
+
smtpPass?: string;
|
|
29
|
+
/** Use TLS on connect (port 465). Defaults to false (STARTTLS on 587). */
|
|
30
|
+
smtpSecure?: boolean;
|
|
19
31
|
}
|
|
20
32
|
export interface SendEmailOpts {
|
|
21
33
|
to: string;
|
|
@@ -65,4 +77,11 @@ export interface MailgunResponse {
|
|
|
65
77
|
message: string;
|
|
66
78
|
messageId?: string;
|
|
67
79
|
}
|
|
80
|
+
export interface SmtpResponse {
|
|
81
|
+
success: boolean;
|
|
82
|
+
message: string;
|
|
83
|
+
messageId?: string;
|
|
84
|
+
}
|
|
85
|
+
/** Unified response from any email transport */
|
|
86
|
+
export type EmailSendResponse = MailgunResponse | SmtpResponse;
|
|
68
87
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/email/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,eAAe,EAAE,IAAI,GAAG,IAAI,CAAC;IAC7B,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/email/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soulbatical/tetra-core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.31",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "restricted"
|
|
6
6
|
},
|
|
@@ -36,7 +36,8 @@
|
|
|
36
36
|
],
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "tsc",
|
|
39
|
-
"prepublishOnly": "npm run build && npm run typecheck",
|
|
39
|
+
"prepublishOnly": "npm run build && npm run typecheck && npx tetra-check-peers",
|
|
40
|
+
"check:peers": "npx tetra-check-peers",
|
|
40
41
|
"typecheck": "tsc --noEmit",
|
|
41
42
|
"enforce:api": "./scripts/enforce-api-standards.sh"
|
|
42
43
|
},
|
|
@@ -45,17 +46,18 @@
|
|
|
45
46
|
"handlebars": "^4.7.8",
|
|
46
47
|
"helmet": "^8.1.0",
|
|
47
48
|
"node-cron": "^4.1.1",
|
|
49
|
+
"nodemailer": "^8.0.2",
|
|
48
50
|
"zod": "^3.22.4"
|
|
49
51
|
},
|
|
50
52
|
"peerDependencies": {
|
|
51
53
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
52
|
-
"@
|
|
54
|
+
"@mollie/api-client": "^4.0.0",
|
|
55
|
+
"@supabase/supabase-js": "^2.93.3",
|
|
53
56
|
"@tanstack/react-table": "^8.0.0",
|
|
54
57
|
"express": "^5.0.0",
|
|
55
58
|
"pino": "^9.0.0",
|
|
56
59
|
"react": "^18.0.0 || ^19.0.0",
|
|
57
|
-
"stripe": "^17.0.0"
|
|
58
|
-
"@mollie/api-client": "^4.0.0"
|
|
60
|
+
"stripe": "^17.0.0 || ^20.0.0"
|
|
59
61
|
},
|
|
60
62
|
"peerDependenciesMeta": {
|
|
61
63
|
"pino": {
|
|
@@ -85,6 +87,7 @@
|
|
|
85
87
|
"@types/express": "^5.0.0",
|
|
86
88
|
"@types/node": "^20.11.0",
|
|
87
89
|
"@types/node-cron": "^3.0.11",
|
|
90
|
+
"@types/nodemailer": "^7.0.11",
|
|
88
91
|
"@types/react": "^19.2.14",
|
|
89
92
|
"express": "^5.2.1",
|
|
90
93
|
"pino": "^9.12.0",
|