`dns.lookup()` and `dnsPromises.lookup()` options type coercion

Aperta
#409 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 2 giorni

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
52/100
Tipo di issue
Funzionalità
Chiarezza
Abbastanza chiara
Stato di attività
Tranquilla
Stack tecnologico
node.js, typescript
Ambito
tooling

Direzione di ricerca

Inizia dai punti di ingresso del codemod per dns.lookup() e dnsPromises.lookup(), usando gli esempi dell’issue e il comportamento di DEP0153 come requisiti. Esamina la struttura e i test esistenti del codemod nel repository prima di implementare il supporto per entrambe le API; il lavoro è completo quando i valori non validi di family, hints, all e verbatim ricevono conversioni esplicite, mentre i valori nullish e quelli già validi rimangono invariati.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

good first issue human help wanted let's do it

Description

Since using non-proper types for options in dns.lookup() and dnsPromises.lookup() is deprecated (DEP0153) and has reached End-of-Life status in Node.js v18.0.0, we should provide a codemod to replace them.

  • The codemod should ensure family option is a nullish value or an integer.
  • The codemod should ensure hints option is a nullish value or a number.
  • The codemod should ensure all option is a nullish value or a boolean.
  • The codemod should ensure verbatim option is a nullish value or a boolean.
  • The codemod should add explicit type conversions where needed.

Additional Information

Note that in Node.js v18.0.0, passing non-proper types for dns.lookup options now throws an ERR_INVALID_ARG_TYPE error. This change enforces proper type usage:

  • family: must be undefined, null, or an integer (0, 4, or 6)
  • hints: must be undefined, null, or a number
  • all: must be undefined, null, or a boolean
  • verbatim: must be undefined, null, or a boolean

The automatic type coercion was removed to prevent unexpected behavior and make the API more predictable.

Examples

Example 1: String family option

Before:

const dns = require("node:dns");

dns.lookup("example.com", { family: "4" }, (err, address) => {
  console.log(address);
});

After:

const dns = require("node:dns");

dns.lookup("example.com", { family: 4 }, (err, address) => {
  console.log(address);
});
Example 2: String all option

Before:

const dns = require("node:dns");

dns.lookup("example.com", { all: "true" }, (err, addresses) => {
  console.log(addresses);
});

After:

const dns = require("node:dns");

dns.lookup("example.com", { all: true }, (err, addresses) => {
  console.log(addresses);
});
Example 3: Number verbatim option

Before:

const dns = require("node:dns");

dns.lookup("example.com", { verbatim: 1 }, (err, address) => {
  console.log(address);
});

After:

const dns = require("node:dns");

dns.lookup("example.com", { verbatim: true }, (err, address) => {
  console.log(address);
});
Example 4: Promises API with string family

Before:

const { lookup } = require("node:dns").promises;

const address = await lookup("example.com", { family: "6" });

After:

const { lookup } = require("node:dns").promises;

const address = await lookup("example.com", { family: 6 });
Example 5: ESM with multiple invalid options

Before:

import { lookup } from "node:dns/promises";

const result = await lookup("example.com", {
  family: "4",
  all: 1,
  verbatim: 0
});

After:

import { lookup } from "node:dns/promises";

const result = await lookup("example.com", {
  family: 4,
  all: true,
  verbatim: false
});
Example 6: Dynamic family value

Before:

const dns = require("node:dns");

const familyStr = "4";
dns.lookup("example.com", { family: familyStr }, callback);

After:

const dns = require("node:dns");

const familyStr = "4";
dns.lookup("example.com", { family: parseInt(familyStr, 10) }, callback);
Example 7: Hints option with string

Before:

const dns = require("node:dns");

dns.lookup("example.com", { hints: "0" }, (err, address) => {
  console.log(address);
});

After:

const dns = require("node:dns");

dns.lookup("example.com", { hints: 0 }, (err, address) => {
  console.log(address);
});
Example 8: Valid options (no change needed)

Before:

const dns = require("node:dns");

dns.lookup("example.com", {
  family: 4,
  hints: dns.ADDRCONFIG,
  all: false,
  verbatim: true
}, (err, address) => {
  console.log(address);
});

After:

const dns = require("node:dns");

dns.lookup("example.com", {
  family: 4,
  hints: dns.ADDRCONFIG,
  all: false,
  verbatim: true
}, (err, address) => {
  console.log(address);
});
Example 9: Null and undefined values (no change needed)

Before:

const dns = require("node:dns");

dns.lookup("example.com", {
  family: undefined,
  all: null,
  verbatim: undefined
}, callback);

After:

const dns = require("node:dns");

dns.lookup("example.com", {
  family: undefined,
  all: null,
  verbatim: undefined
}, callback);

Refs

Lingua principale
TypeScript
Stelle
85
Fork
58
Merge medio
1g 21h
PR unite (30g)
8

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di nodejs/userland-migrations

Tutte le issue di nodejs/userland-migrations

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.