Skip to content

Commit fde2ba6

Browse files
authored
fix: support node: prefix (#109)
1 parent 23ae475 commit fde2ba6

File tree

13 files changed

+258
-17
lines changed

13 files changed

+258
-17
lines changed

lib/rules/no-deprecated-api.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ const {
1313
const enumeratePropertyNames = require("../util/enumerate-property-names")
1414
const getConfiguredNodeVersion = require("../util/get-configured-node-version")
1515
const getSemverRange = require("../util/get-semver-range")
16+
const extendTrackmapWithNodePrefix = require("../util/extend-trackmap-with-node-prefix")
17+
const unprefixNodeColon = require("../util/unprefix-node-colon")
1618

17-
const modules = {
19+
const rawModules = {
1820
_linklist: {
1921
[READ]: { since: "5.0.0", replacedBy: null },
2022
},
@@ -567,6 +569,8 @@ const modules = {
567569
},
568570
},
569571
}
572+
const modules = extendTrackmapWithNodePrefix(rawModules)
573+
570574
const globals = {
571575
Buffer: {
572576
[CONSTRUCT]: {
@@ -660,7 +664,7 @@ function toReplaceMessage(replacedBy, version) {
660664
* @returns {string} The name.
661665
*/
662666
function toName(type, path) {
663-
const baseName = path.join(".")
667+
const baseName = unprefixNodeColon(path.join("."))
664668
return type === ReferenceTracker.CALL
665669
? `${baseName}()`
666670
: type === ReferenceTracker.CONSTRUCT
@@ -701,7 +705,9 @@ module.exports = {
701705
ignoreModuleItems: {
702706
type: "array",
703707
items: {
704-
enum: Array.from(enumeratePropertyNames(modules)),
708+
enum: Array.from(
709+
enumeratePropertyNames(rawModules)
710+
),
705711
},
706712
additionalItems: false,
707713
uniqueItems: true,

lib/rules/no-unsupported-features/node-builtins.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const {
1111
} = require("../../util/check-unsupported-builtins")
1212
const enumeratePropertyNames = require("../../util/enumerate-property-names")
1313
const getConfiguredNodeVersion = require("../../util/get-configured-node-version")
14+
const extendTrackMapWithNodePrefix = require("../../util/extend-trackmap-with-node-prefix")
1415

1516
const trackMap = {
1617
globals: {
@@ -368,6 +369,9 @@ Object.assign(trackMap.globals, {
368369
console: trackMap.modules.console,
369370
process: trackMap.modules.process,
370371
})
372+
373+
trackMap.modules = extendTrackMapWithNodePrefix(trackMap.modules)
374+
371375
/*eslint-enable camelcase */
372376

373377
module.exports = {

lib/rules/prefer-promises/dns.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const trackMap = {
3232
setServers: { [CALL]: true },
3333
},
3434
}
35+
trackMap["node:dns"] = trackMap.dns
3536

3637
module.exports = {
3738
meta: {

lib/rules/prefer-promises/fs.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const trackMap = {
3434
readFile: { [CALL]: true },
3535
},
3636
}
37+
trackMap["node:fs"] = trackMap.fs
3738

3839
module.exports = {
3940
meta: {

lib/util/check-prefer-global.js

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"use strict"
66

77
const { ReferenceTracker } = require("@eslint-community/eslint-utils")
8+
const extendTrackmapWithNodePrefix = require("./extend-trackmap-with-node-prefix")
89

910
/**
1011
* Verifier for `prefer-global/*` rules.
@@ -34,15 +35,7 @@ class Verifier {
3435
mode: "legacy",
3536
})
3637

37-
const modules = {
38-
...trackMap.modules,
39-
...Object.fromEntries(
40-
Object.entries(trackMap.modules).map(([name, value]) => [
41-
`node:${name}`,
42-
value,
43-
])
44-
),
45-
}
38+
const modules = extendTrackmapWithNodePrefix(trackMap.modules)
4639

4740
for (const { node } of [
4841
...tracker.iterateCjsReferences(modules),

lib/util/check-unsupported-builtins.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const { Range, lt, major } = require("semver") // eslint-disable-line no-unused-
88
const { ReferenceTracker } = require("@eslint-community/eslint-utils")
99
const getConfiguredNodeVersion = require("./get-configured-node-version")
1010
const getSemverRange = require("./get-semver-range")
11+
const unprefixNodeColon = require("./unprefix-node-colon")
1112

1213
/**
1314
* @typedef {Object} SupportInfo
@@ -92,7 +93,7 @@ module.exports.checkUnsupportedBuiltins = function checkUnsupportedBuiltins(
9293
]
9394

9495
for (const { node, path, info } of references) {
95-
const name = path.join(".")
96+
const name = unprefixNodeColon(path.join("."))
9697
const supported = isSupported(info, options.version)
9798

9899
if (!supported && !options.ignores.has(name)) {

lib/util/enumerate-property-names.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"use strict"
66

77
const { CALL, CONSTRUCT, READ } = require("@eslint-community/eslint-utils")
8+
const unprefixNodeColon = require("./unprefix-node-colon")
89

910
/**
1011
* Enumerate property names of a given object recursively.
@@ -18,17 +19,17 @@ function* enumeratePropertyNames(trackMap, path = []) {
1819
if (typeof value !== "object") {
1920
continue
2021
}
21-
2222
path.push(key)
2323

24+
const name = unprefixNodeColon(path.join("."))
2425
if (value[CALL]) {
25-
yield `${path.join(".")}()`
26+
yield `${name}()`
2627
}
2728
if (value[CONSTRUCT]) {
28-
yield `new ${path.join(".")}()`
29+
yield `new ${name}()`
2930
}
3031
if (value[READ]) {
31-
yield path.join(".")
32+
yield name
3233
}
3334
yield* enumeratePropertyNames(value, path)
3435

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"use strict"
2+
3+
const isCoreModule = require("is-core-module")
4+
5+
/**
6+
* Extend trackMap.modules with `node:` prefixed modules
7+
* @param {Object} modules Like `{assert: foo}`
8+
* @returns {Object} Like `{assert: foo}, "node:assert": foo}`
9+
*/
10+
module.exports = function extendTrackMapWithNodePrefix(modules) {
11+
const ret = {
12+
...modules,
13+
...Object.fromEntries(
14+
Object.entries(modules)
15+
.map(([name, value]) => [`node:${name}`, value])
16+
// Note: "999" arbitrary to check current/future Node.js version
17+
.filter(([name]) => isCoreModule(name, "999"))
18+
),
19+
}
20+
return ret
21+
}

lib/util/unprefix-node-colon.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
"use strict"
2+
3+
/**
4+
* Remove `node:` prefix from module name
5+
* @param {string} name The module name such as `node:assert` or `assert`.
6+
* @returns {string} The unprefixed module name like `assert`.
7+
*/
8+
module.exports = function unprefixNodeColon(name) {
9+
if (name.startsWith("node:")) {
10+
return name.slice(5)
11+
}
12+
return name
13+
}

tests/lib/rules/no-deprecated-api.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ ruleTester.run("no-deprecated-api", rule, {
1414
code: "require('buffer').Buffer",
1515
env: { node: true },
1616
},
17+
{
18+
code: "require('node:buffer').Buffer",
19+
env: { node: true },
20+
},
1721
{
1822
code: "foo(require('buffer').Buffer)",
1923
env: { node: true },
@@ -93,6 +97,16 @@ ruleTester.run("no-deprecated-api", rule, {
9397
],
9498
env: { node: true },
9599
},
100+
{
101+
code: "require('node:buffer').Buffer()",
102+
options: [
103+
{
104+
//
105+
ignoreModuleItems: ["buffer.Buffer()"],
106+
},
107+
],
108+
env: { node: true },
109+
},
96110
{
97111
code: "require('domain');",
98112
options: [
@@ -189,6 +203,14 @@ ruleTester.run("no-deprecated-api", rule, {
189203
"'new buffer.Buffer()' was deprecated since v6.0.0. Use 'buffer.Buffer.alloc()' or 'buffer.Buffer.from()' instead.",
190204
],
191205
},
206+
{
207+
code: "new (require('node:buffer').Buffer)()",
208+
options: [{ version: "6.0.0" }],
209+
env: { node: true },
210+
errors: [
211+
"'new buffer.Buffer()' was deprecated since v6.0.0. Use 'buffer.Buffer.alloc()' or 'buffer.Buffer.from()' instead.",
212+
],
213+
},
192214
{
193215
code: "require('buffer').Buffer()",
194216
options: [{ version: "6.0.0" }],
@@ -197,6 +219,14 @@ ruleTester.run("no-deprecated-api", rule, {
197219
"'buffer.Buffer()' was deprecated since v6.0.0. Use 'buffer.Buffer.alloc()' or 'buffer.Buffer.from()' instead.",
198220
],
199221
},
222+
{
223+
code: "require('node:buffer').Buffer()",
224+
options: [{ version: "6.0.0" }],
225+
env: { node: true },
226+
errors: [
227+
"'buffer.Buffer()' was deprecated since v6.0.0. Use 'buffer.Buffer.alloc()' or 'buffer.Buffer.from()' instead.",
228+
],
229+
},
200230
{
201231
code: "var b = require('buffer'); new b.Buffer()",
202232
options: [{ version: "6.0.0" }],
@@ -278,6 +308,14 @@ ruleTester.run("no-deprecated-api", rule, {
278308
"'buffer.SlowBuffer' was deprecated since v6.0.0. Use 'buffer.Buffer.allocUnsafeSlow()' instead.",
279309
],
280310
},
311+
{
312+
code: "require('node:buffer').SlowBuffer",
313+
options: [{ version: "6.0.0" }],
314+
env: { node: true },
315+
errors: [
316+
"'buffer.SlowBuffer' was deprecated since v6.0.0. Use 'buffer.Buffer.allocUnsafeSlow()' instead.",
317+
],
318+
},
281319
{
282320
code: "var b = require('buffer'); b.SlowBuffer",
283321
options: [{ version: "6.0.0" }],
@@ -713,6 +751,15 @@ ruleTester.run("no-deprecated-api", rule, {
713751
"'new buffer.Buffer()' was deprecated since v6.0.0. Use 'buffer.Buffer.alloc()' or 'buffer.Buffer.from()' instead.",
714752
],
715753
},
754+
{
755+
code: "import b from 'node:buffer'; new b.Buffer()",
756+
options: [{ version: "6.0.0" }],
757+
parserOptions: { sourceType: "module" },
758+
env: { es6: true },
759+
errors: [
760+
"'new buffer.Buffer()' was deprecated since v6.0.0. Use 'buffer.Buffer.alloc()' or 'buffer.Buffer.from()' instead.",
761+
],
762+
},
716763
{
717764
code: "import * as b from 'buffer'; new b.Buffer()",
718765
options: [{ version: "6.0.0" }],

0 commit comments

Comments
 (0)