Skip to content

Commit eea5c71

Browse files
committed
refactor: eslint v8 compat
it makes easier for us to drop eslint v8.
1 parent 308c80c commit eea5c71

16 files changed

+85
-54
lines changed

lib/rules/callback-return.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* See LICENSE file in root directory for full license.
44
*/
55
"use strict"
6+
const { getSourceCode } = require("../util/eslint-compat")
67

78
/** @type {import('eslint').Rule.RuleModule} */
89
module.exports = {
@@ -27,7 +28,7 @@ module.exports = {
2728

2829
create(context) {
2930
const callbacks = context.options[0] || ["callback", "cb", "next"]
30-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
31+
const sourceCode = getSourceCode(context)
3132

3233
/**
3334
* Find the closest parent matching a list of types.

lib/rules/exports-style.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"use strict"
66

77
const { hasParentNode } = require("../util/has-parent-node.js")
8+
const { getSourceCode, getScope } = require("../util/eslint-compat")
89

910
/*istanbul ignore next */
1011
/**
@@ -302,7 +303,7 @@ module.exports = {
302303
const batchAssignAllowed = Boolean(
303304
context.options[1] != null && context.options[1].allowBatchAssign
304305
)
305-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
306+
const sourceCode = getSourceCode(context)
306307

307308
/**
308309
* Gets the location info of reports.
@@ -426,8 +427,8 @@ module.exports = {
426427
}
427428

428429
return {
429-
"Program:exit"(node) {
430-
const scope = sourceCode.getScope?.(node) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
430+
"Program:exit"() {
431+
const scope = getScope(context)
431432

432433
switch (mode) {
433434
case "module.exports":

lib/rules/global-require.js

+6-12
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
*/
55
"use strict"
66

7+
const { getScope, getAncestors } = require("../util/eslint-compat")
8+
79
const ACCEPTABLE_PARENTS = [
810
"AssignmentExpression",
911
"VariableDeclarator",
@@ -59,26 +61,18 @@ module.exports = {
5961
},
6062

6163
create(context) {
62-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
63-
6464
return {
6565
CallExpression(node) {
66-
const currentScope =
67-
sourceCode.getScope?.(node) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
66+
const currentScope = getScope(context, node)
6867

6968
if (
7069
node.callee.type === "Identifier" &&
7170
node.callee.name === "require" &&
7271
!isShadowed(currentScope, node.callee)
7372
) {
74-
const isGoodRequire = (
75-
sourceCode.getAncestors?.(node) ??
76-
context.getAncestors()
77-
) // TODO: remove context.getAncestors() when dropping support for ESLint < v9
78-
.every(
79-
parent =>
80-
ACCEPTABLE_PARENTS.indexOf(parent.type) > -1
81-
)
73+
const isGoodRequire = getAncestors(context, node).every(
74+
parent => ACCEPTABLE_PARENTS.indexOf(parent.type) > -1
75+
)
8276

8377
if (!isGoodRequire) {
8478
context.report({ node, messageId: "unexpected" })

lib/rules/handle-callback-err.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
*/
55
"use strict"
66

7+
const { getScope } = require("../util/eslint-compat")
8+
79
/** @type {import('eslint').Rule.RuleModule} */
810
module.exports = {
911
meta: {
@@ -25,7 +27,6 @@ module.exports = {
2527
},
2628

2729
create(context) {
28-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
2930
const errorArgument = context.options[0] || "err"
3031

3132
/**
@@ -71,7 +72,7 @@ module.exports = {
7172
* @returns {void}
7273
*/
7374
function checkForError(node) {
74-
const scope = sourceCode.getScope?.(node) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
75+
const scope = getScope(context, node)
7576
const parameters = getParameters(scope)
7677
const firstParameter = parameters[0]
7778

lib/rules/hashbang.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const getConvertPath = require("../util/get-convert-path")
1111
const { getPackageJson } = require("../util/get-package-json")
1212
const getNpmignore = require("../util/get-npmignore")
1313
const { isBinFile } = require("../util/is-bin-file")
14+
const { getSourceCode } = require("../util/eslint-compat")
1415

1516
const ENV_SHEBANG = "#!/usr/bin/env"
1617
const NODE_SHEBANG = `${ENV_SHEBANG} {{executableName}}\n`
@@ -119,7 +120,7 @@ module.exports = {
119120
},
120121
},
121122
create(context) {
122-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
123+
const sourceCode = getSourceCode(context)
123124
const filePath = context.filename ?? context.getFilename()
124125
if (filePath === "<input>") {
125126
return {}

lib/rules/no-deprecated-api.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const getConfiguredNodeVersion = require("../util/get-configured-node-version")
1515
const getSemverRange = require("../util/get-semver-range")
1616
const extendTrackmapWithNodePrefix = require("../util/extend-trackmap-with-node-prefix")
1717
const unprefixNodeColon = require("../util/unprefix-node-colon")
18+
const { getScope } = require("../util/eslint-compat")
1819

1920
/** @typedef {import('../unsupported-features/types.js').DeprecatedInfo} DeprecatedInfo */
2021
/**
@@ -820,10 +821,9 @@ module.exports = {
820821
})
821822
}
822823

823-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
824824
return {
825-
"Program:exit"(node) {
826-
const scope = sourceCode.getScope?.(node) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
825+
"Program:exit"() {
826+
const scope = getScope(context)
827827

828828
const tracker = new ReferenceTracker(scope, {
829829
mode: "legacy",

lib/rules/no-exports-assign.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"use strict"
66

77
const { findVariable } = require("@eslint-community/eslint-utils")
8+
const { getScope } = require("../util/eslint-compat")
89

910
/**
1011
* @param {import('estree').Node} node
@@ -61,11 +62,9 @@ module.exports = {
6162
type: "problem",
6263
},
6364
create(context) {
64-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
65-
6665
return {
6766
AssignmentExpression(node) {
68-
const scope = sourceCode.getScope?.(node) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
67+
const scope = getScope(context)
6968

7069
if (
7170
!isExports(node.left, scope) ||

lib/rules/no-path-concat.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const {
1111
getStringIfConstant,
1212
} = require("@eslint-community/eslint-utils")
1313
const { hasParentNode } = require("../util/has-parent-node.js")
14+
const {getSourceCode} = require("../util/eslint-compat")
1415

1516
/**
1617
* Get the first char of the specified template element.
@@ -195,7 +196,7 @@ module.exports = {
195196
create(context) {
196197
return {
197198
"Program:exit"(programNode) {
198-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
199+
const sourceCode = getSourceCode(context)
199200
const globalScope =
200201
sourceCode.getScope?.(programNode) ?? context.getScope()
201202
const tracker = new ReferenceTracker(globalScope)

lib/rules/no-unsupported-features/es-syntax.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const rangeSubset = require("semver/ranges/subset")
1010
const getConfiguredNodeVersion = require("../../util/get-configured-node-version")
1111
const getSemverRange = require("../../util/get-semver-range")
1212
const mergeVisitorsInPlace = require("../../util/merge-visitors-in-place")
13+
const { getScope } = require("../../util/eslint-compat")
1314
/** @type {Record<string, ESSyntax>} */
1415
const features = require("./es-syntax.json")
1516

@@ -113,8 +114,7 @@ function normalizeScope(initialScope, node) {
113114
* @returns {boolean}
114115
*/
115116
function isStrict(context, node) {
116-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
117-
const scope = sourceCode.getScope?.(node) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
117+
const scope = getScope(context)
118118
return normalizeScope(scope, node).isStrict
119119
}
120120

lib/rules/prefer-promises/dns.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const {
99
CONSTRUCT,
1010
ReferenceTracker,
1111
} = require("@eslint-community/eslint-utils")
12+
const { getScope } = require("../../util/eslint-compat")
1213

1314
/** @type {import('@eslint-community/eslint-utils').TraceMap<boolean>} */
1415
const dns = {
@@ -57,9 +58,8 @@ module.exports = {
5758

5859
create(context) {
5960
return {
60-
"Program:exit"(node) {
61-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
62-
const scope = sourceCode.getScope?.(node) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
61+
"Program:exit"() {
62+
const scope = getScope(context)
6363
const tracker = new ReferenceTracker(scope, { mode: "legacy" })
6464
const references = [
6565
...tracker.iterateCjsReferences(traceMap),

lib/rules/prefer-promises/fs.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"use strict"
66

77
const { CALL, ReferenceTracker } = require("@eslint-community/eslint-utils")
8+
const { getScope } = require("../../util/eslint-compat")
89

910
/** @type {import('@eslint-community/eslint-utils').TraceMap<boolean>} */
1011
const traceMap = {
@@ -55,9 +56,8 @@ module.exports = {
5556

5657
create(context) {
5758
return {
58-
"Program:exit"(node) {
59-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
60-
const scope = sourceCode.getScope?.(node) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
59+
"Program:exit"() {
60+
const scope = getScope(context)
6161
const tracker = new ReferenceTracker(scope, { mode: "legacy" })
6262
const references = [
6363
...tracker.iterateCjsReferences(traceMap),

lib/util/check-prefer-global.js

+3-7
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"use strict"
66

77
const { ReferenceTracker } = require("@eslint-community/eslint-utils")
8-
8+
const { getScope } = require("../util/eslint-compat")
99
/**
1010
* @typedef TraceMap
1111
* @property {import('@eslint-community/eslint-utils').TraceMap<boolean>} globals
@@ -36,9 +36,7 @@ class Verifier {
3636
*/
3737
verifyToPreferGlobals() {
3838
const { context, traceMap } = this
39-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
40-
const scope =
41-
sourceCode.getScope?.(sourceCode.ast) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
39+
const scope = getScope(context)
4240
const tracker = new ReferenceTracker(scope, {
4341
mode: "legacy",
4442
})
@@ -57,9 +55,7 @@ class Verifier {
5755
*/
5856
verifyToPreferModules() {
5957
const { context, traceMap } = this
60-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
61-
const scope =
62-
sourceCode.getScope?.(sourceCode.ast) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
58+
const scope = getScope(context)
6359
const tracker = new ReferenceTracker(scope)
6460

6561
for (const { node } of tracker.iterateGlobalReferences(

lib/util/check-unsupported-builtins.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const getConfiguredNodeVersion = require("./get-configured-node-version")
1010
const getSemverRange = require("./get-semver-range")
1111
const unprefixNodeColon = require("./unprefix-node-colon")
1212
const semverRangeSubset = require("semver/ranges/subset")
13+
const { getScope } = require("../util/eslint-compat")
1314

1415
/**
1516
* Parses the options.
@@ -86,8 +87,7 @@ module.exports.checkUnsupportedBuiltins = function checkUnsupportedBuiltins(
8687
traceMap
8788
) {
8889
const options = parseOptions(context)
89-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
90-
const scope = sourceCode.getScope?.(sourceCode.ast) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
90+
const scope = getScope(context)
9191
const tracker = new ReferenceTracker(scope, { mode: "legacy" })
9292
const references = [
9393
...tracker.iterateCjsReferences(traceMap.modules ?? {}),

lib/util/eslint-compat.js

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
* @fileoverview Utilities for eslint compatibility.
3+
* @see https://eslint.org/docs/latest/use/migrate-to-9.0.0#removed-context-methods
4+
* @author aladdin-add<[email protected]>
5+
*/
6+
"use strict"
7+
8+
/** @import { Rule } from 'eslint' */
9+
/** @typedef {import('estree').Node} Node */
10+
11+
exports.getSourceCode = function (/** @type Rule.RuleContext */ context) {
12+
return context.sourceCode || context.getSourceCode()
13+
}
14+
15+
exports.getScope = function (
16+
/** @type {Rule.RuleContext} */ context,
17+
/** @type {Node} */ node
18+
) {
19+
const sourceCode = exports.getSourceCode(context)
20+
return sourceCode.getScope?.(node || sourceCode.ast) || context.getScope()
21+
}
22+
23+
exports.getAncestors = function (
24+
/** @type {Rule.RuleContext} */ context,
25+
/** @type {Node} */ node
26+
) {
27+
const sourceCode = exports.getSourceCode(context)
28+
return sourceCode.getAncestors?.(node) || context.getAncestors()
29+
}
30+
31+
exports.getCwd = function (/** @type {Rule.RuleContext} */ context) {
32+
return context.cwd || context.getCwd()
33+
}
34+
35+
exports.getPhysicalFilename = function (
36+
/** @type {Rule.RuleContext} */ context
37+
) {
38+
return context.physicalFilename || context.getPhysicalFilename?.()
39+
}
40+
41+
exports.getFilename = function (/** @type {Rule.RuleContext} */ context) {
42+
return context.filename || context.getFilename?.()
43+
}

lib/util/get-tsconfig.js

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"use strict"
22

33
const { getTsconfig, parseTsconfig } = require("get-tsconfig")
4+
const {getPhysicalFilename, getFilename} = require("./eslint-compat")
45
const fsCache = new Map()
56

67
/**
@@ -30,12 +31,7 @@ function getTSConfigForFile(filename) {
3031
* @returns {import("get-tsconfig").TsConfigResult | null}
3132
*/
3233
function getTSConfigForContext(context) {
33-
// TODO: remove context.get(PhysicalFilename|Filename) when dropping eslint < v10
34-
const filename =
35-
context.physicalFilename ??
36-
context.getPhysicalFilename?.() ??
37-
context.filename ??
38-
context.getFilename?.()
34+
const filename = getPhysicalFilename(context) ?? getFilename(context)
3935

4036
return getTSConfigForFile(filename)
4137
}

lib/util/visit-require.js

+3-5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const getResolverConfig = require("./get-resolver-config")
1616
const getTryExtensions = require("./get-try-extensions")
1717
const ImportTarget = require("./import-target")
1818
const stripImportPathParams = require("./strip-import-path-params")
19+
const { getScope } = require("../util/eslint-compat")
1920

2021
/**
2122
* @typedef VisitRequireOptions
@@ -48,11 +49,8 @@ module.exports = function visitRequire(
4849
const options = { basedir, paths, extensions, resolverConfig }
4950

5051
return {
51-
"Program:exit"(node) {
52-
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
53-
const tracker = new ReferenceTracker(
54-
sourceCode.getScope?.(node) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
55-
)
52+
"Program:exit"() {
53+
const tracker = new ReferenceTracker(getScope(context))
5654
const references = tracker.iterateGlobalReferences({
5755
require: {
5856
[CALL]: true,

0 commit comments

Comments
 (0)