Skip to content

Commit

Permalink
feat: support eslint v9
Browse files Browse the repository at this point in the history
  • Loading branch information
aladdin-add committed Apr 25, 2024
1 parent 7bf0bbf commit 46e0b94
Show file tree
Hide file tree
Showing 28 changed files with 945 additions and 1,125 deletions.
48 changes: 0 additions & 48 deletions .eslintrc.js

This file was deleted.

44 changes: 17 additions & 27 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,47 +12,37 @@ jobs:
fail-fast: false
matrix:
node-version:
- '18'
- '17'
- '16'
- 22
- 21
- 20
- 18
os:
- ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm install
- run: npm install --force # ts-eslint does not support eslint v9 yet.
- run: npm test

lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '16'
- run: npm install
node-version: "lts/*"
- run: npm install --force # ts-eslint does not support eslint v9 yet.
- run: npm run lint

eslint6:
eslint8:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '16'
- run: npm install
- run: npm install --save-dev eslint@6
- run: npm test

eslint7:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '16'
- run: npm install
- run: npm install --save-dev eslint@7
node-version: "lts/*"
- run: npm install --force
- run: npm install --save-dev eslint@8
- run: npm test
17 changes: 17 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import baseConfig from "eslint-config-eslint";
import eslintPlugin from "eslint-plugin-eslint-plugin";
import autofixPlugin from "eslint-plugin-autofix";
import noAutofixPlugin from "eslint-plugin-no-autofix";
import nPlugin from "eslint-plugin-n"; // eslint-disable-line n/no-extraneous-import
import globals from "globals";

export default [
...baseConfig,
eslintPlugin.configs["flat/recommended"],
{ files: ["packages/*/tests/**/*"], languageOptions: { globals: globals.mocha } },
{
plugins: { autofix: autofixPlugin, "no-autofix": noAutofixPlugin },
rules: { "eslint-comments/require-description": 0, "no-autofix/eslint-plugin/test-case-shorthand-strings": "error" }
},
...nPlugin.configs["flat/mixed-esm-and-cjs"]
];
11 changes: 6 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@
"author": "薛定谔的猫 <weiran.zsd@outlook.com>",
"description": "some eslint plugins",
"devDependencies": {
"eslint": "^8.1.0",
"eslint-config-eslint": "^7.0.0",
"eslint-plugin-eslint-plugin": "^4.0.1",
"eslint-plugin-jsdoc": "^37.0.3",
"eslint-plugin-node": "^11.1.0"
"eslint": "^9.1.1",
"eslint-config-eslint": "^9.0.0",
"eslint-plugin-autofix": "file:./packages/autofix",
"eslint-plugin-eslint-plugin": "^6.0.0",
"eslint-plugin-no-autofix": "file:./packages/no-autofix",
"globals": "^15.0.0"
},
"scripts": {
"lint": "eslint packages/",
Expand Down
49 changes: 25 additions & 24 deletions packages/autofix/lib/configs/all.js
Original file line number Diff line number Diff line change
@@ -1,24 +1,25 @@
/**
* @fileoverview configs:all for the plugin
* @author 唯然<weiran.zsd@outlook.com>
*/
"use strict";

const packageMetadata = require("../../package");
const PLUGIN_NAME = packageMetadata.name.replace(/^eslint-plugin-/u, "");
const allRules = require("../rules");

const all = {
plugins: [PLUGIN_NAME],
rules: {}
};

// turn off core rules
Object.keys(allRules)
.reduce((rules, ruleName) => Object.assign(rules, { [ruleName]: "off" }), all.rules);

// turn on plugin rules
Object.keys(allRules)
.reduce((rules, ruleName) => Object.assign(rules, { [`${PLUGIN_NAME}/${ruleName}`]: "error" }), all.rules);

module.exports = all;
/**
* @fileoverview configs:all for the plugin
* @author 唯然<weiran.zsd@outlook.com>
*/
"use strict";

const packageMetadata = require("../../package");
const PLUGIN_NAME = packageMetadata.name.replace(/^eslint-plugin-/u, "");
const allRules = require("../rules");

const all = {
plugins: [PLUGIN_NAME],
rules: {}
};

// turn off core rules
Object.keys(allRules)
.reduce((rules, ruleName) => Object.assign(rules, { [ruleName]: "off" }), all.rules);

// turn on plugin rules
Object.keys(allRules)
.reduce((rules, ruleName) => Object.assign(rules, { [`${PLUGIN_NAME}/${ruleName}`]: "error" }), all.rules);

module.exports = all;

46 changes: 27 additions & 19 deletions packages/autofix/lib/index.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,27 @@
/**
* @fileoverview An ESLint plugin provides autofix for some core rules.
* @author 唯然<weiran.zsd@outlook.com>
*/
"use strict";

const all = require("./configs/all");
const recommended = require("./configs/recommended");
const unsafe = require("./configs/unsafe");
const rules = require("./rules");

module.exports = {
configs: {
all,
recommended,
unsafe
},
rules
};
/**
* @fileoverview An ESLint plugin provides autofix for some core rules.
* @author 唯然<weiran.zsd@outlook.com>
*/
"use strict";

const all = require("./configs/all");
const recommended = require("./configs/recommended");
const unsafe = require("./configs/unsafe");
const rules = require("./rules");

const pkg = {
configs: {
all,
recommended,
unsafe,
},
rules
};

Object.assign(pkg.configs, {
'flat/all': {...pkg.configs.all, plugins: { 'autofix': pkg.configs.all.plugins[0]}},
'flat/recommended': {...pkg.configs.recommended, plugins: { 'autofix': pkg.configs.recommended.plugins[0]}},
'flat/unsafe': {...pkg.configs.unsafe, plugins: { 'autofix': pkg.configs.unsafe.plugins[0]}},
});

module.exports = pkg
8 changes: 4 additions & 4 deletions packages/autofix/lib/rules.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

const fs = require("fs");
const path = require("path");
const eslintVersion = Number.parseInt(require("eslint/package.json").version, 10);
const {eslintVersion} = require("./utils.js")


/**
Expand All @@ -30,10 +30,10 @@ function loadRule(ruleName) {

const allRules = {};

// eslint v6 restructed its codebase
// eslint v6 restructured its codebase
// TODO: this might be unreliable
if (eslintVersion >= 8) {
const { builtinRules } = require("eslint/use-at-your-own-risk"); // eslint-disable-line node/no-missing-require
const { builtinRules } = require("eslint/use-at-your-own-risk");

for (const [ruleId, rule] of builtinRules) {
if (rule.meta.fixable) {
Expand All @@ -49,7 +49,7 @@ if (eslintVersion >= 8) {
}
}
} else {
const builtin = require("eslint/lib/built-in-rules-index"); // eslint-disable-line node/no-missing-require
const builtin = require("eslint/lib/built-in-rules-index"); // eslint-disable-line n/no-missing-require

Object.keys(builtin)
.filter(rule => builtin[rule].meta.fixable)
Expand Down
43 changes: 28 additions & 15 deletions packages/autofix/lib/utils.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,28 @@
/**
* @fileoverview utils used by the rule fixers.
* @author 唯然<weiran.zsd@outlook.com>
*/
"use strict";
const eslint = require("eslint");
const linter = new eslint.Linter();

exports.getFixableRule = function(ruleName, recommended = false, fixable = "code") {
const rule = linter.getRules().get(ruleName);

rule.meta.recommended = recommended;
rule.meta.fixable = fixable;
return rule;
};
/**
* @fileoverview utils used by the rule fixers.
* @author 唯然<weiran.zsd@outlook.com>
*/
"use strict";

exports.eslintVersion = Number.parseInt(require("eslint/package.json").version, 10);

// eslint v6 restructured its codebase
// TODO: this might be unreliable
if (exports.eslintVersion >= 8) {
const { builtinRules } = require("eslint/use-at-your-own-risk");
exports.builtinRules = builtinRules;
} else if (exports.eslintVersion >= 6) {
const builtin = require("eslint/lib/rules");
exports.builtinRules = builtin;
} else {
const builtin = require("eslint/lib/built-in-rules-index"); // eslint-disable-line n/no-missing-require
exports.builtinRules = builtin;
}

exports.getFixableRule = function(ruleName, recommended = false, fixable = "code") {
const rule = exports.builtinRules[ruleName] || exports.builtinRules.get(ruleName);

rule.meta.recommended = recommended;
rule.meta.fixable = fixable;
return rule;
};
2 changes: 1 addition & 1 deletion packages/autofix/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
"mocha": "^9.1.3"
},
"peerDependencies": {
"eslint": ">= 5.12.1"
"eslint": ">=8"
},
"keywords": [
"eslint plugin",
Expand Down

0 comments on commit 46e0b94

Please sign in to comment.