Skip to content

Commit 2a50d0b

Browse files
committed
feat(prefer-promises): Add support for process.getBuiltinModule()
1 parent 002ac9c commit 2a50d0b

File tree

5 files changed

+102
-0
lines changed

5 files changed

+102
-0
lines changed

lib/rules/prefer-promises/dns.js

+7
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ const {
1010
ReferenceTracker,
1111
} = require("@eslint-community/eslint-utils")
1212
const { getScope } = require("../../util/eslint-compat")
13+
const {
14+
iterateProcessGetBuiltinModuleReferences,
15+
} = require("../../util/iterate-process-get-builtin-module-references")
1316

1417
/** @type {import('@eslint-community/eslint-utils').TraceMap<boolean>} */
1518
const dns = {
@@ -63,6 +66,10 @@ module.exports = {
6366
const tracker = new ReferenceTracker(scope, { mode: "legacy" })
6467
const references = [
6568
...tracker.iterateCjsReferences(traceMap),
69+
...iterateProcessGetBuiltinModuleReferences(
70+
tracker,
71+
traceMap
72+
),
6673
...tracker.iterateEsmReferences(traceMap),
6774
]
6875

lib/rules/prefer-promises/fs.js

+7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
const { CALL, ReferenceTracker } = require("@eslint-community/eslint-utils")
88
const { getScope } = require("../../util/eslint-compat")
9+
const {
10+
iterateProcessGetBuiltinModuleReferences,
11+
} = require("../../util/iterate-process-get-builtin-module-references")
912

1013
/** @type {import('@eslint-community/eslint-utils').TraceMap<boolean>} */
1114
const traceMap = {
@@ -61,6 +64,10 @@ module.exports = {
6164
const tracker = new ReferenceTracker(scope, { mode: "legacy" })
6265
const references = [
6366
...tracker.iterateCjsReferences(traceMap),
67+
...iterateProcessGetBuiltinModuleReferences(
68+
tracker,
69+
traceMap
70+
),
6471
...tracker.iterateEsmReferences(traceMap),
6572
]
6673

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
"use strict"
2+
const {
3+
CALL,
4+
getStringIfConstant,
5+
READ,
6+
} = require("@eslint-community/eslint-utils")
7+
const processGetBuiltinModuleCall = {
8+
process: {
9+
getBuiltinModule: {
10+
[CALL]: true,
11+
},
12+
},
13+
}
14+
/**
15+
* Iterate the references of process.getBuiltinModule() modules.
16+
* @template Info
17+
* @param {import("@eslint-community/eslint-utils").ReferenceTracker} tracker The reference tracker.
18+
* @param {import("@eslint-community/eslint-utils").TraceMap<Info>} traceMap The trace map.
19+
* @returns {IterableIterator<import("@eslint-community/eslint-utils").Reference<Info>>} The iterator.
20+
*/
21+
function* iterateProcessGetBuiltinModuleReferences(tracker, traceMap) {
22+
for (const { node } of tracker.iterateGlobalReferences(
23+
processGetBuiltinModuleCall
24+
)) {
25+
if (node.type !== "CallExpression") continue
26+
const key = node.arguments[0] && getStringIfConstant(node.arguments[0])
27+
if (key == null) {
28+
continue
29+
}
30+
const nextTraceMap = Object.hasOwn(traceMap, key) && traceMap[key]
31+
if (!nextTraceMap) {
32+
continue
33+
}
34+
35+
if (nextTraceMap[READ]) {
36+
yield {
37+
node,
38+
path: [key],
39+
type: READ,
40+
info: nextTraceMap[READ],
41+
}
42+
}
43+
44+
for (const ref of tracker.iteratePropertyReferences(
45+
node,
46+
nextTraceMap
47+
)) {
48+
yield {
49+
...ref,
50+
path: [key, ...ref.path],
51+
}
52+
}
53+
}
54+
}
55+
56+
module.exports = { iterateProcessGetBuiltinModuleReferences }

tests/lib/rules/prefer-promises/dns.js

+16
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ new RuleTester({
2222
"import * as dns from 'dns'; dns.promises.lookup()",
2323
"import {promises} from 'dns'; promises.lookup()",
2424
"import {promises as dns} from 'dns'; dns.lookup()",
25+
"const dns = process.getBuiltinModule('dns'); dns.promises.lookup()",
26+
"const dns = process.getBuiltinModule('node:dns'); dns.promises.lookup()",
27+
"const {promises} = process.getBuiltinModule('dns'); promises.lookup()",
28+
"const {promises: dns} = process.getBuiltinModule('dns'); dns.lookup()",
2529
],
2630
invalid: [
2731
{
@@ -52,6 +56,18 @@ new RuleTester({
5256
code: "import {lookup} from 'dns'; lookup()",
5357
errors: [{ messageId: "preferPromises", data: { name: "lookup" } }],
5458
},
59+
{
60+
code: "const dns = process.getBuiltinModule('dns'); dns.lookup()",
61+
errors: [{ messageId: "preferPromises", data: { name: "lookup" } }],
62+
},
63+
{
64+
code: "const dns = process.getBuiltinModule('node:dns'); dns.lookup()",
65+
errors: [{ messageId: "preferPromises", data: { name: "lookup" } }],
66+
},
67+
{
68+
code: "const {lookup} = process.getBuiltinModule('dns'); lookup()",
69+
errors: [{ messageId: "preferPromises", data: { name: "lookup" } }],
70+
},
5571

5672
// Other members
5773
{

tests/lib/rules/prefer-promises/fs.js

+16
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ new RuleTester({
2323
"import * as fs from 'fs'; fs.promises.access()",
2424
"import {promises} from 'fs'; promises.access()",
2525
"import {promises as fs} from 'fs'; fs.access()",
26+
"const fs = process.getBuiltinModule('fs'); fs.promises.access()",
27+
"const fs = process.getBuiltinModule('node:fs'); fs.promises.access()",
28+
"const {promises} = process.getBuiltinModule('fs'); promises.access()",
29+
"const {promises: fs} = process.getBuiltinModule('fs'); fs.access()",
2630
],
2731
invalid: [
2832
{
@@ -53,6 +57,18 @@ new RuleTester({
5357
code: "import {access} from 'fs'; access()",
5458
errors: [{ messageId: "preferPromises", data: { name: "access" } }],
5559
},
60+
{
61+
code: "const fs = process.getBuiltinModule('fs'); fs.access()",
62+
errors: [{ messageId: "preferPromises", data: { name: "access" } }],
63+
},
64+
{
65+
code: "const fs = process.getBuiltinModule('node:fs'); fs.access()",
66+
errors: [{ messageId: "preferPromises", data: { name: "access" } }],
67+
},
68+
{
69+
code: "const {access} = process.getBuiltinModule('fs'); access()",
70+
errors: [{ messageId: "preferPromises", data: { name: "access" } }],
71+
},
5672

5773
// Other members
5874
{

0 commit comments

Comments
 (0)