diff --git a/lib/commands/authenticate.js b/lib/commands/authenticate.js index 31b8cee..2fe0d71 100644 --- a/lib/commands/authenticate.js +++ b/lib/commands/authenticate.js @@ -137,7 +137,7 @@ async function authPlain(connection, username, password) { } // Authenticates user using LOGIN -module.exports = async (connection, username, { accessToken, password }) => { +module.exports = async (connection, username, { accessToken, password, loginMethod }) => { if (connection.state !== connection.states.NOT_AUTHENTICATED) { // nothing to do here return; @@ -151,10 +151,11 @@ module.exports = async (connection, username, { accessToken, password }) => { } if (password) { - if (connection.capabilities.has('AUTH=PLAIN')) { + if ((!loginMethod && connection.capabilities.has('AUTH=PLAIN')) || loginMethod === 'AUTH=PLAIN') { return await authPlain(connection, username, password); } - if (connection.capabilities.has('AUTH=LOGIN')) { + + if ((!loginMethod && connection.capabilities.has('AUTH=LOGIN')) || loginMethod === 'AUTH=LOGIN') { return await authLogin(connection, username, password); } } diff --git a/lib/imap-flow.js b/lib/imap-flow.js index af9b6e8..3fd5cd3 100644 --- a/lib/imap-flow.js +++ b/lib/imap-flow.js @@ -116,48 +116,110 @@ class ImapFlow extends EventEmitter { static version = packageInfo.version; /** - * @param {Object} options IMAP connection options - * @param {String} options.host Hostname of the IMAP server - * @param {Number} options.port Port number for the IMAP server - * @param {Boolean} [options.secure=false] Should the connection be established immediately and directly over TLS? Typically on port 993. - * @param {Boolean} [options.doSTARTTLS=undefined] Should the connection be established using STARTTLS? - * * If `true`, the connection is first established as unencrypted and then upgraded to TLS using STARTTLS, before authentication. - * If the server does not advertize the `STARTTLS` `CAPABILITY`, or the upgrade fails for other reasons, then the connection fails. - * Note: The combination `secure=true` (direct TLS) and `doSTARTTLS=true` is invalid. - * * If `false`, then STARTTLS will not be used, even if the server advertizes it in IMAP `CAPABILITY`. - * This helps with servers that have a broken TLS configuration. - * If `doSTARTTLS=false` and `secure=false`, then a plain unencrypted socket is used. - * Be sure to clearly warn the user about the consequences. - * * If `undefined` (default) and `secure=false` (default), the connection is upgraded using STARTTLS before authentication, /only if possible/ . - * If not possible, the connection will use an unencrypted plain socket. - * This can mean TLS is used under normal circumstances, but a serious attacker can force an unencrypted connection and steal passwords, - * called "downgrade attack". This can lead to a false sense of security. Be sure to warn the user. - * @param {String} [options.servername] Servername for SNI (or when host is set to an IP address) - * @param {Boolean} [options.disableCompression=false] if `true` then client does not try to use COMPRESS=DEFLATE extension - * @param {Object} options.auth Authentication options. Authentication is requested automatically during connect() - * @param {String} options.auth.user Usename - * @param {String} [options.auth.pass] Password, if using regular authentication - * @param {String} [options.auth.accessToken] OAuth2 Access Token, if using OAuth2 authentication - * @param {IdInfoObject} [options.clientInfo] Client identification info - * @param {Boolean} [options.disableAutoIdle=false] if `true` then IDLE is not started automatically. Useful if you only need to perform specific tasks over the connection - * @param {Object} [options.tls] Additional TLS options (see [Node.js TLS connect](https://nodejs.org/api/tls.html#tls_tls_connect_options_callback) for all available options) - * @param {Boolean} [options.tls.rejectUnauthorized=true] if `false` then client accepts self-signed and expired certificates from the server - * @param {String} [options.tls.minVersion=TLSv1.2] To improvde security you might need to use something newer, eg *'TLSv1.2'* - * @param {Number} [options.tls.minDHSize=1024] Minimum size of the DH parameter in bits to accept a TLS connection - * @param {Object} [options.logger] Custom logger instance with `debug(obj)`, `info(obj)`, `warn(obj)` and `error(obj)` methods. If not provided then ImapFlow logs to console using pino format. Can be disabled by setting to `false` - * @param {Boolean} [options.logRaw=false] If true then log data read from and written to socket encoded in base64 - * @param {Boolean} [options.emitLogs=false] If `true` then in addition of sending data to logger, ImapFlow emits 'log' events with the same data - * @param {Boolean} [options.verifyOnly=false] If `true` then logs out automatically after successful authentication - * @param {String} [options.proxy] Optional proxy URL. Supports HTTP CONNECT (`http://`, `https://`) and SOCKS (`socks://`, `socks4://`, `socks5://`) proxies - * @param {Boolean} [options.qresync=false] If true, then enables QRESYNC support. EXPUNGE notifications will include `uid` property instead of `seq` - * @param {Number} [options.maxIdleTime] If set, then breaks and restarts IDLE every maxIdleTime ms - * @param {String} [options.missingIdleCommand="NOOP"] Which command to use if server does not support IDLE - * @param {Boolean} [options.disableBinary=false] If true, then ignores the BINARY extension when making FETCH and APPEND calls - * @param {Boolean} [options.disableAutoEnable] Do not enable supported extensions by default - * @param {Number} [options.connectionTimeout=90000] how many milliseconds to wait for the connection to establish (default is 90 seconds) - * @param {Number} [options.greetingTimeout=16000] how many milliseconds to wait for the greeting after connection is established (default is 16 seconds) - * @param {Number} [options.socketTimeout=300000] how many milliseconds of inactivity to allow (default is 5 minutes) + * IMAP connection options + * + * @property {String} host + * Hostname of the IMAP server. + * + * @property {Number} port + * Port number for the IMAP server. + * + * @property {Boolean} [secure=false] + * If `true`, establishes the connection directly over TLS (commonly on port 993). + * If `false`, a plain (unencrypted) connection is used first and, if possible, the connection is upgraded to STARTTLS. + * + * @property {Boolean} [doSTARTTLS=undefined] + * Determines whether to upgrade the connection to TLS via STARTTLS: + * - **true**: Start unencrypted and upgrade to TLS using STARTTLS before authentication. + * The connection fails if the server does not support STARTTLS or the upgrade fails. + * Note that `secure=true` combined with `doSTARTTLS=true` is invalid. + * - **false**: Never use STARTTLS, even if the server advertises support. + * This is useful if the server has a broken TLS setup. + * Combined with `secure=false`, this results in a fully unencrypted connection. + * Make sure you warn users about the security risks. + * - **undefined** (default): If `secure=false` (default), attempt to upgrade to TLS via STARTTLS before authentication if the server supports it. If not supported, continue unencrypted. This may expose the connection to a downgrade attack. + * + * @property {String} [servername] + * Server name for SNI or when using an IP address as `host`. + * + * @property {Boolean} [disableCompression=false] + * If `true`, the client does not attempt to use the COMPRESS=DEFLATE extension. + * + * @property {Object} auth + * Authentication options. Authentication occurs automatically during {@link connect}. + * + * @property {String} auth.user + * Username for authentication. + * + * @property {String} [auth.pass] + * Password for regular authentication. + * + * @property {String} [auth.accessToken] + * OAuth2 access token, if using OAuth2 authentication. + * + * @property {String} [auth.loginMethod] + * Optional login method for password-based authentication (e.g., "LOGIN", "AUTH=LOGIN", or "AUTH=PLAIN"). + * If not set, ImapFlow chooses based on available mechanisms. + * + * @property {IdInfoObject} [clientInfo] + * Client identification info sent to the server (via the ID command). + * + * @property {Boolean} [disableAutoIdle=false] + * If `true`, do not start IDLE automatically. Useful when only specific operations are needed. + * + * @property {Object} [tls] + * Additional TLS options. For details, see [Node.js TLS connect](https://nodejs.org/api/tls.html#tls_tls_connect_options_callback). + * + * @property {Boolean} [tls.rejectUnauthorized=true] + * If `false`, allows self-signed or expired certificates. + * + * @property {String} [tls.minVersion='TLSv1.2'] + * Minimum accepted TLS version (e.g., `'TLSv1.2'`). + * + * @property {Number} [tls.minDHSize=1024] + * Minimum size (in bits) of the DH parameter for TLS connections. + * + * @property {Object|Boolean} [logger] + * Custom logger instance with `debug(obj)`, `info(obj)`, `warn(obj)`, and `error(obj)` methods. + * If `false`, logging is disabled. If not provided, ImapFlow logs to console in [pino format](https://getpino.io/). + * + * @property {Boolean} [logRaw=false] + * If `true`, logs all raw data (read and written) in base64 encoding. You can pipe such logs to [eerawlog](https://github.com/postalsys/eerawlog) command for readable output. + * + * @property {Boolean} [emitLogs=false] + * If `true`, emits `'log'` events with the same data passed to the logger. + * + * @property {Boolean} [verifyOnly=false] + * If `true`, disconnects after successful authentication without performing other actions. + * + * @property {String} [proxy] + * Proxy URL. Supports HTTP CONNECT (`http://`, `https://`) and SOCKS (`socks://`, `socks4://`, `socks5://`). + * + * @property {Boolean} [qresync=false] + * If `true`, enables QRESYNC support so that EXPUNGE notifications include `uid` instead of `seq`. + * + * @property {Number} [maxIdleTime] + * If set, breaks and restarts IDLE every `maxIdleTime` milliseconds. + * + * @property {String} [missingIdleCommand="NOOP"] + * Command to use if the server does not support IDLE. + * + * @property {Boolean} [disableBinary=false] + * If `true`, ignores the BINARY extension for FETCH and APPEND operations. + * + * @property {Boolean} [disableAutoEnable=false] + * If `true`, do not automatically enable supported IMAP extensions. + * + * @property {Number} [connectionTimeout=90000] + * Maximum time (in milliseconds) to wait for the connection to establish. Defaults to 90 seconds. + * + * @property {Number} [greetingTimeout=16000] + * Maximum time (in milliseconds) to wait for the server greeting after a connection is established. Defaults to 16 seconds. + * + * @property {Number} [socketTimeout=300000] + * Maximum period of inactivity (in milliseconds) before terminating the connection. Defaults to 5 minutes. */ + constructor(options) { super({ captureRejections: true }); @@ -277,10 +339,6 @@ class ImapFlow extends EventEmitter { */ this.idling = false; - /** - * If `true` then in addition of sending data to logger, ImapFlow emits 'log' events with the same data - * @type {Boolean} - */ this.emitLogs = !!this.options.emitLogs; // ordering number for emitted logs this.lo = 0; @@ -986,11 +1044,13 @@ class ImapFlow extends EventEmitter { this.expectCapabilityUpdate = true; + let loginMethod = (this.options.auth.loginMethod || '').toString().trim().toUpperCase(); + if (this.options.auth.accessToken) { this.authenticated = await this.run('AUTHENTICATE', this.options.auth.user, { accessToken: this.options.auth.accessToken }); } else if (this.options.auth.pass) { - if (this.capabilities.has('AUTH=LOGIN') || this.capabilities.has('AUTH=PLAIN')) { - this.authenticated = await this.run('AUTHENTICATE', this.options.auth.user, { password: this.options.auth.pass }); + if ((this.capabilities.has('AUTH=LOGIN') || this.capabilities.has('AUTH=PLAIN')) && loginMethod !== 'LOGIN') { + this.authenticated = await this.run('AUTHENTICATE', this.options.auth.user, { password: this.options.auth.pass, loginMethod }); } else { this.authenticated = await this.run('LOGIN', this.options.auth.user, this.options.auth.pass); } diff --git a/package-lock.json b/package-lock.json index 7b591e1..f4992cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "libqp": "2.1.1", "mailsplit": "5.4.2", "nodemailer": "6.9.16", - "pino": "9.5.0", + "pino": "9.6.0", "socks": "2.8.3" }, "devDependencies": { @@ -24,7 +24,7 @@ "@babel/eslint-plugin": "7.25.9", "@babel/plugin-syntax-class-properties": "7.12.13", "@babel/preset-env": "7.26.0", - "@types/node": "22.10.1", + "@types/node": "22.10.5", "eslint": "8.57.0", "eslint-config-nodemailer": "1.2.0", "eslint-config-prettier": "9.1.0", @@ -1566,9 +1566,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.3.tgz", - "integrity": "sha512-yTmc8J+Sj8yLzwr4PD5Xb/WF3bOYu2C2OoSZPzbuqRm4n98XirsbzaX+GloeO376UnSYIYJ4NCanwV5/ugZkwA==", + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", "dev": true, "license": "MIT", "dependencies": { @@ -1866,9 +1866,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", "dependencies": { @@ -1992,9 +1992,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", - "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", + "version": "22.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", + "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2002,9 +2002,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", "dev": true, "license": "ISC" }, @@ -2348,9 +2348,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "funding": [ { @@ -2368,9 +2368,9 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -2449,9 +2449,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001686", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz", - "integrity": "sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==", + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", "dev": true, "funding": [ { @@ -2660,9 +2660,9 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "license": "MIT", "dependencies": { @@ -2760,9 +2760,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.70", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.70.tgz", - "integrity": "sha512-P6FPqAWIZrC3sHDAwBitJBs7N7IF58m39XVny7DFseQXK2eiMn7nNQizFf63mWDDUnFvaqsM8FI0+ZZfLkdUGA==", + "version": "1.5.76", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", + "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", "dev": true, "license": "ISC" }, @@ -3187,9 +3187,9 @@ } }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", "dev": true, "license": "ISC", "dependencies": { @@ -4092,9 +4092,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { @@ -4485,9 +4485,9 @@ } }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -4936,9 +4936,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, "license": "MIT" }, @@ -5432,9 +5432,9 @@ } }, "node_modules/pino": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-9.5.0.tgz", - "integrity": "sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.6.0.tgz", + "integrity": "sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==", "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0", @@ -5735,6 +5735,19 @@ "regjsparser": "bin/parser" } }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -5776,19 +5789,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } diff --git a/package.json b/package.json index db9b419..8f7858e 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@babel/eslint-plugin": "7.25.9", "@babel/plugin-syntax-class-properties": "7.12.13", "@babel/preset-env": "7.26.0", - "@types/node": "22.10.1", + "@types/node": "22.10.5", "eslint": "8.57.0", "eslint-config-nodemailer": "1.2.0", "eslint-config-prettier": "9.1.0", @@ -53,7 +53,7 @@ "libqp": "2.1.1", "mailsplit": "5.4.2", "nodemailer": "6.9.16", - "pino": "9.5.0", + "pino": "9.6.0", "socks": "2.8.3" } }