Skip to content

Commit 41ceed7

Browse files
aladdin-addscagood
andauthored
feat!: drop eslint v7 & node.js < 18 (#161)
chore: switch to new rule-tester. Signed-off-by: 唯然 <[email protected]> Co-authored-by: Sebastian Good <[email protected]>
1 parent c191101 commit 41ceed7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+542
-549
lines changed

.github/workflows/CI.yml

+13-8
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,18 @@ on:
88
- cron: 0 0 * * 0
99

1010
jobs:
11+
1112
lint:
1213
name: Lint
1314
runs-on: ubuntu-latest
15+
timeout-minutes: 30
1416
steps:
1517
- name: Checkout
1618
uses: actions/checkout@v4
1719
with:
1820
fetch-depth: 1
1921
- name: Install Node.js
20-
uses: actions/setup-node@v3
22+
uses: actions/setup-node@v4
2123
with:
2224
node-version: 20.x
2325
- name: Install Packages
@@ -31,31 +33,34 @@ jobs:
3133
strategy:
3234
matrix:
3335
os: [ubuntu-latest, windows-latest, macOS-latest]
34-
eslint: [8.x]
36+
eslint: [8.x, "9.0.0-alpha.0"]
3537
node: [18.x, 20.x]
3638
include:
3739
- os: ubuntu-latest
38-
node: "16.0.x"
40+
node: "18.18.0"
3941
eslint: "8.x"
4042
- os: ubuntu-latest
41-
node: "16.x"
43+
node: "20.9.0"
4244
eslint: "8.x"
4345
- os: ubuntu-latest
44-
node: "19.x"
46+
node: "21.1.0"
4547
eslint: "8.x"
4648
- os: ubuntu-latest
47-
node: "20.x"
48-
eslint: "7.0.x"
49+
node: "21.x"
50+
eslint: "8.x"
4951
runs-on: ${{ matrix.os }}
52+
timeout-minutes: 30
5053
steps:
5154
- name: Checkout
5255
uses: actions/checkout@v4
5356
with:
5457
fetch-depth: 1
5558
- name: Install Node.js ${{ matrix.node }}
56-
uses: actions/setup-node@v3
59+
uses: actions/setup-node@v4
5760
with:
5861
node-version: ${{ matrix.node }}
62+
- name: npm latest
63+
run: npm i -g npm@latest # use latest npm
5964
- name: Install Packages
6065
run: npm install
6166
- name: Install ESLint ${{ matrix.eslint }}

.npmrc

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1-
registry=https://registry.npmjs.org/
1+
registry = https://registry.npmjs.org/
22
package-lock = false
3+
force = true
4+
legacy-peer-deps = true

README.md

+5-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@ Additional ESLint rules for Node.js
1818
npm install --save-dev eslint eslint-plugin-n
1919
```
2020

21-
- Requires Node.js `>=16.0.0`
22-
- Requires ESLint `>=7.0.0`
21+
| Version | Supported Node.js | Supported ESLint Version |
22+
|---------|-------------------|---------------------------|
23+
| 17.x | `^18.18.0 \|\| ^20.9.0 \|\| >=21.1.0` | `>=8.23.0` |
24+
| 16.x | `>=16.0.0` | `>=7.0.0` |
25+
| 15.x | `>=12.22.0` | `>=7.0.0` |
2326

2427
**Note:** It recommends a use of [the "engines" field of package.json](https://docs.npmjs.com/files/package.json#engines). The "engines" field is used by `n/no-unsupported-features/*` rules.
2528

eslint.config.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ module.exports = [
1313
{
1414
languageOptions: { globals: globals.mocha },
1515
linterOptions: { reportUnusedDisableDirectives: true },
16+
settings: {
17+
n: { allowModules: ["#eslint-rule-tester"] }, // the plugin does not support import-maps yet.
18+
},
1619
},
1720
{
1821
ignores: [
@@ -27,7 +30,9 @@ module.exports = [
2730
nodeRecommended,
2831
eslintPluginConfig,
2932
prettierConfig,
30-
{ rules: { "eslint-plugin/require-meta-docs-description": "error" } },
33+
{
34+
rules: { "eslint-plugin/require-meta-docs-description": "error" },
35+
},
3136
{
3237
// these messageIds were used outside
3338
files: ["lib/rules/prefer-global/*.js"],

package.json

+6-3
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
"version": "16.6.1",
44
"description": "Additional ESLint's rules for Node.js",
55
"engines": {
6-
"node": ">=16.0.0"
6+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
77
},
88
"main": "lib/index.js",
99
"files": [
1010
"lib/",
1111
"configs/"
1212
],
1313
"peerDependencies": {
14-
"eslint": ">=7.0.0"
14+
"eslint": ">=8.23.0"
1515
},
1616
"dependencies": {
1717
"@eslint-community/eslint-utils": "^4.4.0",
@@ -31,7 +31,7 @@
3131
"@types/eslint": "^8.44.6",
3232
"@typescript-eslint/parser": "^5.60.0",
3333
"esbuild": "^0.18.7",
34-
"eslint": "^8.56.0",
34+
"eslint": "^8",
3535
"eslint-config-prettier": "^8.8.0",
3636
"eslint-doc-generator": "^1.6.1",
3737
"eslint-plugin-eslint-plugin": "^5.2.1",
@@ -111,5 +111,8 @@
111111
"lint-staged": {
112112
"*.js": "eslint --cache --fix",
113113
"*.{json,js}": "prettier --write --ignore-path .eslintignore"
114+
},
115+
"imports": {
116+
"#eslint-rule-tester": "./tests/eslint-rule-tester.js"
114117
}
115118
}

tests/eslint-rule-tester.js

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* @fileoverview Helpers for tests.
3+
* @author 唯然<[email protected]>
4+
*/
5+
"use strict"
6+
const eslintVersion = require("eslint/package.json").version
7+
const { RuleTester } = require("eslint")
8+
const { FlatRuleTester } = require("eslint/use-at-your-own-risk")
9+
const globals = require("globals")
10+
const semverSatisfies = require("semver/functions/satisfies")
11+
12+
// greater than or equal to ESLint v9
13+
exports.gteEslintV9 = semverSatisfies(eslintVersion, ">=9", {
14+
includePrerelease: true,
15+
})
16+
17+
exports.FlatRuleTester = exports.gteEslintV9 ? RuleTester : FlatRuleTester
18+
19+
// to support the `env:{ es6: true, node: true}` rule-tester (env has been away in flat config.)
20+
// * enabled by default as it's most commonly used in the package.
21+
// * to disable the node.js globals: {languageOptions: {env: {node: false}}}.
22+
const defaultConfig = {
23+
languageOptions: {
24+
ecmaVersion: 6,
25+
sourceType: "commonjs",
26+
globals: globals.node,
27+
},
28+
}
29+
exports.RuleTester = function (config = defaultConfig) {
30+
if (config.languageOptions.env?.node === false)
31+
config.languageOptions.globals = config.languageOptions.globals || {}
32+
delete config.languageOptions.env
33+
34+
config.languageOptions = Object.assign(
35+
{},
36+
defaultConfig.languageOptions,
37+
config.languageOptions
38+
)
39+
40+
const ruleTester = new exports.FlatRuleTester(config)
41+
return ruleTester
42+
}

tests/lib/configs/recommended.js renamed to tests/lib/configs/eslintrc.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
const assert = require("assert")
44
const path = require("path")
5-
const { ESLint } = require("eslint")
5+
const { LegacyESLint } = require("eslint/use-at-your-own-risk")
6+
// const {ESLint} = require("eslint")
67
const { gtEslintV8 } = require("../../helpers")
7-
88
const originalCwd = process.cwd()
99

1010
// this is needed as `recommended` config was cached
@@ -24,7 +24,7 @@ describe("node/recommended config", () => {
2424
beforeEach(() => {
2525
process.chdir(root)
2626
clearRequireCache()
27-
linter = new ESLint({
27+
linter = new LegacyESLint({
2828
baseConfig: { extends: "plugin:n/recommended" },
2929
useEslintrc: false,
3030
})
@@ -102,7 +102,7 @@ describe("node/recommended config", () => {
102102
beforeEach(() => {
103103
process.chdir(root)
104104
clearRequireCache()
105-
linter = new ESLint({
105+
linter = new LegacyESLint({
106106
baseConfig: { extends: "plugin:n/recommended" },
107107
useEslintrc: false,
108108
})

tests/lib/rules/callback-return.js

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

7-
const RuleTester = require("eslint").RuleTester
7+
const RuleTester = require("#eslint-rule-tester").RuleTester
88
const rule = require("../../../lib/rules/callback-return")
9-
const ruleTester = new RuleTester({ env: { node: true, es6: true } })
9+
const ruleTester = new RuleTester()
1010

1111
ruleTester.run("callback-return", rule, {
1212
valid: [

0 commit comments

Comments
 (0)