diff --git a/doc/api/deprecations.md b/doc/api/deprecations.md index e25e855c085e9b..c0f1d38d555215 100644 --- a/doc/api/deprecations.md +++ b/doc/api/deprecations.md @@ -2789,12 +2789,15 @@ deprecated and should no longer be used. ### DEP0153: `dns.lookup` and `dnsPromises.lookup` options type coercion -Type: Documentation-only +Type: Runtime Using a non-nullish non-integer value for `family` option, a non-nullish non-number value for `hints` option, a non-nullish non-boolean value for `all` diff --git a/lib/dns.js b/lib/dns.js index 4eadbd04158707..58492be9ba288a 100644 --- a/lib/dns.js +++ b/lib/dns.js @@ -41,6 +41,7 @@ const { Resolver, validateHints, emitInvalidHostnameWarning, + emitTypeCoercionDeprecationWarning, getDefaultVerbatim, setDefaultResultOrder, } = require('internal/dns/utils'); @@ -112,15 +113,29 @@ function lookup(hostname, options, callback) { validateCallback(callback); if (options !== null && typeof options === 'object') { + if (options.hints != null && typeof options.hints !== 'number') { + emitTypeCoercionDeprecationWarning(); + } hints = options.hints >>> 0; + if (options.family != null && typeof options.family !== 'number') { + emitTypeCoercionDeprecationWarning(); + } family = options.family >>> 0; + if (options.all != null && typeof options.all !== 'boolean') { + emitTypeCoercionDeprecationWarning(); + } all = options.all === true; if (typeof options.verbatim === 'boolean') { verbatim = options.verbatim === true; + } else if (options.verbatim != null) { + emitTypeCoercionDeprecationWarning(); } validateHints(hints); } else { + if (options != null && typeof options !== 'number') { + emitTypeCoercionDeprecationWarning(); + } family = options >>> 0; } } diff --git a/lib/internal/dns/promises.js b/lib/internal/dns/promises.js index e32b6a1dcd9d19..96330ecd600822 100644 --- a/lib/internal/dns/promises.js +++ b/lib/internal/dns/promises.js @@ -14,6 +14,7 @@ const { validateTimeout, validateTries, emitInvalidHostnameWarning, + emitTypeCoercionDeprecationWarning, getDefaultVerbatim, } = require('internal/dns/utils'); const { codes, dnsException } = require('internal/errors'); @@ -110,15 +111,29 @@ function lookup(hostname, options) { if (hostname && typeof hostname !== 'string') { throw new ERR_INVALID_ARG_TYPE('hostname', 'string', hostname); } else if (options !== null && typeof options === 'object') { + if (options.hints != null && typeof options.hints !== 'number') { + emitTypeCoercionDeprecationWarning(); + } hints = options.hints >>> 0; + if (options.family != null && typeof options.family !== 'number') { + emitTypeCoercionDeprecationWarning(); + } family = options.family >>> 0; + if (options.all != null && typeof options.all !== 'boolean') { + emitTypeCoercionDeprecationWarning(); + } all = options.all === true; if (typeof options.verbatim === 'boolean') { verbatim = options.verbatim === true; + } else if (options.verbatim != null) { + emitTypeCoercionDeprecationWarning(); } validateHints(hints); } else { + if (options != null && typeof options !== 'number') { + emitTypeCoercionDeprecationWarning(); + } family = options >>> 0; } diff --git a/lib/internal/dns/utils.js b/lib/internal/dns/utils.js index 28109367e36c5a..0d0a694077e1ac 100644 --- a/lib/internal/dns/utils.js +++ b/lib/internal/dns/utils.js @@ -193,6 +193,18 @@ function emitInvalidHostnameWarning(hostname) { ); } +let typeCoercionWarningEmitted = false; +function emitTypeCoercionDeprecationWarning() { + if (!typeCoercionWarningEmitted) { + process.emitWarning( + 'Type coercion of dns.lookup options is deprecated', + 'DeprecationWarning', + 'DEP0153' + ); + typeCoercionWarningEmitted = true; + } +} + let dnsOrder = getOptionValue('--dns-result-order') || 'verbatim'; function getDefaultVerbatim() { @@ -213,6 +225,7 @@ module.exports = { validateTries, Resolver, emitInvalidHostnameWarning, + emitTypeCoercionDeprecationWarning, getDefaultVerbatim, setDefaultResultOrder, }; diff --git a/test/internet/test-dns-lookup.js b/test/internet/test-dns-lookup.js index 6939698d392317..6efa946f9d7522 100644 --- a/test/internet/test-dns-lookup.js +++ b/test/internet/test-dns-lookup.js @@ -44,3 +44,18 @@ dns.lookup(addresses.NOT_FOUND, { assert.strictEqual(error.syscall, 'getaddrinfo'); assert.strictEqual(error.hostname, addresses.NOT_FOUND); })); + +common.expectWarning('DeprecationWarning', + 'Type coercion of dns.lookup options is deprecated', + 'DEP0153'); + +assert.rejects( + dnsPromises.lookup(addresses.NOT_FOUND, { + family: 'IPv4', + all: 'all' + }), + { + code: 'ENOTFOUND', + message: `getaddrinfo ENOTFOUND ${addresses.NOT_FOUND}` + } +);