@strapi/provider-email-nodemailer 5.52.3 → 5.54.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.
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.d.ts
CHANGED
|
@@ -65,10 +65,6 @@ interface SendOptions {
|
|
|
65
65
|
dkim?: SendMailOptions['dkim'];
|
|
66
66
|
/** Convert data: URIs in HTML to embedded CID attachments automatically */
|
|
67
67
|
attachDataUrls?: SendMailOptions['attachDataUrls'];
|
|
68
|
-
/** Fail with an error when content tries to load from a URL */
|
|
69
|
-
disableUrlAccess?: SendMailOptions['disableUrlAccess'];
|
|
70
|
-
/** Fail with an error when content tries to load from a file path */
|
|
71
|
-
disableFileAccess?: SendMailOptions['disableFileAccess'];
|
|
72
68
|
/**
|
|
73
69
|
* Pre-built MIME message. When set, skips message generation entirely.
|
|
74
70
|
* Address headers and envelope must still be set separately.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,EAAe,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEhF,UAAU,QAAQ;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,WAAW;IAEnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAGhB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,SAAS,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;IACzC,+CAA+C;IAC/C,GAAG,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;IAC7C;;;OAGG;IACH,YAAY,CAAC,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;IAG/C,iFAAiF;IACjF,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IACrC,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IACvC,kEAAkE;IAClE,SAAS,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;IACzC,6DAA6D;IAC7D,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B,mFAAmF;IACnF,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IAGrC,4EAA4E;IAC5E,SAAS,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;IACzC,yEAAyE;IACzE,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC;IAG3C,sEAAsE;IACtE,YAAY,CAAC,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;IAC/C,sDAAsD;IACtD,QAAQ,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IACvC,4CAA4C;IAC5C,kBAAkB,CAAC,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAG3D;;;OAGG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;IACzC;;;;OAIG;IACH,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IACvC,wEAAwE;IACxE,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B,2EAA2E;IAC3E,cAAc,CAAC,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAGnD
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -123,13 +123,6 @@ var index = {
|
|
|
123
123
|
if (options.attachDataUrls) {
|
|
124
124
|
message.attachDataUrls = options.attachDataUrls;
|
|
125
125
|
}
|
|
126
|
-
// Security
|
|
127
|
-
if (options.disableUrlAccess) {
|
|
128
|
-
message.disableUrlAccess = options.disableUrlAccess;
|
|
129
|
-
}
|
|
130
|
-
if (options.disableFileAccess) {
|
|
131
|
-
message.disableFileAccess = options.disableFileAccess;
|
|
132
|
-
}
|
|
133
126
|
// Raw MIME
|
|
134
127
|
if (options.raw) {
|
|
135
128
|
message.raw = options.raw;
|
|
@@ -148,6 +141,12 @@ var index = {
|
|
|
148
141
|
} : {}
|
|
149
142
|
};
|
|
150
143
|
}
|
|
144
|
+
// Security: always block nodemailer from reading local files or fetching
|
|
145
|
+
// URLs referenced by attachments[].path / attachments[].href. These are
|
|
146
|
+
// forced on after the message is built so caller-supplied values cannot
|
|
147
|
+
// re-enable file/URL access (prevents LFI/SSRF via attachment sources).
|
|
148
|
+
message.disableFileAccess = true;
|
|
149
|
+
message.disableUrlAccess = true;
|
|
151
150
|
return transporter.sendMail(message);
|
|
152
151
|
},
|
|
153
152
|
async verify () {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import nodemailer from 'nodemailer';\nimport type { Transporter, SendMailOptions, SentMessageInfo } from 'nodemailer';\n\ninterface Settings {\n defaultFrom: string;\n defaultReplyTo: string;\n}\n\ninterface SendOptions {\n // --- Core addressing ---\n from?: string;\n to: string;\n cc?: string;\n bcc?: string;\n replyTo?: string;\n /** Address that appears in the Sender: field (for \"on behalf of\" emails) */\n sender?: SendMailOptions['sender'];\n subject: string;\n\n // --- Content ---\n text?: string;\n html?: string;\n /** Apple Watch specific HTML version of the message */\n watchHtml?: SendMailOptions['watchHtml'];\n /** AMP4Email content for interactive emails */\n amp?: SendMailOptions['amp'];\n attachments?: SendMailOptions['attachments'];\n /**\n * Alternative content representations (e.g. Markdown alongside HTML).\n * Uses the same format as attachments. Email clients pick the best match.\n */\n alternatives?: SendMailOptions['alternatives'];\n\n // --- Headers & metadata ---\n /** Custom SMTP headers (e.g. X-Priority, X-Mailer, business-specific headers) */\n headers?: SendMailOptions['headers'];\n /** Email priority: 'high', 'normal', 'low' */\n priority?: SendMailOptions['priority'];\n /** Custom Message-ID value (random value generated if not set) */\n messageId?: SendMailOptions['messageId'];\n /** Custom Date value (current UTC string used if not set) */\n date?: SendMailOptions['date'];\n /** Control or disable the X-Mailer header (false to remove, string to override) */\n xMailer?: SendMailOptions['xMailer'];\n\n // --- Threading ---\n /** Message-ID of the email being replied to (for conversation threading) */\n inReplyTo?: SendMailOptions['inReplyTo'];\n /** Message-ID list this email references (for conversation threading) */\n references?: SendMailOptions['references'];\n\n // --- Encoding ---\n /** Force content-transfer-encoding: 'quoted-printable' or 'base64' */\n textEncoding?: SendMailOptions['textEncoding'];\n /** Encoding for the message (e.g. 'base64', 'hex') */\n encoding?: SendMailOptions['encoding'];\n /** Method to normalize header key casing */\n normalizeHeaderKey?: SendMailOptions['normalizeHeaderKey'];\n\n // --- Advanced features ---\n /**\n * Calendar event invitation (iCalendar format).\n * @example { method: 'REQUEST', content: icsString }\n */\n icalEvent?: SendMailOptions['icalEvent'];\n /**\n * RFC 2369 List-* headers for mailing lists and newsletters.\n * Email clients like Gmail/Outlook show an \"Unsubscribe\" button when set.\n * @example { unsubscribe: { url: 'https://example.com/unsubscribe', comment: 'Unsubscribe' } }\n */\n list?: SendMailOptions['list'];\n /**\n * Custom SMTP envelope for controlling MAIL FROM and RCPT TO independently.\n * @example { from: 'bounce+123@example.com', to: 'recipient@example.com' }\n */\n envelope?: SendMailOptions['envelope'];\n /** Per-message DKIM signing options (overrides transport-level DKIM) */\n dkim?: SendMailOptions['dkim'];\n /** Convert data: URIs in HTML to embedded CID attachments automatically */\n attachDataUrls?: SendMailOptions['attachDataUrls'];\n\n // --- Security ---\n /** Fail with an error when content tries to load from a URL */\n disableUrlAccess?: SendMailOptions['disableUrlAccess'];\n /** Fail with an error when content tries to load from a file path */\n disableFileAccess?: SendMailOptions['disableFileAccess'];\n\n // --- Raw MIME ---\n /**\n * Pre-built MIME message. When set, skips message generation entirely.\n * Address headers and envelope must still be set separately.\n */\n raw?: SendMailOptions['raw'];\n\n // --- DSN & Auth (not in @types/nodemailer but supported by nodemailer) ---\n /**\n * Delivery Status Notification (DSN) configuration.\n * @example { id: 'msg-123', return: 'headers', notify: 'success', recipient: 'sender@example.com' }\n */\n dsn?: {\n id?: string;\n return?: 'headers' | 'full';\n notify?: string | string[];\n recipient?: string;\n };\n /**\n * Per-message OAuth2 authentication for sending on behalf of different users.\n * Requires the transporter to be configured with type: 'OAuth2'.\n * @example { user: 'user@gmail.com', refreshToken: '1/xxx', accessToken: 'ya29.xxx' }\n */\n auth?: {\n user?: string;\n refreshToken?: string;\n accessToken?: string;\n expires?: number;\n };\n}\n\ntype ProviderOptions = Parameters<typeof nodemailer.createTransport>[0];\n\ninterface ProviderCapabilities {\n transport?: {\n host?: string;\n port?: number;\n secure?: boolean;\n pool?: boolean;\n maxConnections?: number;\n };\n auth?: {\n type?: string;\n user?: string;\n };\n features?: string[];\n}\n\nfunction getCapabilitiesFromOptions(opts: ProviderOptions): ProviderCapabilities {\n const capabilities: ProviderCapabilities = {};\n const features: string[] = [];\n\n if (opts && typeof opts === 'object') {\n const options = opts as Record<string, unknown>;\n\n if (options.host || options.port) {\n capabilities.transport = {\n host: typeof options.host === 'string' ? options.host : undefined,\n port: typeof options.port === 'number' ? options.port : undefined,\n secure: typeof options.secure === 'boolean' ? options.secure : undefined,\n pool: typeof options.pool === 'boolean' ? options.pool : undefined,\n maxConnections:\n typeof options.maxConnections === 'number' ? options.maxConnections : undefined,\n };\n }\n\n if (options.auth && typeof options.auth === 'object') {\n const auth = options.auth as Record<string, unknown>;\n const authType = typeof auth.type === 'string' ? auth.type : undefined;\n capabilities.auth = {\n type: authType || (auth.user ? 'login' : undefined),\n user: typeof auth.user === 'string' ? auth.user : undefined,\n };\n if (authType === 'OAuth2') {\n features.push('oauth2');\n }\n }\n\n if (options.dkim) features.push('dkim');\n if (options.pool) features.push('pool');\n if (options.proxy) features.push('proxy');\n if (options.rateLimit) features.push('rateLimiting');\n if (options.requireTLS) features.push('requireTLS');\n }\n\n if (features.length > 0) {\n capabilities.features = features;\n }\n\n return capabilities;\n}\n\nexport default {\n init(providerOptions: ProviderOptions, settings: Settings) {\n const transporter: Transporter = nodemailer.createTransport(providerOptions);\n\n return {\n send(options: SendOptions): Promise<SentMessageInfo> {\n const message: SendMailOptions = {\n from: options.from ?? settings.defaultFrom,\n to: options.to,\n cc: options.cc,\n bcc: options.bcc,\n replyTo: options.replyTo ?? settings.defaultReplyTo,\n subject: options.subject,\n text: options.text ?? options.html,\n html: options.html ?? options.text,\n };\n\n // Addressing\n if (options.sender) {\n message.sender = options.sender;\n }\n\n // Content\n if (options.attachments) {\n message.attachments = options.attachments;\n }\n if (options.alternatives) {\n message.alternatives = options.alternatives;\n }\n if (options.watchHtml) {\n message.watchHtml = options.watchHtml;\n }\n if (options.amp) {\n message.amp = options.amp;\n }\n\n // Headers & metadata\n if (options.headers) {\n message.headers = options.headers;\n }\n if (options.priority) {\n message.priority = options.priority;\n }\n if (options.messageId) {\n message.messageId = options.messageId;\n }\n if (options.date) {\n message.date = options.date;\n }\n if (options.xMailer !== undefined) {\n message.xMailer = options.xMailer;\n }\n\n // Threading\n if (options.inReplyTo) {\n message.inReplyTo = options.inReplyTo;\n }\n if (options.references) {\n message.references = options.references;\n }\n\n // Encoding\n if (options.textEncoding) {\n message.textEncoding = options.textEncoding;\n }\n if (options.encoding) {\n message.encoding = options.encoding;\n }\n if (options.normalizeHeaderKey) {\n message.normalizeHeaderKey = options.normalizeHeaderKey;\n }\n\n // Advanced features\n if (options.icalEvent) {\n message.icalEvent = options.icalEvent;\n }\n if (options.list) {\n message.list = options.list;\n }\n if (options.envelope) {\n message.envelope = options.envelope;\n }\n if (options.dkim) {\n message.dkim = options.dkim;\n }\n if (options.attachDataUrls) {\n message.attachDataUrls = options.attachDataUrls;\n }\n\n // Security\n if (options.disableUrlAccess) {\n message.disableUrlAccess = options.disableUrlAccess;\n }\n if (options.disableFileAccess) {\n message.disableFileAccess = options.disableFileAccess;\n }\n\n // Raw MIME\n if (options.raw) {\n message.raw = options.raw;\n }\n\n // DSN and per-message auth (supported by nodemailer, not fully typed)\n if (options.dsn) {\n (message as Record<string, unknown>).dsn = options.dsn;\n }\n if (options.auth) {\n (message as Record<string, unknown>).auth = {\n user: options.auth.user,\n refreshToken: options.auth.refreshToken,\n accessToken: options.auth.accessToken,\n ...(options.auth.expires != null ? { expires: options.auth.expires } : {}),\n };\n }\n\n return transporter.sendMail(message);\n },\n\n async verify(): Promise<true> {\n return transporter.verify();\n },\n\n isIdle(): boolean {\n return typeof transporter.isIdle === 'function' ? transporter.isIdle() : true;\n },\n\n close(): void {\n transporter.close();\n },\n\n getCapabilities(): ProviderCapabilities {\n return getCapabilitiesFromOptions(providerOptions);\n },\n };\n },\n};\n"],"names":["getCapabilitiesFromOptions","opts","capabilities","features","options","host","port","transport","undefined","secure","pool","maxConnections","auth","authType","type","user","push","dkim","proxy","rateLimit","requireTLS","length","init","providerOptions","settings","transporter","nodemailer","createTransport","send","message","from","defaultFrom","to","cc","bcc","replyTo","defaultReplyTo","subject","text","html","sender","attachments","alternatives","watchHtml","amp","headers","priority","messageId","date","xMailer","inReplyTo","references","textEncoding","encoding","normalizeHeaderKey","icalEvent","list","envelope","attachDataUrls","disableUrlAccess","disableFileAccess","raw","dsn","refreshToken","accessToken","expires","sendMail","verify","isIdle","close","getCapabilities"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import nodemailer from 'nodemailer';\nimport type { Transporter, SendMailOptions, SentMessageInfo } from 'nodemailer';\n\ninterface Settings {\n defaultFrom: string;\n defaultReplyTo: string;\n}\n\ninterface SendOptions {\n // --- Core addressing ---\n from?: string;\n to: string;\n cc?: string;\n bcc?: string;\n replyTo?: string;\n /** Address that appears in the Sender: field (for \"on behalf of\" emails) */\n sender?: SendMailOptions['sender'];\n subject: string;\n\n // --- Content ---\n text?: string;\n html?: string;\n /** Apple Watch specific HTML version of the message */\n watchHtml?: SendMailOptions['watchHtml'];\n /** AMP4Email content for interactive emails */\n amp?: SendMailOptions['amp'];\n attachments?: SendMailOptions['attachments'];\n /**\n * Alternative content representations (e.g. Markdown alongside HTML).\n * Uses the same format as attachments. Email clients pick the best match.\n */\n alternatives?: SendMailOptions['alternatives'];\n\n // --- Headers & metadata ---\n /** Custom SMTP headers (e.g. X-Priority, X-Mailer, business-specific headers) */\n headers?: SendMailOptions['headers'];\n /** Email priority: 'high', 'normal', 'low' */\n priority?: SendMailOptions['priority'];\n /** Custom Message-ID value (random value generated if not set) */\n messageId?: SendMailOptions['messageId'];\n /** Custom Date value (current UTC string used if not set) */\n date?: SendMailOptions['date'];\n /** Control or disable the X-Mailer header (false to remove, string to override) */\n xMailer?: SendMailOptions['xMailer'];\n\n // --- Threading ---\n /** Message-ID of the email being replied to (for conversation threading) */\n inReplyTo?: SendMailOptions['inReplyTo'];\n /** Message-ID list this email references (for conversation threading) */\n references?: SendMailOptions['references'];\n\n // --- Encoding ---\n /** Force content-transfer-encoding: 'quoted-printable' or 'base64' */\n textEncoding?: SendMailOptions['textEncoding'];\n /** Encoding for the message (e.g. 'base64', 'hex') */\n encoding?: SendMailOptions['encoding'];\n /** Method to normalize header key casing */\n normalizeHeaderKey?: SendMailOptions['normalizeHeaderKey'];\n\n // --- Advanced features ---\n /**\n * Calendar event invitation (iCalendar format).\n * @example { method: 'REQUEST', content: icsString }\n */\n icalEvent?: SendMailOptions['icalEvent'];\n /**\n * RFC 2369 List-* headers for mailing lists and newsletters.\n * Email clients like Gmail/Outlook show an \"Unsubscribe\" button when set.\n * @example { unsubscribe: { url: 'https://example.com/unsubscribe', comment: 'Unsubscribe' } }\n */\n list?: SendMailOptions['list'];\n /**\n * Custom SMTP envelope for controlling MAIL FROM and RCPT TO independently.\n * @example { from: 'bounce+123@example.com', to: 'recipient@example.com' }\n */\n envelope?: SendMailOptions['envelope'];\n /** Per-message DKIM signing options (overrides transport-level DKIM) */\n dkim?: SendMailOptions['dkim'];\n /** Convert data: URIs in HTML to embedded CID attachments automatically */\n attachDataUrls?: SendMailOptions['attachDataUrls'];\n\n // --- Raw MIME ---\n /**\n * Pre-built MIME message. When set, skips message generation entirely.\n * Address headers and envelope must still be set separately.\n */\n raw?: SendMailOptions['raw'];\n\n // --- DSN & Auth (not in @types/nodemailer but supported by nodemailer) ---\n /**\n * Delivery Status Notification (DSN) configuration.\n * @example { id: 'msg-123', return: 'headers', notify: 'success', recipient: 'sender@example.com' }\n */\n dsn?: {\n id?: string;\n return?: 'headers' | 'full';\n notify?: string | string[];\n recipient?: string;\n };\n /**\n * Per-message OAuth2 authentication for sending on behalf of different users.\n * Requires the transporter to be configured with type: 'OAuth2'.\n * @example { user: 'user@gmail.com', refreshToken: '1/xxx', accessToken: 'ya29.xxx' }\n */\n auth?: {\n user?: string;\n refreshToken?: string;\n accessToken?: string;\n expires?: number;\n };\n}\n\ntype ProviderOptions = Parameters<typeof nodemailer.createTransport>[0];\n\ninterface ProviderCapabilities {\n transport?: {\n host?: string;\n port?: number;\n secure?: boolean;\n pool?: boolean;\n maxConnections?: number;\n };\n auth?: {\n type?: string;\n user?: string;\n };\n features?: string[];\n}\n\nfunction getCapabilitiesFromOptions(opts: ProviderOptions): ProviderCapabilities {\n const capabilities: ProviderCapabilities = {};\n const features: string[] = [];\n\n if (opts && typeof opts === 'object') {\n const options = opts as Record<string, unknown>;\n\n if (options.host || options.port) {\n capabilities.transport = {\n host: typeof options.host === 'string' ? options.host : undefined,\n port: typeof options.port === 'number' ? options.port : undefined,\n secure: typeof options.secure === 'boolean' ? options.secure : undefined,\n pool: typeof options.pool === 'boolean' ? options.pool : undefined,\n maxConnections:\n typeof options.maxConnections === 'number' ? options.maxConnections : undefined,\n };\n }\n\n if (options.auth && typeof options.auth === 'object') {\n const auth = options.auth as Record<string, unknown>;\n const authType = typeof auth.type === 'string' ? auth.type : undefined;\n capabilities.auth = {\n type: authType || (auth.user ? 'login' : undefined),\n user: typeof auth.user === 'string' ? auth.user : undefined,\n };\n if (authType === 'OAuth2') {\n features.push('oauth2');\n }\n }\n\n if (options.dkim) features.push('dkim');\n if (options.pool) features.push('pool');\n if (options.proxy) features.push('proxy');\n if (options.rateLimit) features.push('rateLimiting');\n if (options.requireTLS) features.push('requireTLS');\n }\n\n if (features.length > 0) {\n capabilities.features = features;\n }\n\n return capabilities;\n}\n\nexport default {\n init(providerOptions: ProviderOptions, settings: Settings) {\n const transporter: Transporter = nodemailer.createTransport(providerOptions);\n\n return {\n send(options: SendOptions): Promise<SentMessageInfo> {\n const message: SendMailOptions = {\n from: options.from ?? settings.defaultFrom,\n to: options.to,\n cc: options.cc,\n bcc: options.bcc,\n replyTo: options.replyTo ?? settings.defaultReplyTo,\n subject: options.subject,\n text: options.text ?? options.html,\n html: options.html ?? options.text,\n };\n\n // Addressing\n if (options.sender) {\n message.sender = options.sender;\n }\n\n // Content\n if (options.attachments) {\n message.attachments = options.attachments;\n }\n if (options.alternatives) {\n message.alternatives = options.alternatives;\n }\n if (options.watchHtml) {\n message.watchHtml = options.watchHtml;\n }\n if (options.amp) {\n message.amp = options.amp;\n }\n\n // Headers & metadata\n if (options.headers) {\n message.headers = options.headers;\n }\n if (options.priority) {\n message.priority = options.priority;\n }\n if (options.messageId) {\n message.messageId = options.messageId;\n }\n if (options.date) {\n message.date = options.date;\n }\n if (options.xMailer !== undefined) {\n message.xMailer = options.xMailer;\n }\n\n // Threading\n if (options.inReplyTo) {\n message.inReplyTo = options.inReplyTo;\n }\n if (options.references) {\n message.references = options.references;\n }\n\n // Encoding\n if (options.textEncoding) {\n message.textEncoding = options.textEncoding;\n }\n if (options.encoding) {\n message.encoding = options.encoding;\n }\n if (options.normalizeHeaderKey) {\n message.normalizeHeaderKey = options.normalizeHeaderKey;\n }\n\n // Advanced features\n if (options.icalEvent) {\n message.icalEvent = options.icalEvent;\n }\n if (options.list) {\n message.list = options.list;\n }\n if (options.envelope) {\n message.envelope = options.envelope;\n }\n if (options.dkim) {\n message.dkim = options.dkim;\n }\n if (options.attachDataUrls) {\n message.attachDataUrls = options.attachDataUrls;\n }\n\n // Raw MIME\n if (options.raw) {\n message.raw = options.raw;\n }\n\n // DSN and per-message auth (supported by nodemailer, not fully typed)\n if (options.dsn) {\n (message as Record<string, unknown>).dsn = options.dsn;\n }\n if (options.auth) {\n (message as Record<string, unknown>).auth = {\n user: options.auth.user,\n refreshToken: options.auth.refreshToken,\n accessToken: options.auth.accessToken,\n ...(options.auth.expires != null ? { expires: options.auth.expires } : {}),\n };\n }\n\n // Security: always block nodemailer from reading local files or fetching\n // URLs referenced by attachments[].path / attachments[].href. These are\n // forced on after the message is built so caller-supplied values cannot\n // re-enable file/URL access (prevents LFI/SSRF via attachment sources).\n message.disableFileAccess = true;\n message.disableUrlAccess = true;\n\n return transporter.sendMail(message);\n },\n\n async verify(): Promise<true> {\n return transporter.verify();\n },\n\n isIdle(): boolean {\n return typeof transporter.isIdle === 'function' ? transporter.isIdle() : true;\n },\n\n close(): void {\n transporter.close();\n },\n\n getCapabilities(): ProviderCapabilities {\n return getCapabilitiesFromOptions(providerOptions);\n },\n };\n },\n};\n"],"names":["getCapabilitiesFromOptions","opts","capabilities","features","options","host","port","transport","undefined","secure","pool","maxConnections","auth","authType","type","user","push","dkim","proxy","rateLimit","requireTLS","length","init","providerOptions","settings","transporter","nodemailer","createTransport","send","message","from","defaultFrom","to","cc","bcc","replyTo","defaultReplyTo","subject","text","html","sender","attachments","alternatives","watchHtml","amp","headers","priority","messageId","date","xMailer","inReplyTo","references","textEncoding","encoding","normalizeHeaderKey","icalEvent","list","envelope","attachDataUrls","raw","dsn","refreshToken","accessToken","expires","disableFileAccess","disableUrlAccess","sendMail","verify","isIdle","close","getCapabilities"],"mappings":";;;;;;;;AAiIA,SAASA,2BAA2BC,IAAqB,EAAA;AACvD,IAAA,MAAMC,eAAqC,EAAC;AAC5C,IAAA,MAAMC,WAAqB,EAAE;IAE7B,IAAIF,IAAAA,IAAQ,OAAOA,IAAAA,KAAS,QAAA,EAAU;AACpC,QAAA,MAAMG,OAAAA,GAAUH,IAAAA;AAEhB,QAAA,IAAIG,OAAAA,CAAQC,IAAI,IAAID,OAAAA,CAAQE,IAAI,EAAE;AAChCJ,YAAAA,YAAAA,CAAaK,SAAS,GAAG;AACvBF,gBAAAA,IAAAA,EAAM,OAAOD,OAAAA,CAAQC,IAAI,KAAK,QAAA,GAAWD,OAAAA,CAAQC,IAAI,GAAGG,SAAAA;AACxDF,gBAAAA,IAAAA,EAAM,OAAOF,OAAAA,CAAQE,IAAI,KAAK,QAAA,GAAWF,OAAAA,CAAQE,IAAI,GAAGE,SAAAA;AACxDC,gBAAAA,MAAAA,EAAQ,OAAOL,OAAAA,CAAQK,MAAM,KAAK,SAAA,GAAYL,OAAAA,CAAQK,MAAM,GAAGD,SAAAA;AAC/DE,gBAAAA,IAAAA,EAAM,OAAON,OAAAA,CAAQM,IAAI,KAAK,SAAA,GAAYN,OAAAA,CAAQM,IAAI,GAAGF,SAAAA;AACzDG,gBAAAA,cAAAA,EACE,OAAOP,OAAAA,CAAQO,cAAc,KAAK,QAAA,GAAWP,OAAAA,CAAQO,cAAc,GAAGH;AAC1E,aAAA;AACF,QAAA;AAEA,QAAA,IAAIJ,QAAQQ,IAAI,IAAI,OAAOR,OAAAA,CAAQQ,IAAI,KAAK,QAAA,EAAU;YACpD,MAAMA,IAAAA,GAAOR,QAAQQ,IAAI;YACzB,MAAMC,QAAAA,GAAW,OAAOD,IAAAA,CAAKE,IAAI,KAAK,QAAA,GAAWF,IAAAA,CAAKE,IAAI,GAAGN,SAAAA;AAC7DN,YAAAA,YAAAA,CAAaU,IAAI,GAAG;AAClBE,gBAAAA,IAAAA,EAAMD,aAAaD,IAAAA,CAAKG,IAAI,GAAG,UAAUP,SAAQ,CAAA;AACjDO,gBAAAA,IAAAA,EAAM,OAAOH,IAAAA,CAAKG,IAAI,KAAK,QAAA,GAAWH,IAAAA,CAAKG,IAAI,GAAGP;AACpD,aAAA;AACA,YAAA,IAAIK,aAAa,QAAA,EAAU;AACzBV,gBAAAA,QAAAA,CAASa,IAAI,CAAC,QAAA,CAAA;AAChB,YAAA;AACF,QAAA;AAEA,QAAA,IAAIZ,OAAAA,CAAQa,IAAI,EAAEd,QAAAA,CAASa,IAAI,CAAC,MAAA,CAAA;AAChC,QAAA,IAAIZ,OAAAA,CAAQM,IAAI,EAAEP,QAAAA,CAASa,IAAI,CAAC,MAAA,CAAA;AAChC,QAAA,IAAIZ,OAAAA,CAAQc,KAAK,EAAEf,QAAAA,CAASa,IAAI,CAAC,OAAA,CAAA;AACjC,QAAA,IAAIZ,OAAAA,CAAQe,SAAS,EAAEhB,QAAAA,CAASa,IAAI,CAAC,cAAA,CAAA;AACrC,QAAA,IAAIZ,OAAAA,CAAQgB,UAAU,EAAEjB,QAAAA,CAASa,IAAI,CAAC,YAAA,CAAA;AACxC,IAAA;IAEA,IAAIb,QAAAA,CAASkB,MAAM,GAAG,CAAA,EAAG;AACvBnB,QAAAA,YAAAA,CAAaC,QAAQ,GAAGA,QAAAA;AAC1B,IAAA;IAEA,OAAOD,YAAAA;AACT;AAEA,YAAe;IACboB,IAAAA,CAAAA,CAAKC,eAAgC,EAAEC,QAAkB,EAAA;QACvD,MAAMC,WAAAA,GAA2BC,2BAAAA,CAAWC,eAAe,CAACJ,eAAAA,CAAAA;QAE5D,OAAO;AACLK,YAAAA,IAAAA,CAAAA,CAAKxB,OAAoB,EAAA;AACvB,gBAAA,MAAMyB,OAAAA,GAA2B;AAC/BC,oBAAAA,IAAAA,EAAM1B,OAAAA,CAAQ0B,IAAI,IAAIN,QAAAA,CAASO,WAAW;AAC1CC,oBAAAA,EAAAA,EAAI5B,QAAQ4B,EAAE;AACdC,oBAAAA,EAAAA,EAAI7B,QAAQ6B,EAAE;AACdC,oBAAAA,GAAAA,EAAK9B,QAAQ8B,GAAG;AAChBC,oBAAAA,OAAAA,EAAS/B,OAAAA,CAAQ+B,OAAO,IAAIX,QAAAA,CAASY,cAAc;AACnDC,oBAAAA,OAAAA,EAASjC,QAAQiC,OAAO;AACxBC,oBAAAA,IAAAA,EAAMlC,OAAAA,CAAQkC,IAAI,IAAIlC,OAAAA,CAAQmC,IAAI;AAClCA,oBAAAA,IAAAA,EAAMnC,OAAAA,CAAQmC,IAAI,IAAInC,OAAAA,CAAQkC;AAChC,iBAAA;;gBAGA,IAAIlC,OAAAA,CAAQoC,MAAM,EAAE;oBAClBX,OAAAA,CAAQW,MAAM,GAAGpC,OAAAA,CAAQoC,MAAM;AACjC,gBAAA;;gBAGA,IAAIpC,OAAAA,CAAQqC,WAAW,EAAE;oBACvBZ,OAAAA,CAAQY,WAAW,GAAGrC,OAAAA,CAAQqC,WAAW;AAC3C,gBAAA;gBACA,IAAIrC,OAAAA,CAAQsC,YAAY,EAAE;oBACxBb,OAAAA,CAAQa,YAAY,GAAGtC,OAAAA,CAAQsC,YAAY;AAC7C,gBAAA;gBACA,IAAItC,OAAAA,CAAQuC,SAAS,EAAE;oBACrBd,OAAAA,CAAQc,SAAS,GAAGvC,OAAAA,CAAQuC,SAAS;AACvC,gBAAA;gBACA,IAAIvC,OAAAA,CAAQwC,GAAG,EAAE;oBACff,OAAAA,CAAQe,GAAG,GAAGxC,OAAAA,CAAQwC,GAAG;AAC3B,gBAAA;;gBAGA,IAAIxC,OAAAA,CAAQyC,OAAO,EAAE;oBACnBhB,OAAAA,CAAQgB,OAAO,GAAGzC,OAAAA,CAAQyC,OAAO;AACnC,gBAAA;gBACA,IAAIzC,OAAAA,CAAQ0C,QAAQ,EAAE;oBACpBjB,OAAAA,CAAQiB,QAAQ,GAAG1C,OAAAA,CAAQ0C,QAAQ;AACrC,gBAAA;gBACA,IAAI1C,OAAAA,CAAQ2C,SAAS,EAAE;oBACrBlB,OAAAA,CAAQkB,SAAS,GAAG3C,OAAAA,CAAQ2C,SAAS;AACvC,gBAAA;gBACA,IAAI3C,OAAAA,CAAQ4C,IAAI,EAAE;oBAChBnB,OAAAA,CAAQmB,IAAI,GAAG5C,OAAAA,CAAQ4C,IAAI;AAC7B,gBAAA;gBACA,IAAI5C,OAAAA,CAAQ6C,OAAO,KAAKzC,SAAAA,EAAW;oBACjCqB,OAAAA,CAAQoB,OAAO,GAAG7C,OAAAA,CAAQ6C,OAAO;AACnC,gBAAA;;gBAGA,IAAI7C,OAAAA,CAAQ8C,SAAS,EAAE;oBACrBrB,OAAAA,CAAQqB,SAAS,GAAG9C,OAAAA,CAAQ8C,SAAS;AACvC,gBAAA;gBACA,IAAI9C,OAAAA,CAAQ+C,UAAU,EAAE;oBACtBtB,OAAAA,CAAQsB,UAAU,GAAG/C,OAAAA,CAAQ+C,UAAU;AACzC,gBAAA;;gBAGA,IAAI/C,OAAAA,CAAQgD,YAAY,EAAE;oBACxBvB,OAAAA,CAAQuB,YAAY,GAAGhD,OAAAA,CAAQgD,YAAY;AAC7C,gBAAA;gBACA,IAAIhD,OAAAA,CAAQiD,QAAQ,EAAE;oBACpBxB,OAAAA,CAAQwB,QAAQ,GAAGjD,OAAAA,CAAQiD,QAAQ;AACrC,gBAAA;gBACA,IAAIjD,OAAAA,CAAQkD,kBAAkB,EAAE;oBAC9BzB,OAAAA,CAAQyB,kBAAkB,GAAGlD,OAAAA,CAAQkD,kBAAkB;AACzD,gBAAA;;gBAGA,IAAIlD,OAAAA,CAAQmD,SAAS,EAAE;oBACrB1B,OAAAA,CAAQ0B,SAAS,GAAGnD,OAAAA,CAAQmD,SAAS;AACvC,gBAAA;gBACA,IAAInD,OAAAA,CAAQoD,IAAI,EAAE;oBAChB3B,OAAAA,CAAQ2B,IAAI,GAAGpD,OAAAA,CAAQoD,IAAI;AAC7B,gBAAA;gBACA,IAAIpD,OAAAA,CAAQqD,QAAQ,EAAE;oBACpB5B,OAAAA,CAAQ4B,QAAQ,GAAGrD,OAAAA,CAAQqD,QAAQ;AACrC,gBAAA;gBACA,IAAIrD,OAAAA,CAAQa,IAAI,EAAE;oBAChBY,OAAAA,CAAQZ,IAAI,GAAGb,OAAAA,CAAQa,IAAI;AAC7B,gBAAA;gBACA,IAAIb,OAAAA,CAAQsD,cAAc,EAAE;oBAC1B7B,OAAAA,CAAQ6B,cAAc,GAAGtD,OAAAA,CAAQsD,cAAc;AACjD,gBAAA;;gBAGA,IAAItD,OAAAA,CAAQuD,GAAG,EAAE;oBACf9B,OAAAA,CAAQ8B,GAAG,GAAGvD,OAAAA,CAAQuD,GAAG;AAC3B,gBAAA;;gBAGA,IAAIvD,OAAAA,CAAQwD,GAAG,EAAE;oBACd/B,OAAAA,CAAoC+B,GAAG,GAAGxD,OAAAA,CAAQwD,GAAG;AACxD,gBAAA;gBACA,IAAIxD,OAAAA,CAAQQ,IAAI,EAAE;AACfiB,oBAAAA,OAAAA,CAAoCjB,IAAI,GAAG;wBAC1CG,IAAAA,EAAMX,OAAAA,CAAQQ,IAAI,CAACG,IAAI;wBACvB8C,YAAAA,EAAczD,OAAAA,CAAQQ,IAAI,CAACiD,YAAY;wBACvCC,WAAAA,EAAa1D,OAAAA,CAAQQ,IAAI,CAACkD,WAAW;AACrC,wBAAA,GAAI1D,OAAAA,CAAQQ,IAAI,CAACmD,OAAO,IAAI,IAAA,GAAO;4BAAEA,OAAAA,EAAS3D,OAAAA,CAAQQ,IAAI,CAACmD;AAAQ,yBAAA,GAAI;AACzE,qBAAA;AACF,gBAAA;;;;;AAMAlC,gBAAAA,OAAAA,CAAQmC,iBAAiB,GAAG,IAAA;AAC5BnC,gBAAAA,OAAAA,CAAQoC,gBAAgB,GAAG,IAAA;gBAE3B,OAAOxC,WAAAA,CAAYyC,QAAQ,CAACrC,OAAAA,CAAAA;AAC9B,YAAA,CAAA;YAEA,MAAMsC,MAAAA,CAAAA,GAAAA;AACJ,gBAAA,OAAO1C,YAAY0C,MAAM,EAAA;AAC3B,YAAA,CAAA;AAEAC,YAAAA,MAAAA,CAAAA,GAAAA;AACE,gBAAA,OAAO,OAAO3C,WAAAA,CAAY2C,MAAM,KAAK,UAAA,GAAa3C,WAAAA,CAAY2C,MAAM,EAAA,GAAK,IAAA;AAC3E,YAAA,CAAA;AAEAC,YAAAA,KAAAA,CAAAA,GAAAA;AACE5C,gBAAAA,WAAAA,CAAY4C,KAAK,EAAA;AACnB,YAAA,CAAA;AAEAC,YAAAA,eAAAA,CAAAA,GAAAA;AACE,gBAAA,OAAOtE,0BAAAA,CAA2BuB,eAAAA,CAAAA;AACpC,YAAA;AACF,SAAA;AACF,IAAA;AACF,CAAA;;;;"}
|
package/dist/index.mjs
CHANGED
|
@@ -117,13 +117,6 @@ var index = {
|
|
|
117
117
|
if (options.attachDataUrls) {
|
|
118
118
|
message.attachDataUrls = options.attachDataUrls;
|
|
119
119
|
}
|
|
120
|
-
// Security
|
|
121
|
-
if (options.disableUrlAccess) {
|
|
122
|
-
message.disableUrlAccess = options.disableUrlAccess;
|
|
123
|
-
}
|
|
124
|
-
if (options.disableFileAccess) {
|
|
125
|
-
message.disableFileAccess = options.disableFileAccess;
|
|
126
|
-
}
|
|
127
120
|
// Raw MIME
|
|
128
121
|
if (options.raw) {
|
|
129
122
|
message.raw = options.raw;
|
|
@@ -142,6 +135,12 @@ var index = {
|
|
|
142
135
|
} : {}
|
|
143
136
|
};
|
|
144
137
|
}
|
|
138
|
+
// Security: always block nodemailer from reading local files or fetching
|
|
139
|
+
// URLs referenced by attachments[].path / attachments[].href. These are
|
|
140
|
+
// forced on after the message is built so caller-supplied values cannot
|
|
141
|
+
// re-enable file/URL access (prevents LFI/SSRF via attachment sources).
|
|
142
|
+
message.disableFileAccess = true;
|
|
143
|
+
message.disableUrlAccess = true;
|
|
145
144
|
return transporter.sendMail(message);
|
|
146
145
|
},
|
|
147
146
|
async verify () {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import nodemailer from 'nodemailer';\nimport type { Transporter, SendMailOptions, SentMessageInfo } from 'nodemailer';\n\ninterface Settings {\n defaultFrom: string;\n defaultReplyTo: string;\n}\n\ninterface SendOptions {\n // --- Core addressing ---\n from?: string;\n to: string;\n cc?: string;\n bcc?: string;\n replyTo?: string;\n /** Address that appears in the Sender: field (for \"on behalf of\" emails) */\n sender?: SendMailOptions['sender'];\n subject: string;\n\n // --- Content ---\n text?: string;\n html?: string;\n /** Apple Watch specific HTML version of the message */\n watchHtml?: SendMailOptions['watchHtml'];\n /** AMP4Email content for interactive emails */\n amp?: SendMailOptions['amp'];\n attachments?: SendMailOptions['attachments'];\n /**\n * Alternative content representations (e.g. Markdown alongside HTML).\n * Uses the same format as attachments. Email clients pick the best match.\n */\n alternatives?: SendMailOptions['alternatives'];\n\n // --- Headers & metadata ---\n /** Custom SMTP headers (e.g. X-Priority, X-Mailer, business-specific headers) */\n headers?: SendMailOptions['headers'];\n /** Email priority: 'high', 'normal', 'low' */\n priority?: SendMailOptions['priority'];\n /** Custom Message-ID value (random value generated if not set) */\n messageId?: SendMailOptions['messageId'];\n /** Custom Date value (current UTC string used if not set) */\n date?: SendMailOptions['date'];\n /** Control or disable the X-Mailer header (false to remove, string to override) */\n xMailer?: SendMailOptions['xMailer'];\n\n // --- Threading ---\n /** Message-ID of the email being replied to (for conversation threading) */\n inReplyTo?: SendMailOptions['inReplyTo'];\n /** Message-ID list this email references (for conversation threading) */\n references?: SendMailOptions['references'];\n\n // --- Encoding ---\n /** Force content-transfer-encoding: 'quoted-printable' or 'base64' */\n textEncoding?: SendMailOptions['textEncoding'];\n /** Encoding for the message (e.g. 'base64', 'hex') */\n encoding?: SendMailOptions['encoding'];\n /** Method to normalize header key casing */\n normalizeHeaderKey?: SendMailOptions['normalizeHeaderKey'];\n\n // --- Advanced features ---\n /**\n * Calendar event invitation (iCalendar format).\n * @example { method: 'REQUEST', content: icsString }\n */\n icalEvent?: SendMailOptions['icalEvent'];\n /**\n * RFC 2369 List-* headers for mailing lists and newsletters.\n * Email clients like Gmail/Outlook show an \"Unsubscribe\" button when set.\n * @example { unsubscribe: { url: 'https://example.com/unsubscribe', comment: 'Unsubscribe' } }\n */\n list?: SendMailOptions['list'];\n /**\n * Custom SMTP envelope for controlling MAIL FROM and RCPT TO independently.\n * @example { from: 'bounce+123@example.com', to: 'recipient@example.com' }\n */\n envelope?: SendMailOptions['envelope'];\n /** Per-message DKIM signing options (overrides transport-level DKIM) */\n dkim?: SendMailOptions['dkim'];\n /** Convert data: URIs in HTML to embedded CID attachments automatically */\n attachDataUrls?: SendMailOptions['attachDataUrls'];\n\n // --- Security ---\n /** Fail with an error when content tries to load from a URL */\n disableUrlAccess?: SendMailOptions['disableUrlAccess'];\n /** Fail with an error when content tries to load from a file path */\n disableFileAccess?: SendMailOptions['disableFileAccess'];\n\n // --- Raw MIME ---\n /**\n * Pre-built MIME message. When set, skips message generation entirely.\n * Address headers and envelope must still be set separately.\n */\n raw?: SendMailOptions['raw'];\n\n // --- DSN & Auth (not in @types/nodemailer but supported by nodemailer) ---\n /**\n * Delivery Status Notification (DSN) configuration.\n * @example { id: 'msg-123', return: 'headers', notify: 'success', recipient: 'sender@example.com' }\n */\n dsn?: {\n id?: string;\n return?: 'headers' | 'full';\n notify?: string | string[];\n recipient?: string;\n };\n /**\n * Per-message OAuth2 authentication for sending on behalf of different users.\n * Requires the transporter to be configured with type: 'OAuth2'.\n * @example { user: 'user@gmail.com', refreshToken: '1/xxx', accessToken: 'ya29.xxx' }\n */\n auth?: {\n user?: string;\n refreshToken?: string;\n accessToken?: string;\n expires?: number;\n };\n}\n\ntype ProviderOptions = Parameters<typeof nodemailer.createTransport>[0];\n\ninterface ProviderCapabilities {\n transport?: {\n host?: string;\n port?: number;\n secure?: boolean;\n pool?: boolean;\n maxConnections?: number;\n };\n auth?: {\n type?: string;\n user?: string;\n };\n features?: string[];\n}\n\nfunction getCapabilitiesFromOptions(opts: ProviderOptions): ProviderCapabilities {\n const capabilities: ProviderCapabilities = {};\n const features: string[] = [];\n\n if (opts && typeof opts === 'object') {\n const options = opts as Record<string, unknown>;\n\n if (options.host || options.port) {\n capabilities.transport = {\n host: typeof options.host === 'string' ? options.host : undefined,\n port: typeof options.port === 'number' ? options.port : undefined,\n secure: typeof options.secure === 'boolean' ? options.secure : undefined,\n pool: typeof options.pool === 'boolean' ? options.pool : undefined,\n maxConnections:\n typeof options.maxConnections === 'number' ? options.maxConnections : undefined,\n };\n }\n\n if (options.auth && typeof options.auth === 'object') {\n const auth = options.auth as Record<string, unknown>;\n const authType = typeof auth.type === 'string' ? auth.type : undefined;\n capabilities.auth = {\n type: authType || (auth.user ? 'login' : undefined),\n user: typeof auth.user === 'string' ? auth.user : undefined,\n };\n if (authType === 'OAuth2') {\n features.push('oauth2');\n }\n }\n\n if (options.dkim) features.push('dkim');\n if (options.pool) features.push('pool');\n if (options.proxy) features.push('proxy');\n if (options.rateLimit) features.push('rateLimiting');\n if (options.requireTLS) features.push('requireTLS');\n }\n\n if (features.length > 0) {\n capabilities.features = features;\n }\n\n return capabilities;\n}\n\nexport default {\n init(providerOptions: ProviderOptions, settings: Settings) {\n const transporter: Transporter = nodemailer.createTransport(providerOptions);\n\n return {\n send(options: SendOptions): Promise<SentMessageInfo> {\n const message: SendMailOptions = {\n from: options.from ?? settings.defaultFrom,\n to: options.to,\n cc: options.cc,\n bcc: options.bcc,\n replyTo: options.replyTo ?? settings.defaultReplyTo,\n subject: options.subject,\n text: options.text ?? options.html,\n html: options.html ?? options.text,\n };\n\n // Addressing\n if (options.sender) {\n message.sender = options.sender;\n }\n\n // Content\n if (options.attachments) {\n message.attachments = options.attachments;\n }\n if (options.alternatives) {\n message.alternatives = options.alternatives;\n }\n if (options.watchHtml) {\n message.watchHtml = options.watchHtml;\n }\n if (options.amp) {\n message.amp = options.amp;\n }\n\n // Headers & metadata\n if (options.headers) {\n message.headers = options.headers;\n }\n if (options.priority) {\n message.priority = options.priority;\n }\n if (options.messageId) {\n message.messageId = options.messageId;\n }\n if (options.date) {\n message.date = options.date;\n }\n if (options.xMailer !== undefined) {\n message.xMailer = options.xMailer;\n }\n\n // Threading\n if (options.inReplyTo) {\n message.inReplyTo = options.inReplyTo;\n }\n if (options.references) {\n message.references = options.references;\n }\n\n // Encoding\n if (options.textEncoding) {\n message.textEncoding = options.textEncoding;\n }\n if (options.encoding) {\n message.encoding = options.encoding;\n }\n if (options.normalizeHeaderKey) {\n message.normalizeHeaderKey = options.normalizeHeaderKey;\n }\n\n // Advanced features\n if (options.icalEvent) {\n message.icalEvent = options.icalEvent;\n }\n if (options.list) {\n message.list = options.list;\n }\n if (options.envelope) {\n message.envelope = options.envelope;\n }\n if (options.dkim) {\n message.dkim = options.dkim;\n }\n if (options.attachDataUrls) {\n message.attachDataUrls = options.attachDataUrls;\n }\n\n // Security\n if (options.disableUrlAccess) {\n message.disableUrlAccess = options.disableUrlAccess;\n }\n if (options.disableFileAccess) {\n message.disableFileAccess = options.disableFileAccess;\n }\n\n // Raw MIME\n if (options.raw) {\n message.raw = options.raw;\n }\n\n // DSN and per-message auth (supported by nodemailer, not fully typed)\n if (options.dsn) {\n (message as Record<string, unknown>).dsn = options.dsn;\n }\n if (options.auth) {\n (message as Record<string, unknown>).auth = {\n user: options.auth.user,\n refreshToken: options.auth.refreshToken,\n accessToken: options.auth.accessToken,\n ...(options.auth.expires != null ? { expires: options.auth.expires } : {}),\n };\n }\n\n return transporter.sendMail(message);\n },\n\n async verify(): Promise<true> {\n return transporter.verify();\n },\n\n isIdle(): boolean {\n return typeof transporter.isIdle === 'function' ? transporter.isIdle() : true;\n },\n\n close(): void {\n transporter.close();\n },\n\n getCapabilities(): ProviderCapabilities {\n return getCapabilitiesFromOptions(providerOptions);\n },\n };\n },\n};\n"],"names":["getCapabilitiesFromOptions","opts","capabilities","features","options","host","port","transport","undefined","secure","pool","maxConnections","auth","authType","type","user","push","dkim","proxy","rateLimit","requireTLS","length","init","providerOptions","settings","transporter","nodemailer","createTransport","send","message","from","defaultFrom","to","cc","bcc","replyTo","defaultReplyTo","subject","text","html","sender","attachments","alternatives","watchHtml","amp","headers","priority","messageId","date","xMailer","inReplyTo","references","textEncoding","encoding","normalizeHeaderKey","icalEvent","list","envelope","attachDataUrls","disableUrlAccess","disableFileAccess","raw","dsn","refreshToken","accessToken","expires","sendMail","verify","isIdle","close","getCapabilities"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import nodemailer from 'nodemailer';\nimport type { Transporter, SendMailOptions, SentMessageInfo } from 'nodemailer';\n\ninterface Settings {\n defaultFrom: string;\n defaultReplyTo: string;\n}\n\ninterface SendOptions {\n // --- Core addressing ---\n from?: string;\n to: string;\n cc?: string;\n bcc?: string;\n replyTo?: string;\n /** Address that appears in the Sender: field (for \"on behalf of\" emails) */\n sender?: SendMailOptions['sender'];\n subject: string;\n\n // --- Content ---\n text?: string;\n html?: string;\n /** Apple Watch specific HTML version of the message */\n watchHtml?: SendMailOptions['watchHtml'];\n /** AMP4Email content for interactive emails */\n amp?: SendMailOptions['amp'];\n attachments?: SendMailOptions['attachments'];\n /**\n * Alternative content representations (e.g. Markdown alongside HTML).\n * Uses the same format as attachments. Email clients pick the best match.\n */\n alternatives?: SendMailOptions['alternatives'];\n\n // --- Headers & metadata ---\n /** Custom SMTP headers (e.g. X-Priority, X-Mailer, business-specific headers) */\n headers?: SendMailOptions['headers'];\n /** Email priority: 'high', 'normal', 'low' */\n priority?: SendMailOptions['priority'];\n /** Custom Message-ID value (random value generated if not set) */\n messageId?: SendMailOptions['messageId'];\n /** Custom Date value (current UTC string used if not set) */\n date?: SendMailOptions['date'];\n /** Control or disable the X-Mailer header (false to remove, string to override) */\n xMailer?: SendMailOptions['xMailer'];\n\n // --- Threading ---\n /** Message-ID of the email being replied to (for conversation threading) */\n inReplyTo?: SendMailOptions['inReplyTo'];\n /** Message-ID list this email references (for conversation threading) */\n references?: SendMailOptions['references'];\n\n // --- Encoding ---\n /** Force content-transfer-encoding: 'quoted-printable' or 'base64' */\n textEncoding?: SendMailOptions['textEncoding'];\n /** Encoding for the message (e.g. 'base64', 'hex') */\n encoding?: SendMailOptions['encoding'];\n /** Method to normalize header key casing */\n normalizeHeaderKey?: SendMailOptions['normalizeHeaderKey'];\n\n // --- Advanced features ---\n /**\n * Calendar event invitation (iCalendar format).\n * @example { method: 'REQUEST', content: icsString }\n */\n icalEvent?: SendMailOptions['icalEvent'];\n /**\n * RFC 2369 List-* headers for mailing lists and newsletters.\n * Email clients like Gmail/Outlook show an \"Unsubscribe\" button when set.\n * @example { unsubscribe: { url: 'https://example.com/unsubscribe', comment: 'Unsubscribe' } }\n */\n list?: SendMailOptions['list'];\n /**\n * Custom SMTP envelope for controlling MAIL FROM and RCPT TO independently.\n * @example { from: 'bounce+123@example.com', to: 'recipient@example.com' }\n */\n envelope?: SendMailOptions['envelope'];\n /** Per-message DKIM signing options (overrides transport-level DKIM) */\n dkim?: SendMailOptions['dkim'];\n /** Convert data: URIs in HTML to embedded CID attachments automatically */\n attachDataUrls?: SendMailOptions['attachDataUrls'];\n\n // --- Raw MIME ---\n /**\n * Pre-built MIME message. When set, skips message generation entirely.\n * Address headers and envelope must still be set separately.\n */\n raw?: SendMailOptions['raw'];\n\n // --- DSN & Auth (not in @types/nodemailer but supported by nodemailer) ---\n /**\n * Delivery Status Notification (DSN) configuration.\n * @example { id: 'msg-123', return: 'headers', notify: 'success', recipient: 'sender@example.com' }\n */\n dsn?: {\n id?: string;\n return?: 'headers' | 'full';\n notify?: string | string[];\n recipient?: string;\n };\n /**\n * Per-message OAuth2 authentication for sending on behalf of different users.\n * Requires the transporter to be configured with type: 'OAuth2'.\n * @example { user: 'user@gmail.com', refreshToken: '1/xxx', accessToken: 'ya29.xxx' }\n */\n auth?: {\n user?: string;\n refreshToken?: string;\n accessToken?: string;\n expires?: number;\n };\n}\n\ntype ProviderOptions = Parameters<typeof nodemailer.createTransport>[0];\n\ninterface ProviderCapabilities {\n transport?: {\n host?: string;\n port?: number;\n secure?: boolean;\n pool?: boolean;\n maxConnections?: number;\n };\n auth?: {\n type?: string;\n user?: string;\n };\n features?: string[];\n}\n\nfunction getCapabilitiesFromOptions(opts: ProviderOptions): ProviderCapabilities {\n const capabilities: ProviderCapabilities = {};\n const features: string[] = [];\n\n if (opts && typeof opts === 'object') {\n const options = opts as Record<string, unknown>;\n\n if (options.host || options.port) {\n capabilities.transport = {\n host: typeof options.host === 'string' ? options.host : undefined,\n port: typeof options.port === 'number' ? options.port : undefined,\n secure: typeof options.secure === 'boolean' ? options.secure : undefined,\n pool: typeof options.pool === 'boolean' ? options.pool : undefined,\n maxConnections:\n typeof options.maxConnections === 'number' ? options.maxConnections : undefined,\n };\n }\n\n if (options.auth && typeof options.auth === 'object') {\n const auth = options.auth as Record<string, unknown>;\n const authType = typeof auth.type === 'string' ? auth.type : undefined;\n capabilities.auth = {\n type: authType || (auth.user ? 'login' : undefined),\n user: typeof auth.user === 'string' ? auth.user : undefined,\n };\n if (authType === 'OAuth2') {\n features.push('oauth2');\n }\n }\n\n if (options.dkim) features.push('dkim');\n if (options.pool) features.push('pool');\n if (options.proxy) features.push('proxy');\n if (options.rateLimit) features.push('rateLimiting');\n if (options.requireTLS) features.push('requireTLS');\n }\n\n if (features.length > 0) {\n capabilities.features = features;\n }\n\n return capabilities;\n}\n\nexport default {\n init(providerOptions: ProviderOptions, settings: Settings) {\n const transporter: Transporter = nodemailer.createTransport(providerOptions);\n\n return {\n send(options: SendOptions): Promise<SentMessageInfo> {\n const message: SendMailOptions = {\n from: options.from ?? settings.defaultFrom,\n to: options.to,\n cc: options.cc,\n bcc: options.bcc,\n replyTo: options.replyTo ?? settings.defaultReplyTo,\n subject: options.subject,\n text: options.text ?? options.html,\n html: options.html ?? options.text,\n };\n\n // Addressing\n if (options.sender) {\n message.sender = options.sender;\n }\n\n // Content\n if (options.attachments) {\n message.attachments = options.attachments;\n }\n if (options.alternatives) {\n message.alternatives = options.alternatives;\n }\n if (options.watchHtml) {\n message.watchHtml = options.watchHtml;\n }\n if (options.amp) {\n message.amp = options.amp;\n }\n\n // Headers & metadata\n if (options.headers) {\n message.headers = options.headers;\n }\n if (options.priority) {\n message.priority = options.priority;\n }\n if (options.messageId) {\n message.messageId = options.messageId;\n }\n if (options.date) {\n message.date = options.date;\n }\n if (options.xMailer !== undefined) {\n message.xMailer = options.xMailer;\n }\n\n // Threading\n if (options.inReplyTo) {\n message.inReplyTo = options.inReplyTo;\n }\n if (options.references) {\n message.references = options.references;\n }\n\n // Encoding\n if (options.textEncoding) {\n message.textEncoding = options.textEncoding;\n }\n if (options.encoding) {\n message.encoding = options.encoding;\n }\n if (options.normalizeHeaderKey) {\n message.normalizeHeaderKey = options.normalizeHeaderKey;\n }\n\n // Advanced features\n if (options.icalEvent) {\n message.icalEvent = options.icalEvent;\n }\n if (options.list) {\n message.list = options.list;\n }\n if (options.envelope) {\n message.envelope = options.envelope;\n }\n if (options.dkim) {\n message.dkim = options.dkim;\n }\n if (options.attachDataUrls) {\n message.attachDataUrls = options.attachDataUrls;\n }\n\n // Raw MIME\n if (options.raw) {\n message.raw = options.raw;\n }\n\n // DSN and per-message auth (supported by nodemailer, not fully typed)\n if (options.dsn) {\n (message as Record<string, unknown>).dsn = options.dsn;\n }\n if (options.auth) {\n (message as Record<string, unknown>).auth = {\n user: options.auth.user,\n refreshToken: options.auth.refreshToken,\n accessToken: options.auth.accessToken,\n ...(options.auth.expires != null ? { expires: options.auth.expires } : {}),\n };\n }\n\n // Security: always block nodemailer from reading local files or fetching\n // URLs referenced by attachments[].path / attachments[].href. These are\n // forced on after the message is built so caller-supplied values cannot\n // re-enable file/URL access (prevents LFI/SSRF via attachment sources).\n message.disableFileAccess = true;\n message.disableUrlAccess = true;\n\n return transporter.sendMail(message);\n },\n\n async verify(): Promise<true> {\n return transporter.verify();\n },\n\n isIdle(): boolean {\n return typeof transporter.isIdle === 'function' ? transporter.isIdle() : true;\n },\n\n close(): void {\n transporter.close();\n },\n\n getCapabilities(): ProviderCapabilities {\n return getCapabilitiesFromOptions(providerOptions);\n },\n };\n },\n};\n"],"names":["getCapabilitiesFromOptions","opts","capabilities","features","options","host","port","transport","undefined","secure","pool","maxConnections","auth","authType","type","user","push","dkim","proxy","rateLimit","requireTLS","length","init","providerOptions","settings","transporter","nodemailer","createTransport","send","message","from","defaultFrom","to","cc","bcc","replyTo","defaultReplyTo","subject","text","html","sender","attachments","alternatives","watchHtml","amp","headers","priority","messageId","date","xMailer","inReplyTo","references","textEncoding","encoding","normalizeHeaderKey","icalEvent","list","envelope","attachDataUrls","raw","dsn","refreshToken","accessToken","expires","disableFileAccess","disableUrlAccess","sendMail","verify","isIdle","close","getCapabilities"],"mappings":";;AAiIA,SAASA,2BAA2BC,IAAqB,EAAA;AACvD,IAAA,MAAMC,eAAqC,EAAC;AAC5C,IAAA,MAAMC,WAAqB,EAAE;IAE7B,IAAIF,IAAAA,IAAQ,OAAOA,IAAAA,KAAS,QAAA,EAAU;AACpC,QAAA,MAAMG,OAAAA,GAAUH,IAAAA;AAEhB,QAAA,IAAIG,OAAAA,CAAQC,IAAI,IAAID,OAAAA,CAAQE,IAAI,EAAE;AAChCJ,YAAAA,YAAAA,CAAaK,SAAS,GAAG;AACvBF,gBAAAA,IAAAA,EAAM,OAAOD,OAAAA,CAAQC,IAAI,KAAK,QAAA,GAAWD,OAAAA,CAAQC,IAAI,GAAGG,SAAAA;AACxDF,gBAAAA,IAAAA,EAAM,OAAOF,OAAAA,CAAQE,IAAI,KAAK,QAAA,GAAWF,OAAAA,CAAQE,IAAI,GAAGE,SAAAA;AACxDC,gBAAAA,MAAAA,EAAQ,OAAOL,OAAAA,CAAQK,MAAM,KAAK,SAAA,GAAYL,OAAAA,CAAQK,MAAM,GAAGD,SAAAA;AAC/DE,gBAAAA,IAAAA,EAAM,OAAON,OAAAA,CAAQM,IAAI,KAAK,SAAA,GAAYN,OAAAA,CAAQM,IAAI,GAAGF,SAAAA;AACzDG,gBAAAA,cAAAA,EACE,OAAOP,OAAAA,CAAQO,cAAc,KAAK,QAAA,GAAWP,OAAAA,CAAQO,cAAc,GAAGH;AAC1E,aAAA;AACF,QAAA;AAEA,QAAA,IAAIJ,QAAQQ,IAAI,IAAI,OAAOR,OAAAA,CAAQQ,IAAI,KAAK,QAAA,EAAU;YACpD,MAAMA,IAAAA,GAAOR,QAAQQ,IAAI;YACzB,MAAMC,QAAAA,GAAW,OAAOD,IAAAA,CAAKE,IAAI,KAAK,QAAA,GAAWF,IAAAA,CAAKE,IAAI,GAAGN,SAAAA;AAC7DN,YAAAA,YAAAA,CAAaU,IAAI,GAAG;AAClBE,gBAAAA,IAAAA,EAAMD,aAAaD,IAAAA,CAAKG,IAAI,GAAG,UAAUP,SAAQ,CAAA;AACjDO,gBAAAA,IAAAA,EAAM,OAAOH,IAAAA,CAAKG,IAAI,KAAK,QAAA,GAAWH,IAAAA,CAAKG,IAAI,GAAGP;AACpD,aAAA;AACA,YAAA,IAAIK,aAAa,QAAA,EAAU;AACzBV,gBAAAA,QAAAA,CAASa,IAAI,CAAC,QAAA,CAAA;AAChB,YAAA;AACF,QAAA;AAEA,QAAA,IAAIZ,OAAAA,CAAQa,IAAI,EAAEd,QAAAA,CAASa,IAAI,CAAC,MAAA,CAAA;AAChC,QAAA,IAAIZ,OAAAA,CAAQM,IAAI,EAAEP,QAAAA,CAASa,IAAI,CAAC,MAAA,CAAA;AAChC,QAAA,IAAIZ,OAAAA,CAAQc,KAAK,EAAEf,QAAAA,CAASa,IAAI,CAAC,OAAA,CAAA;AACjC,QAAA,IAAIZ,OAAAA,CAAQe,SAAS,EAAEhB,QAAAA,CAASa,IAAI,CAAC,cAAA,CAAA;AACrC,QAAA,IAAIZ,OAAAA,CAAQgB,UAAU,EAAEjB,QAAAA,CAASa,IAAI,CAAC,YAAA,CAAA;AACxC,IAAA;IAEA,IAAIb,QAAAA,CAASkB,MAAM,GAAG,CAAA,EAAG;AACvBnB,QAAAA,YAAAA,CAAaC,QAAQ,GAAGA,QAAAA;AAC1B,IAAA;IAEA,OAAOD,YAAAA;AACT;AAEA,YAAe;IACboB,IAAAA,CAAAA,CAAKC,eAAgC,EAAEC,QAAkB,EAAA;QACvD,MAAMC,WAAAA,GAA2BC,UAAAA,CAAWC,eAAe,CAACJ,eAAAA,CAAAA;QAE5D,OAAO;AACLK,YAAAA,IAAAA,CAAAA,CAAKxB,OAAoB,EAAA;AACvB,gBAAA,MAAMyB,OAAAA,GAA2B;AAC/BC,oBAAAA,IAAAA,EAAM1B,OAAAA,CAAQ0B,IAAI,IAAIN,QAAAA,CAASO,WAAW;AAC1CC,oBAAAA,EAAAA,EAAI5B,QAAQ4B,EAAE;AACdC,oBAAAA,EAAAA,EAAI7B,QAAQ6B,EAAE;AACdC,oBAAAA,GAAAA,EAAK9B,QAAQ8B,GAAG;AAChBC,oBAAAA,OAAAA,EAAS/B,OAAAA,CAAQ+B,OAAO,IAAIX,QAAAA,CAASY,cAAc;AACnDC,oBAAAA,OAAAA,EAASjC,QAAQiC,OAAO;AACxBC,oBAAAA,IAAAA,EAAMlC,OAAAA,CAAQkC,IAAI,IAAIlC,OAAAA,CAAQmC,IAAI;AAClCA,oBAAAA,IAAAA,EAAMnC,OAAAA,CAAQmC,IAAI,IAAInC,OAAAA,CAAQkC;AAChC,iBAAA;;gBAGA,IAAIlC,OAAAA,CAAQoC,MAAM,EAAE;oBAClBX,OAAAA,CAAQW,MAAM,GAAGpC,OAAAA,CAAQoC,MAAM;AACjC,gBAAA;;gBAGA,IAAIpC,OAAAA,CAAQqC,WAAW,EAAE;oBACvBZ,OAAAA,CAAQY,WAAW,GAAGrC,OAAAA,CAAQqC,WAAW;AAC3C,gBAAA;gBACA,IAAIrC,OAAAA,CAAQsC,YAAY,EAAE;oBACxBb,OAAAA,CAAQa,YAAY,GAAGtC,OAAAA,CAAQsC,YAAY;AAC7C,gBAAA;gBACA,IAAItC,OAAAA,CAAQuC,SAAS,EAAE;oBACrBd,OAAAA,CAAQc,SAAS,GAAGvC,OAAAA,CAAQuC,SAAS;AACvC,gBAAA;gBACA,IAAIvC,OAAAA,CAAQwC,GAAG,EAAE;oBACff,OAAAA,CAAQe,GAAG,GAAGxC,OAAAA,CAAQwC,GAAG;AAC3B,gBAAA;;gBAGA,IAAIxC,OAAAA,CAAQyC,OAAO,EAAE;oBACnBhB,OAAAA,CAAQgB,OAAO,GAAGzC,OAAAA,CAAQyC,OAAO;AACnC,gBAAA;gBACA,IAAIzC,OAAAA,CAAQ0C,QAAQ,EAAE;oBACpBjB,OAAAA,CAAQiB,QAAQ,GAAG1C,OAAAA,CAAQ0C,QAAQ;AACrC,gBAAA;gBACA,IAAI1C,OAAAA,CAAQ2C,SAAS,EAAE;oBACrBlB,OAAAA,CAAQkB,SAAS,GAAG3C,OAAAA,CAAQ2C,SAAS;AACvC,gBAAA;gBACA,IAAI3C,OAAAA,CAAQ4C,IAAI,EAAE;oBAChBnB,OAAAA,CAAQmB,IAAI,GAAG5C,OAAAA,CAAQ4C,IAAI;AAC7B,gBAAA;gBACA,IAAI5C,OAAAA,CAAQ6C,OAAO,KAAKzC,SAAAA,EAAW;oBACjCqB,OAAAA,CAAQoB,OAAO,GAAG7C,OAAAA,CAAQ6C,OAAO;AACnC,gBAAA;;gBAGA,IAAI7C,OAAAA,CAAQ8C,SAAS,EAAE;oBACrBrB,OAAAA,CAAQqB,SAAS,GAAG9C,OAAAA,CAAQ8C,SAAS;AACvC,gBAAA;gBACA,IAAI9C,OAAAA,CAAQ+C,UAAU,EAAE;oBACtBtB,OAAAA,CAAQsB,UAAU,GAAG/C,OAAAA,CAAQ+C,UAAU;AACzC,gBAAA;;gBAGA,IAAI/C,OAAAA,CAAQgD,YAAY,EAAE;oBACxBvB,OAAAA,CAAQuB,YAAY,GAAGhD,OAAAA,CAAQgD,YAAY;AAC7C,gBAAA;gBACA,IAAIhD,OAAAA,CAAQiD,QAAQ,EAAE;oBACpBxB,OAAAA,CAAQwB,QAAQ,GAAGjD,OAAAA,CAAQiD,QAAQ;AACrC,gBAAA;gBACA,IAAIjD,OAAAA,CAAQkD,kBAAkB,EAAE;oBAC9BzB,OAAAA,CAAQyB,kBAAkB,GAAGlD,OAAAA,CAAQkD,kBAAkB;AACzD,gBAAA;;gBAGA,IAAIlD,OAAAA,CAAQmD,SAAS,EAAE;oBACrB1B,OAAAA,CAAQ0B,SAAS,GAAGnD,OAAAA,CAAQmD,SAAS;AACvC,gBAAA;gBACA,IAAInD,OAAAA,CAAQoD,IAAI,EAAE;oBAChB3B,OAAAA,CAAQ2B,IAAI,GAAGpD,OAAAA,CAAQoD,IAAI;AAC7B,gBAAA;gBACA,IAAIpD,OAAAA,CAAQqD,QAAQ,EAAE;oBACpB5B,OAAAA,CAAQ4B,QAAQ,GAAGrD,OAAAA,CAAQqD,QAAQ;AACrC,gBAAA;gBACA,IAAIrD,OAAAA,CAAQa,IAAI,EAAE;oBAChBY,OAAAA,CAAQZ,IAAI,GAAGb,OAAAA,CAAQa,IAAI;AAC7B,gBAAA;gBACA,IAAIb,OAAAA,CAAQsD,cAAc,EAAE;oBAC1B7B,OAAAA,CAAQ6B,cAAc,GAAGtD,OAAAA,CAAQsD,cAAc;AACjD,gBAAA;;gBAGA,IAAItD,OAAAA,CAAQuD,GAAG,EAAE;oBACf9B,OAAAA,CAAQ8B,GAAG,GAAGvD,OAAAA,CAAQuD,GAAG;AAC3B,gBAAA;;gBAGA,IAAIvD,OAAAA,CAAQwD,GAAG,EAAE;oBACd/B,OAAAA,CAAoC+B,GAAG,GAAGxD,OAAAA,CAAQwD,GAAG;AACxD,gBAAA;gBACA,IAAIxD,OAAAA,CAAQQ,IAAI,EAAE;AACfiB,oBAAAA,OAAAA,CAAoCjB,IAAI,GAAG;wBAC1CG,IAAAA,EAAMX,OAAAA,CAAQQ,IAAI,CAACG,IAAI;wBACvB8C,YAAAA,EAAczD,OAAAA,CAAQQ,IAAI,CAACiD,YAAY;wBACvCC,WAAAA,EAAa1D,OAAAA,CAAQQ,IAAI,CAACkD,WAAW;AACrC,wBAAA,GAAI1D,OAAAA,CAAQQ,IAAI,CAACmD,OAAO,IAAI,IAAA,GAAO;4BAAEA,OAAAA,EAAS3D,OAAAA,CAAQQ,IAAI,CAACmD;AAAQ,yBAAA,GAAI;AACzE,qBAAA;AACF,gBAAA;;;;;AAMAlC,gBAAAA,OAAAA,CAAQmC,iBAAiB,GAAG,IAAA;AAC5BnC,gBAAAA,OAAAA,CAAQoC,gBAAgB,GAAG,IAAA;gBAE3B,OAAOxC,WAAAA,CAAYyC,QAAQ,CAACrC,OAAAA,CAAAA;AAC9B,YAAA,CAAA;YAEA,MAAMsC,MAAAA,CAAAA,GAAAA;AACJ,gBAAA,OAAO1C,YAAY0C,MAAM,EAAA;AAC3B,YAAA,CAAA;AAEAC,YAAAA,MAAAA,CAAAA,GAAAA;AACE,gBAAA,OAAO,OAAO3C,WAAAA,CAAY2C,MAAM,KAAK,UAAA,GAAa3C,WAAAA,CAAY2C,MAAM,EAAA,GAAK,IAAA;AAC3E,YAAA,CAAA;AAEAC,YAAAA,KAAAA,CAAAA,GAAAA;AACE5C,gBAAAA,WAAAA,CAAY4C,KAAK,EAAA;AACnB,YAAA,CAAA;AAEAC,YAAAA,eAAAA,CAAAA,GAAAA;AACE,gBAAA,OAAOtE,0BAAAA,CAA2BuB,eAAAA,CAAAA;AACpC,YAAA;AACF,SAAA;AACF,IAAA;AACF,CAAA;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/provider-email-nodemailer",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.54.0",
|
|
4
4
|
"description": "Nodemailer provider for Strapi",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"strapi",
|
|
@@ -79,10 +79,10 @@
|
|
|
79
79
|
"devDependencies": {
|
|
80
80
|
"@types/node": "20.19.41",
|
|
81
81
|
"@types/nodemailer": "7.0.11",
|
|
82
|
-
"eslint-config-custom": "5.
|
|
83
|
-
"tsconfig": "5.
|
|
82
|
+
"eslint-config-custom": "5.54.0",
|
|
83
|
+
"tsconfig": "5.54.0",
|
|
84
84
|
"vitest": "catalog:",
|
|
85
|
-
"vitest-config": "5.
|
|
85
|
+
"vitest-config": "5.54.0"
|
|
86
86
|
},
|
|
87
87
|
"engines": {
|
|
88
88
|
"node": ">=20.0.0 <=26.x.x",
|