node_modules: update (#322)

Co-authored-by: dawidd6 <9713907+dawidd6@users.noreply.github.com>
This commit is contained in:
Dawid Dziurla
2026-09-15 13:00:32 +02:00
committed by GitHub
parent 4a3d0f9ca3
commit 67ce3558d6
174 changed files with 25661 additions and 5540 deletions
+330
View File
@@ -0,0 +1,330 @@
import { type Duplex, type Readable, type TransformOptions, type Writable } from 'node:stream';
import type { NodemailerError } from '../errors.js';
import type { OutgoingHttpHeaders } from 'node:http';
/**
* Options for a MimeNode
*/
export interface MimeNodeOptions {
/** root node for this tree */
rootNode?: MimeNode | undefined;
/** immediate parent for this node */
parentNode?: MimeNode | undefined;
/** filename for an attachment node */
filename?: string | undefined;
/** shared part of the unique multipart boundary */
baseBoundary?: string | undefined;
/** prefix for the generated multipart boundaries, defaults to '--_NmP' */
boundaryPrefix?: string | undefined;
/** If true, do not exclude Bcc from the generated headers */
keepBcc?: boolean | undefined;
/** method to normalize header keys for custom caseing */
normalizeHeaderKey?: ((key: string, value: string) => string) | undefined;
/** either 'Q' (the default) or 'B' */
textEncoding?: string | undefined;
/** Hostname for default message-id values */
hostname?: string | undefined;
/** If set to 'win' then uses \r\n, if 'linux' then \n. If not set (or `raw` is used) then newlines are kept as is */
newline?: string | undefined;
/** Reject content that points to a file path, for this node and every node below it */
disableFileAccess?: boolean | undefined;
/** Reject content that points to a URL, for this node and every node below it */
disableUrlAccess?: boolean | undefined;
}
/**
* An address object as accepted in address headers and produced by getAddresses. Either a
* mailbox with an address or a group holding a list of addresses
*/
export interface MimeNodeAddress {
name?: string | undefined;
address?: string | undefined;
group?: MimeNodeAddress[] | undefined;
}
/**
* Addresses as accepted by address headers and envelope fields: an address string, an
* address object, or an array of these, nested arrays included
*/
export type MimeNodeAddressInput = string | MimeNodeAddress | MimeNodeAddressInput[];
/**
* A header value object. When `prepared` is set the value is emitted as is, without
* encoding, and folded only if `foldLines` is set as well
*/
export interface MimeNodePreparedHeaderValue {
value?: unknown;
prepared?: boolean | undefined;
foldLines?: boolean | undefined;
}
/**
* The values a header can hold: a string, a number, a Date (for the Date header), address
* objects (for the address headers), a prepared value object, or a list of these
*/
export type MimeNodeHeaderValue = string | number | boolean | Date | MimeNodeAddress | MimeNodePreparedHeaderValue | MimeNodeHeaderValue[] | null | undefined;
/**
* A single header, the shape the headers are stored in and one of the list forms
* setHeader and addHeader accept
*/
export interface MimeNodeHeader {
key: string;
value: MimeNodeHeaderValue;
}
/**
* Several headers keyed by header name
*/
export interface MimeNodeHeaderMap {
[key: string]: MimeNodeHeaderValue;
}
/**
* Several headers at once, as accepted by setHeader and addHeader: a single {key, value}
* pair, a list of them, or an object keyed by header name
*/
export type MimeNodeHeaders = MimeNodeHeader | MimeNodeHeader[] | MimeNodeHeaderMap;
/**
* A content descriptor object, see setContent. Points to the content instead of carrying it
*/
export interface MimeNodeContentObject {
/** File path to read the content from */
path?: string | undefined;
/** URL to fetch the content from */
href?: string | undefined;
/** Request headers for a URL fetch */
httpHeaders?: OutgoingHttpHeaders | undefined;
/** TLS settings for a URL fetch, see nmfetch */
tls?: {
[key: string]: any;
} | undefined;
}
/**
* Body content as accepted by setContent and setRaw: a string, a Buffer, a readable stream
* or an object pointing to the content
*/
export type MimeNodeContent = string | Buffer | Readable | MimeNodeContentObject;
/**
* SMTP envelope as returned by getEnvelope. Custom fields of an envelope set with
* setEnvelope are carried along
*/
export interface MimeNodeEnvelope {
from: string | false;
to: string[];
[key: string]: unknown;
}
/**
* Envelope as accepted by setEnvelope. Recipients are collected from to, cc and bcc, any
* other field is copied to the envelope as is
*/
export interface MimeNodeEnvelopeInput {
from?: MimeNodeAddressInput | undefined;
to?: MimeNodeAddressInput | undefined;
cc?: MimeNodeAddressInput | undefined;
bcc?: MimeNodeAddressInput | undefined;
[key: string]: unknown;
}
/**
* Parsed address headers as returned by getAddresses, keyed by lowercase header name
*/
export interface MimeNodeAddresses {
from?: MimeNodeAddress[] | undefined;
sender?: MimeNodeAddress[] | undefined;
'reply-to'?: MimeNodeAddress[] | undefined;
to?: MimeNodeAddress[] | undefined;
cc?: MimeNodeAddress[] | undefined;
bcc?: MimeNodeAddress[] | undefined;
}
/**
* Options for createReadStream. Handed to the PassThrough the message is written to and to
* the base64 / quoted-printable encoders, which read `lineLength` from it
*/
export interface MimeNodeStreamOptions extends TransformOptions {
/** Maximum line length for base64 and quoted-printable bodies, false disables wrapping */
lineLength?: number | false | undefined;
}
/**
* A transform stream the message is piped through, or a function returning one
*/
export type MimeNodeTransform = Duplex | (() => Duplex);
/**
* A post process function, takes the message stream and returns the stream to expose instead
*/
export type MimeNodeProcessFunc = (input: Readable) => Readable;
/**
* Callback for build
*/
export type MimeNodeBuildCallback = (err: NodemailerError | null, message: Buffer) => void;
/**
* Creates a new mime tree node. Assumes 'multipart/*' as the content type
* if it is a branch, anything else counts as leaf. If rootNode is missing from
* the options, assumes this is the root.
*
* @param contentType Define the content type for the node. Can be left blank for attachments (derived from filename)
* @param [options] optional options
* @param [options.rootNode] root node for this tree
* @param [options.parentNode] immediate parent for this node
* @param [options.filename] filename for an attachment node
* @param [options.baseBoundary] shared part of the unique multipart boundary
* @param [options.keepBcc] If true, do not exclude Bcc from the generated headers
* @param [options.normalizeHeaderKey] method to normalize header keys for custom caseing
* @param [options.textEncoding] either 'Q' (the default) or 'B'
*/
declare class MimeNode {
nodeCounter: number;
baseBoundary: string;
boundaryPrefix: string;
disableFileAccess: boolean;
disableUrlAccess: boolean;
normalizeHeaderKey: MimeNodeOptions['normalizeHeaderKey'];
date: Date | null;
rootNode: MimeNode;
keepBcc: boolean;
textEncoding: string;
parentNode: MimeNode | undefined;
hostname: string | undefined;
newline: string | undefined;
childNodes: MimeNode[];
/** Filename for this node. Useful with attachments */
filename?: string | undefined;
/** Body content, or the error a content stream emitted before it was read */
content?: MimeNodeContent | Error | undefined;
/** Lowercase content type, set when the headers are built */
contentType?: string | undefined;
/** Multipart subtype, false for a non-multipart node, set when the headers are built */
multipart?: string | false | undefined;
/** Multipart boundary, false for a non-multipart node, set when the headers are built */
boundary?: string | false | undefined;
constructor(contentType?: string | false, options?: MimeNodeOptions);
/**
* Creates and appends a child node.Arguments provided are passed to MimeNode constructor
*
* @param [contentType] Optional content type
* @param [options] Optional options object
* @return Created node object
*/
createChild(contentType?: string | false | MimeNodeOptions, options?: MimeNodeOptions): MimeNode;
/**
* Appends an existing node to the mime tree. Removes the node from an existing
* tree if needed
*
* @param childNode node to be appended
* @return Appended node object
*/
appendChild(childNode: MimeNode): MimeNode;
/**
* Replaces current node with another node
*
* @param node Replacement node
* @return Replacement node
*/
replace(node: MimeNode): MimeNode;
/**
* Removes current node from the mime tree
*
* @return removed node
*/
remove(): MimeNode | undefined;
/**
* Sets a header value. If the value for selected key exists, it is overwritten.
* You can set multiple values as well by using [{key:'', value:''}] or
* {key: 'value'} as the first argument.
*
* @param key Header key or a list of key value pairs
* @param value Header value
* @return current node
*/
setHeader(key: string | MimeNodeHeaders, value?: MimeNodeHeaderValue): this;
/**
* Adds a header value. If the value for selected key exists, the value is appended
* as a new field and old one is not touched.
* You can set multiple values as well by using [{key:'', value:''}] or
* {key: 'value'} as the first argument.
*
* @param key Header key or a list of key value pairs
* @param value Header value
* @return current node
*/
addHeader(key: string | MimeNodeHeaders, value?: MimeNodeHeaderValue): this;
/**
* Retrieves the first mathcing value of a selected key
*
* @param key Key to search for
* @retun Value for the key
*/
getHeader(key: string): MimeNodeHeaderValue;
/**
* Sets body content for current node. If the value is a string, charset is added automatically
* to Content-Type (if it is text/*). If the value is a Buffer, you need to specify
* the charset yourself
*
* @param content Body content
* @return current node
*/
setContent(content: MimeNodeContent): this;
build(): Promise<Buffer>;
build(callback: MimeNodeBuildCallback): void;
getTransferEncoding(): string | false;
/**
* Builds the header block for the mime node. Append \r\n\r\n before writing the content
*
* @returns Headers
*/
buildHeaders(): string;
/**
* Streams the rfc2822 message from the current node. If this is a root node,
* mandatory header fields are set if missing (Date, Message-Id, MIME-Version)
*
* @return Compiled message
*/
createReadStream(options?: MimeNodeStreamOptions): Readable;
/**
* Appends a transform stream object to the transforms list. Final output
* is passed through this stream before exposing
*
* @param transform Read-Write stream
*/
transform(transform: MimeNodeTransform): void;
/**
* Appends a post process function. The functon is run after transforms and
* uses the following syntax
*
* processFunc(input) -> outputStream
*
* @param processFunc Read-Write stream
*/
processFunc(processFunc: MimeNodeProcessFunc): void;
stream(outputStream: Writable, options: MimeNodeStreamOptions, done: (err?: Error | null) => void): void;
/**
* Sets envelope to be used instead of the generated one
*
* @return SMTP envelope in the form of {from: 'from@example.com', to: ['to@example.com']}
*/
setEnvelope(envelope: MimeNodeEnvelopeInput): this;
/**
* Generates and returns an object with parsed address fields
*
* @return Address object
*/
getAddresses(): MimeNodeAddresses;
/**
* Generates and returns SMTP envelope with the sender address and a list of recipients addresses
*
* @return SMTP envelope in the form of {from: 'from@example.com', to: ['to@example.com']}
*/
getEnvelope(): MimeNodeEnvelope;
/**
* Returns Message-Id value. If it does not exist, then creates one
*
* @return Message-Id value
*/
messageId(): string;
/**
* Sets pregenerated content that will be used as the output of this node
*
* @param raw Raw MIME contents
*/
setRaw(raw: MimeNodeContent): this;
}
/**
* Type aliases in the layout of @types/nodemailer, so `MimeNode.Options` style references keep working
*/
declare namespace MimeNode {
type Options = MimeNodeOptions;
type Addresses = MimeNodeAddresses;
type Envelope = MimeNodeEnvelope;
}
export default MimeNode;
File diff suppressed because it is too large Load Diff
+5
View File
@@ -0,0 +1,5 @@
import { Transform } from 'node:stream';
export default class LastNewline extends Transform {
lastByte: number | false;
constructor();
}
+32
View File
@@ -0,0 +1,32 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const node_stream_1 = require("node:stream");
class LastNewline extends node_stream_1.Transform {
constructor() {
super();
this.lastByte = false;
}
/** @internal */
_transform(chunk, encoding, done) {
if (chunk.length) {
this.lastByte = chunk[chunk.length - 1];
}
this.push(chunk);
done();
}
/** @internal */
_flush(done) {
if (this.lastByte === 0x0a) {
return done();
}
if (this.lastByte === 0x0d) {
this.push(Buffer.from('\n'));
return done();
}
this.push(Buffer.from('\r\n'));
return done();
}
}
exports.default = LastNewline;
module.exports = exports.default;
Object.defineProperty(module.exports, 'default', { value: exports.default, enumerable: false, writable: true, configurable: true });
+9
View File
@@ -0,0 +1,9 @@
import { Transform, type TransformOptions } from 'node:stream';
/**
* Ensures that only <LF> is used for linebreaks
*
* @param options Stream options
*/
export default class LeUnix extends Transform {
constructor(options?: TransformOptions);
}
+40
View File
@@ -0,0 +1,40 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const node_stream_1 = require("node:stream");
/**
* Ensures that only <LF> is used for linebreaks
*
* @param options Stream options
*/
class LeUnix extends node_stream_1.Transform {
constructor(options) {
super(options);
}
/**
* Escapes dots
* @internal
*/
_transform(chunk, encoding, done) {
let buf;
let lastPos = 0;
for (let i = 0, len = chunk.length; i < len; i++) {
if (chunk[i] === 0x0d) {
// \r
buf = chunk.slice(lastPos, i);
lastPos = i + 1;
this.push(buf);
}
}
if (lastPos && lastPos < chunk.length) {
buf = chunk.slice(lastPos);
this.push(buf);
}
else if (!lastPos) {
this.push(chunk);
}
done();
}
}
exports.default = LeUnix;
module.exports = exports.default;
Object.defineProperty(module.exports, 'default', { value: exports.default, enumerable: false, writable: true, configurable: true });
+10
View File
@@ -0,0 +1,10 @@
import { Transform, type TransformOptions } from 'node:stream';
/**
* Ensures that only <CR><LF> sequences are used for linebreaks
*
* @param options Stream options
*/
export default class LeWindows extends Transform {
lastByte: number | false;
constructor(options?: TransformOptions);
}
+47
View File
@@ -0,0 +1,47 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const node_stream_1 = require("node:stream");
/**
* Ensures that only <CR><LF> sequences are used for linebreaks
*
* @param options Stream options
*/
class LeWindows extends node_stream_1.Transform {
constructor(options) {
super(options);
this.lastByte = false;
}
/**
* Escapes dots
* @internal
*/
_transform(chunk, encoding, done) {
let buf;
let lastPos = 0;
for (let i = 0, len = chunk.length; i < len; i++) {
if (chunk[i] === 0x0a) {
// \n
if ((i && chunk[i - 1] !== 0x0d) || (!i && this.lastByte !== 0x0d)) {
if (i > lastPos) {
buf = chunk.slice(lastPos, i);
this.push(buf);
}
this.push(Buffer.from('\r\n'));
lastPos = i + 1;
}
}
}
if (lastPos && lastPos < chunk.length) {
buf = chunk.slice(lastPos);
this.push(buf);
}
else if (!lastPos) {
this.push(chunk);
}
this.lastByte = chunk[chunk.length - 1];
done();
}
}
exports.default = LeWindows;
module.exports = exports.default;
Object.defineProperty(module.exports, 'default', { value: exports.default, enumerable: false, writable: true, configurable: true });