Skip to content

Commit 17c8ae0

Browse files
committed
Update: fix no-deprecated-api about modules which are hiding core modules (fixes #65)
1 parent 91ebdf4 commit 17c8ae0

File tree

7 files changed

+70
-8
lines changed

7 files changed

+70
-8
lines changed

docs/rules/no-deprecated-api.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ This rule has 2 options.
9393
"rules": {
9494
"node/no-deprecated-api": ["error", {
9595
"ignoreModuleItems": [],
96-
"ignoreGlobalItems": []
96+
"ignoreGlobalItems": [],
97+
"ignoreIndirectDependencies": false
9798
}]
9899
}
99100
}
@@ -184,6 +185,12 @@ Examples of :+1: **correct** code for the `{"ignoreGlobalItems": ["new Buffer()"
184185
const data = new Buffer(10) // OK since it's in ignoreGlobalItems.
185186
```
186187

188+
### ignoreIndirectDependencies
189+
190+
If `ignoreIndirectDependencies: true`, this rule ignores deprecated APIs if your module depends on third-party modules which have the same name as core modules indirectly. Default is `false`.
191+
192+
If your module depends on such third-party modules directly (explicitly), this rule always ignores deprecated APIs of those.
193+
187194
## Known Limitations
188195

189196
This rule cannot report the following cases:

lib/rules/no-deprecated-api.js

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const dirname = require("path").dirname
1414
const assign = require("object-assign")
1515
const resolve = require("resolve").sync
1616
const deprecatedApis = require("../util/deprecated-apis")
17+
const getPackageJson = require("../util/get-package-json")
1718
const getValueIfString = require("../util/get-value-if-string")
1819

1920
//------------------------------------------------------------------------------
@@ -194,6 +195,7 @@ function create(context) {
194195
const options = context.options[0] || {}
195196
const ignoredModuleItems = options.ignoreModuleItems || []
196197
const ignoredGlobalItems = options.ignoreGlobalItems || []
198+
const ignoreIndirectDependencies = Boolean(options.ignoreIndirectDependencies)
197199
let globalScope = null
198200

199201
/**
@@ -204,15 +206,29 @@ function create(context) {
204206
* @returns {boolean} `true` if the third party module existed.
205207
*/
206208
function isThirdPartyInstalled(moduleId) {
207-
try {
208-
const fileName = context.getFilename()
209-
if (fileName !== "<input>") {
209+
const fileName = context.getFilename()
210+
if (fileName !== "<input>") {
211+
if (ignoreIndirectDependencies) {
210212
const basedir = dirname(fileName)
211-
return resolve(moduleId, {basedir}) !== moduleId
213+
try {
214+
return resolve(moduleId, {basedir}) !== moduleId
215+
}
216+
catch (_err) {
217+
// ignore
218+
}
219+
}
220+
else {
221+
const packageInfo = getPackageJson(fileName)
222+
const deps = packageInfo && packageInfo.dependencies
223+
const devDeps = packageInfo && packageInfo.devDependencies
224+
225+
/*eslint-disable no-prototype-builtins */
226+
return Boolean(
227+
(deps && deps.hasOwnProperty(moduleId)) ||
228+
(devDeps && devDeps.hasOwnProperty(moduleId))
229+
)
230+
/*eslint-enable */
212231
}
213-
}
214-
catch (_err) {
215-
// ignore
216232
}
217233

218234
return false
@@ -595,6 +611,9 @@ module.exports = {
595611
additionalItems: false,
596612
uniqueItems: true,
597613
},
614+
ignoreIndirectDependencies: { //
615+
type: "boolean",
616+
},
598617
},
599618
additionalProperties: false,
600619
},

tests/fixtures/no-deprecated-api/indirect-thirdparty/node_modules/domain.js

Whitespace-only changes.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"dependencies": {
3+
}
4+
}

tests/fixtures/no-deprecated-api/indirect-thirdparty/test.js

Whitespace-only changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"dependencies": {
3+
"domain": "0.0.0"
4+
}
5+
}

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ const NO_THIRD_PERTY = path.resolve(
2626
__dirname,
2727
"../../fixtures/no-deprecated-api/no-thirdparty/test.js"
2828
)
29+
const INDIRECT_THIRD_PERTY = path.resolve(
30+
__dirname,
31+
"../../fixtures/no-deprecated-api/indirect-thirdparty/test.js"
32+
)
2933

3034
//------------------------------------------------------------------------------
3135
// Tests
@@ -161,6 +165,14 @@ ruleTester.run("no-deprecated-api", rule, {
161165
ignoreGlobalItems: ["process.env.NODE_REPL_HISTORY_FILE"],
162166
}],
163167
},
168+
169+
// https://github.com/mysticatea/eslint-plugin-node/issues/65
170+
{
171+
filename: INDIRECT_THIRD_PERTY,
172+
code: "require(\"domain\")",
173+
env: {node: true},
174+
options: [{ignoreIndirectDependencies: true}],
175+
},
164176
],
165177
invalid: [
166178
//----------------------------------------------------------------------
@@ -446,6 +458,21 @@ ruleTester.run("no-deprecated-api", rule, {
446458
errors: ["'util._extend' was deprecated since v6. Use 'Object.assign()' instead."],
447459
},
448460

461+
// https://github.com/mysticatea/eslint-plugin-node/issues/65
462+
{
463+
filename: INDIRECT_THIRD_PERTY,
464+
code: "require(\"domain\")",
465+
env: {node: true},
466+
errors: ["'domain' module was deprecated since v4."],
467+
},
468+
{
469+
filename: INDIRECT_THIRD_PERTY,
470+
code: "require(\"domain\")",
471+
env: {node: true},
472+
options: [{ignoreIndirectDependencies: false}],
473+
errors: ["'domain' module was deprecated since v4."],
474+
},
475+
449476
// ES2015 Modules
450477
{
451478
code: "import b from 'buffer'; new b.Buffer()",

0 commit comments

Comments
 (0)