diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 36c7d0ff..fb9d73c5 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -8,16 +8,18 @@ on: - cron: 0 0 * * 0 jobs: + lint: name: Lint runs-on: ubuntu-latest + timeout-minutes: 30 steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 1 - name: Install Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 20.x - name: Install Packages @@ -31,31 +33,34 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macOS-latest] - eslint: [8.x] + eslint: [8.x, "9.0.0-alpha.0"] node: [18.x, 20.x] include: - os: ubuntu-latest - node: "16.0.x" + node: "18.18.0" eslint: "8.x" - os: ubuntu-latest - node: "16.x" + node: "20.9.0" eslint: "8.x" - os: ubuntu-latest - node: "19.x" + node: "21.1.0" eslint: "8.x" - os: ubuntu-latest - node: "20.x" - eslint: "7.0.x" + node: "21.x" + eslint: "8.x" runs-on: ${{ matrix.os }} + timeout-minutes: 30 steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 1 - name: Install Node.js ${{ matrix.node }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} + - name: npm latest + run: npm i -g npm@latest # use latest npm - name: Install Packages run: npm install - name: Install ESLint ${{ matrix.eslint }} diff --git a/.npmrc b/.npmrc index 10bc5dde..49c11630 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,4 @@ -registry=https://registry.npmjs.org/ +registry = https://registry.npmjs.org/ package-lock = false +force = true +legacy-peer-deps = true diff --git a/README.md b/README.md index cda9b4f5..021ce524 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,11 @@ Additional ESLint rules for Node.js npm install --save-dev eslint eslint-plugin-n ``` -- Requires Node.js `>=16.0.0` -- Requires ESLint `>=7.0.0` +| Version | Supported Node.js | Supported ESLint Version | +|---------|-------------------|---------------------------| +| 17.x | `^18.18.0 \|\| ^20.9.0 \|\| >=21.1.0` | `>=8.23.0` | +| 16.x | `>=16.0.0` | `>=7.0.0` | +| 15.x | `>=12.22.0` | `>=7.0.0` | **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. diff --git a/eslint.config.js b/eslint.config.js index 3cd51cff..3534ae88 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -13,6 +13,9 @@ module.exports = [ { languageOptions: { globals: globals.mocha }, linterOptions: { reportUnusedDisableDirectives: true }, + settings: { + n: { allowModules: ["#eslint-rule-tester"] }, // the plugin does not support import-maps yet. + }, }, { ignores: [ @@ -27,7 +30,9 @@ module.exports = [ nodeRecommended, eslintPluginConfig, prettierConfig, - { rules: { "eslint-plugin/require-meta-docs-description": "error" } }, + { + rules: { "eslint-plugin/require-meta-docs-description": "error" }, + }, { // these messageIds were used outside files: ["lib/rules/prefer-global/*.js"], diff --git a/package.json b/package.json index bedd6bf5..a34aa275 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "16.6.1", "description": "Additional ESLint's rules for Node.js", "engines": { - "node": ">=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "main": "lib/index.js", "files": [ @@ -11,7 +11,7 @@ "configs/" ], "peerDependencies": { - "eslint": ">=7.0.0" + "eslint": ">=8.23.0" }, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -31,7 +31,7 @@ "@types/eslint": "^8.44.6", "@typescript-eslint/parser": "^5.60.0", "esbuild": "^0.18.7", - "eslint": "^8.56.0", + "eslint": "^8", "eslint-config-prettier": "^8.8.0", "eslint-doc-generator": "^1.6.1", "eslint-plugin-eslint-plugin": "^5.2.1", @@ -111,5 +111,8 @@ "lint-staged": { "*.js": "eslint --cache --fix", "*.{json,js}": "prettier --write --ignore-path .eslintignore" + }, + "imports": { + "#eslint-rule-tester": "./tests/eslint-rule-tester.js" } } diff --git a/tests/eslint-rule-tester.js b/tests/eslint-rule-tester.js new file mode 100644 index 00000000..e4379ba1 --- /dev/null +++ b/tests/eslint-rule-tester.js @@ -0,0 +1,42 @@ +/** + * @fileoverview Helpers for tests. + * @author 唯然 + */ +"use strict" +const eslintVersion = require("eslint/package.json").version +const { RuleTester } = require("eslint") +const { FlatRuleTester } = require("eslint/use-at-your-own-risk") +const globals = require("globals") +const semverSatisfies = require("semver/functions/satisfies") + +// greater than or equal to ESLint v9 +exports.gteEslintV9 = semverSatisfies(eslintVersion, ">=9", { + includePrerelease: true, +}) + +exports.FlatRuleTester = exports.gteEslintV9 ? RuleTester : FlatRuleTester + +// to support the `env:{ es6: true, node: true}` rule-tester (env has been away in flat config.) +// * enabled by default as it's most commonly used in the package. +// * to disable the node.js globals: {languageOptions: {env: {node: false}}}. +const defaultConfig = { + languageOptions: { + ecmaVersion: 6, + sourceType: "commonjs", + globals: globals.node, + }, +} +exports.RuleTester = function (config = defaultConfig) { + if (config.languageOptions.env?.node === false) + config.languageOptions.globals = config.languageOptions.globals || {} + delete config.languageOptions.env + + config.languageOptions = Object.assign( + {}, + defaultConfig.languageOptions, + config.languageOptions + ) + + const ruleTester = new exports.FlatRuleTester(config) + return ruleTester +} diff --git a/tests/lib/configs/recommended.js b/tests/lib/configs/eslintrc.js similarity index 96% rename from tests/lib/configs/recommended.js rename to tests/lib/configs/eslintrc.js index 44107d45..b79b15b7 100644 --- a/tests/lib/configs/recommended.js +++ b/tests/lib/configs/eslintrc.js @@ -2,9 +2,9 @@ const assert = require("assert") const path = require("path") -const { ESLint } = require("eslint") +const { LegacyESLint } = require("eslint/use-at-your-own-risk") +// const {ESLint} = require("eslint") const { gtEslintV8 } = require("../../helpers") - const originalCwd = process.cwd() // this is needed as `recommended` config was cached @@ -24,7 +24,7 @@ describe("node/recommended config", () => { beforeEach(() => { process.chdir(root) clearRequireCache() - linter = new ESLint({ + linter = new LegacyESLint({ baseConfig: { extends: "plugin:n/recommended" }, useEslintrc: false, }) @@ -102,7 +102,7 @@ describe("node/recommended config", () => { beforeEach(() => { process.chdir(root) clearRequireCache() - linter = new ESLint({ + linter = new LegacyESLint({ baseConfig: { extends: "plugin:n/recommended" }, useEslintrc: false, }) diff --git a/tests/lib/rules/callback-return.js b/tests/lib/rules/callback-return.js index 56e48492..dcc3b81f 100644 --- a/tests/lib/rules/callback-return.js +++ b/tests/lib/rules/callback-return.js @@ -4,9 +4,9 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/callback-return") -const ruleTester = new RuleTester({ env: { node: true, es6: true } }) +const ruleTester = new RuleTester() ruleTester.run("callback-return", rule, { valid: [ diff --git a/tests/lib/rules/exports-style.js b/tests/lib/rules/exports-style.js index b5f926cb..7ff2a7cf 100644 --- a/tests/lib/rules/exports-style.js +++ b/tests/lib/rules/exports-style.js @@ -4,326 +4,327 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/exports-style") -new RuleTester({ - env: { node: true, es6: true }, - parserOptions: { ecmaVersion: 11 }, -}).run("exports-style", rule, { - valid: [ - { - code: "module.exports = {foo: 1}", - }, - { - code: "module.exports = {foo: 1}", - options: ["module.exports"], - }, - { - code: "exports.foo = 1", - options: ["exports"], - }, - { - code: "exports = module.exports = {foo: 1}", - options: ["module.exports", { allowBatchAssign: true }], - }, - { - code: "module.exports = exports = {foo: 1}", - options: ["module.exports", { allowBatchAssign: true }], - }, - { - code: "exports = module.exports = {foo: 1}", - options: ["exports", { allowBatchAssign: true }], - }, - { - code: "module.exports = exports = {foo: 1}", - options: ["exports", { allowBatchAssign: true }], - }, - { - code: "exports = module.exports = {foo: 1}; exports.bar = 2", - options: ["exports", { allowBatchAssign: true }], - }, - { - code: "module.exports = exports = {foo: 1}; exports.bar = 2", - options: ["exports", { allowBatchAssign: true }], - }, +new RuleTester({ languageOptions: { ecmaVersion: 11 } }).run( + "exports-style", + rule, + { + valid: [ + { + code: "module.exports = {foo: 1}", + }, + { + code: "module.exports = {foo: 1}", + options: ["module.exports"], + }, + { + code: "exports.foo = 1", + options: ["exports"], + }, + { + code: "exports = module.exports = {foo: 1}", + options: ["module.exports", { allowBatchAssign: true }], + }, + { + code: "module.exports = exports = {foo: 1}", + options: ["module.exports", { allowBatchAssign: true }], + }, + { + code: "exports = module.exports = {foo: 1}", + options: ["exports", { allowBatchAssign: true }], + }, + { + code: "module.exports = exports = {foo: 1}", + options: ["exports", { allowBatchAssign: true }], + }, + { + code: "exports = module.exports = {foo: 1}; exports.bar = 2", + options: ["exports", { allowBatchAssign: true }], + }, + { + code: "module.exports = exports = {foo: 1}; exports.bar = 2", + options: ["exports", { allowBatchAssign: true }], + }, - // allow accesses of `modules` except `module.exports` - { - code: "module = {}; module.foo = 1", - options: ["exports"], - }, + // allow accesses of `modules` except `module.exports` + { + code: "module = {}; module.foo = 1", + options: ["exports"], + }, - // Ignores if it's not defined. - { - code: "exports.foo = 1", - options: ["module.exports"], - globals: { exports: "off" }, - }, - { - code: "module.exports = {foo: 1}", - options: ["exports"], - globals: { module: "off" }, - }, - ], - invalid: [ - { - code: "exports = {foo: 1}", - output: null, - errors: [ - "Unexpected access to 'exports'. Use 'module.exports' instead.", - ], - }, - { - code: "exports.foo = 1", - output: null, - errors: [ - "Unexpected access to 'exports'. Use 'module.exports' instead.", - ], - }, - { - code: "module.exports = exports = {foo: 1}", - output: null, - errors: [ - "Unexpected access to 'exports'. Use 'module.exports' instead.", - ], - }, - { - code: "exports = module.exports = {foo: 1}", - output: null, - errors: [ - "Unexpected access to 'exports'. Use 'module.exports' instead.", - ], - }, + // Ignores if it's not defined. + { + code: "exports.foo = 1", + options: ["module.exports"], + languageOptions: { globals: { exports: "off" } }, + }, + { + code: "module.exports = {foo: 1}", + options: ["exports"], + languageOptions: { globals: { module: "off" } }, + }, + ], + invalid: [ + { + code: "exports = {foo: 1}", + output: null, + errors: [ + "Unexpected access to 'exports'. Use 'module.exports' instead.", + ], + }, + { + code: "exports.foo = 1", + output: null, + errors: [ + "Unexpected access to 'exports'. Use 'module.exports' instead.", + ], + }, + { + code: "module.exports = exports = {foo: 1}", + output: null, + errors: [ + "Unexpected access to 'exports'. Use 'module.exports' instead.", + ], + }, + { + code: "exports = module.exports = {foo: 1}", + output: null, + errors: [ + "Unexpected access to 'exports'. Use 'module.exports' instead.", + ], + }, - { - code: "exports = {foo: 1}", - output: null, - options: ["module.exports"], - errors: [ - "Unexpected access to 'exports'. Use 'module.exports' instead.", - ], - }, - { - code: "exports.foo = 1", - output: null, - options: ["module.exports"], - errors: [ - "Unexpected access to 'exports'. Use 'module.exports' instead.", - ], - }, - { - code: "module.exports = exports = {foo: 1}", - output: null, - options: ["module.exports"], - errors: [ - "Unexpected access to 'exports'. Use 'module.exports' instead.", - ], - }, - { - code: "exports = module.exports = {foo: 1}", - output: null, - options: ["module.exports"], - errors: [ - "Unexpected access to 'exports'. Use 'module.exports' instead.", - ], - }, + { + code: "exports = {foo: 1}", + output: null, + options: ["module.exports"], + errors: [ + "Unexpected access to 'exports'. Use 'module.exports' instead.", + ], + }, + { + code: "exports.foo = 1", + output: null, + options: ["module.exports"], + errors: [ + "Unexpected access to 'exports'. Use 'module.exports' instead.", + ], + }, + { + code: "module.exports = exports = {foo: 1}", + output: null, + options: ["module.exports"], + errors: [ + "Unexpected access to 'exports'. Use 'module.exports' instead.", + ], + }, + { + code: "exports = module.exports = {foo: 1}", + output: null, + options: ["module.exports"], + errors: [ + "Unexpected access to 'exports'. Use 'module.exports' instead.", + ], + }, - { - code: "exports = {foo: 1}", - output: null, - options: ["exports"], - errors: [ - "Unexpected assignment to 'exports'. Don't modify 'exports' itself.", - ], - }, - { - code: "module.exports = {foo: 1}", - output: "exports.foo = 1;", - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports.foo = 1", - output: "exports.foo = 1", - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports = { a: 1 }", - output: "exports.a = 1;", - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports = { a: 1, b: 2 }", - output: "exports.a = 1;\n\nexports.b = 2;", - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports = { // before a\na: 1, // between a and b\nb: 2 // after b\n}", - output: "// before a\nexports.a = 1;\n\n// between a and b\nexports.b = 2;\n// after b", - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "foo(module.exports = {foo: 1})", - output: null, - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "if(foo){ module.exports = { foo: 1};} else { module.exports = {foo: 2};}", - output: null, - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "function bar() { module.exports = { foo: 1 }; }", - output: null, - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports = { get a() {} }", - output: null, - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports = { set a(a) {} }", - output: null, - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports = { a }", - output: "exports.a = a;", - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports = { ...a }", - output: null, - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports = { ['a' + 'b']: 1 }", - output: "exports['a' + 'b'] = 1;", - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports = { 'foo': 1 }", - output: "exports['foo'] = 1;", - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports = { foo(a) {} }", - output: "exports.foo = function (a) {};", - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports = { *foo(a) {} }", - output: "exports.foo = function* (a) {};", - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports = { async foo(a) {} }", - output: "exports.foo = async function (a) {};", - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports.foo()", - output: "exports.foo()", - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "a = module.exports.foo + module.exports['bar']", - output: "a = exports.foo + exports['bar']", - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports = exports = {foo: 1}", - output: null, - options: ["exports"], - errors: [ - "Unexpected access to 'module.exports'. Use 'exports' instead.", - "Unexpected assignment to 'exports'. Don't modify 'exports' itself.", - ], - }, - { - code: "exports = module.exports = {foo: 1}", - output: null, - options: ["exports"], - errors: [ - "Unexpected assignment to 'exports'. Don't modify 'exports' itself.", - "Unexpected access to 'module.exports'. Use 'exports' instead.", - ], - }, - { - code: "module.exports = exports = {foo: 1}; exports = obj", - output: null, - options: ["exports", { allowBatchAssign: true }], - errors: [ - "Unexpected assignment to 'exports'. Don't modify 'exports' itself.", - ], - }, - { - code: "exports = module.exports = {foo: 1}; exports = obj", - output: null, - options: ["exports", { allowBatchAssign: true }], - errors: [ - "Unexpected assignment to 'exports'. Don't modify 'exports' itself.", - ], - }, - ], -}) + { + code: "exports = {foo: 1}", + output: null, + options: ["exports"], + errors: [ + "Unexpected assignment to 'exports'. Don't modify 'exports' itself.", + ], + }, + { + code: "module.exports = {foo: 1}", + output: "exports.foo = 1;", + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports.foo = 1", + output: "exports.foo = 1", + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports = { a: 1 }", + output: "exports.a = 1;", + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports = { a: 1, b: 2 }", + output: "exports.a = 1;\n\nexports.b = 2;", + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports = { // before a\na: 1, // between a and b\nb: 2 // after b\n}", + output: "// before a\nexports.a = 1;\n\n// between a and b\nexports.b = 2;\n// after b", + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "foo(module.exports = {foo: 1})", + output: null, + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "if(foo){ module.exports = { foo: 1};} else { module.exports = {foo: 2};}", + output: null, + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "function bar() { module.exports = { foo: 1 }; }", + output: null, + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports = { get a() {} }", + output: null, + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports = { set a(a) {} }", + output: null, + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports = { a }", + output: "exports.a = a;", + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports = { ...a }", + output: null, + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports = { ['a' + 'b']: 1 }", + output: "exports['a' + 'b'] = 1;", + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports = { 'foo': 1 }", + output: "exports['foo'] = 1;", + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports = { foo(a) {} }", + output: "exports.foo = function (a) {};", + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports = { *foo(a) {} }", + output: "exports.foo = function* (a) {};", + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports = { async foo(a) {} }", + output: "exports.foo = async function (a) {};", + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports.foo()", + output: "exports.foo()", + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "a = module.exports.foo + module.exports['bar']", + output: "a = exports.foo + exports['bar']", + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports = exports = {foo: 1}", + output: null, + options: ["exports"], + errors: [ + "Unexpected access to 'module.exports'. Use 'exports' instead.", + "Unexpected assignment to 'exports'. Don't modify 'exports' itself.", + ], + }, + { + code: "exports = module.exports = {foo: 1}", + output: null, + options: ["exports"], + errors: [ + "Unexpected assignment to 'exports'. Don't modify 'exports' itself.", + "Unexpected access to 'module.exports'. Use 'exports' instead.", + ], + }, + { + code: "module.exports = exports = {foo: 1}; exports = obj", + output: null, + options: ["exports", { allowBatchAssign: true }], + errors: [ + "Unexpected assignment to 'exports'. Don't modify 'exports' itself.", + ], + }, + { + code: "exports = module.exports = {foo: 1}; exports = obj", + output: null, + options: ["exports", { allowBatchAssign: true }], + errors: [ + "Unexpected assignment to 'exports'. Don't modify 'exports' itself.", + ], + }, + ], + } +) diff --git a/tests/lib/rules/file-extension-in-import.js b/tests/lib/rules/file-extension-in-import.js index b8504233..d4f986a9 100644 --- a/tests/lib/rules/file-extension-in-import.js +++ b/tests/lib/rules/file-extension-in-import.js @@ -5,11 +5,12 @@ "use strict" const path = require("path") -const { Linter, RuleTester } = require("eslint") +const { Linter } = require("eslint") +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/file-extension-in-import") const DynamicImportSupported = (() => { - const config = { parserOptions: { ecmaVersion: 2020 } } + const config = { languageOptions: { ecmaVersion: 2020 } } const messages = new Linter().verify("import(s)", config) return messages.length === 0 })() @@ -38,8 +39,7 @@ function fixture(filename) { } new RuleTester({ - parserOptions: { - ecmaVersion: 2015, + languageOptions: { sourceType: "module", }, settings: {}, @@ -333,7 +333,7 @@ new RuleTester({ filename: fixture("test.js"), code: "function f() { import('./a') }", output: "function f() { import('./a.js') }", - parserOptions: { ecmaVersion: 2020 }, + languageOptions: { ecmaVersion: 2020 }, errors: [ { messageId: "requireExt", data: { ext: ".js" } }, ], @@ -343,7 +343,7 @@ new RuleTester({ code: "function f() { import('./a.js') }", output: "function f() { import('./a') }", options: ["never"], - parserOptions: { ecmaVersion: 2020 }, + languageOptions: { ecmaVersion: 2020 }, errors: [ { messageId: "forbidExt", data: { ext: ".js" } }, ], diff --git a/tests/lib/rules/global-require.js b/tests/lib/rules/global-require.js index d2b164ec..ce0cf7e5 100644 --- a/tests/lib/rules/global-require.js +++ b/tests/lib/rules/global-require.js @@ -4,12 +4,12 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/global-require") const ERROR = { messageId: "unexpected", type: "CallExpression" } -new RuleTester({ env: { node: true, es6: true } }).run("global-require", rule, { +new RuleTester().run("global-require", rule, { valid: [ "var x = require('y');", "if (x) { x.require('y'); }", diff --git a/tests/lib/rules/handle-callback-err.js b/tests/lib/rules/handle-callback-err.js index 0fc48bd6..efb313f0 100644 --- a/tests/lib/rules/handle-callback-err.js +++ b/tests/lib/rules/handle-callback-err.js @@ -4,9 +4,9 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/handle-callback-err") -const ruleTester = new RuleTester({ env: { node: true, es6: true } }) +const ruleTester = new RuleTester() const EXPECTED_DECL_ERROR = { messageId: "expected", diff --git a/tests/lib/rules/no-callback-literal.js b/tests/lib/rules/no-callback-literal.js index 42f5b6bf..9fa3d3d1 100644 --- a/tests/lib/rules/no-callback-literal.js +++ b/tests/lib/rules/no-callback-literal.js @@ -4,10 +4,10 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-callback-literal") -const ruleTester = new RuleTester({ env: { node: true, es6: true } }) +const ruleTester = new RuleTester() ruleTester.run("no-callback-literal", rule, { valid: [ // random stuff diff --git a/tests/lib/rules/no-deprecated-api.js b/tests/lib/rules/no-deprecated-api.js index 5f78ce0e..34471a9d 100644 --- a/tests/lib/rules/no-deprecated-api.js +++ b/tests/lib/rules/no-deprecated-api.js @@ -4,10 +4,10 @@ */ "use strict" -const { RuleTester } = require("eslint") +const { RuleTester } = require("#eslint-rule-tester") const rule = require("../../../lib/rules/no-deprecated-api") -const ruleTester = new RuleTester({ env: { node: true, es6: true } }) +const ruleTester = new RuleTester() ruleTester.run("no-deprecated-api", rule, { valid: [ { @@ -36,13 +36,11 @@ ruleTester.run("no-deprecated-api", rule, { }, { code: "import {Buffer} from 'another-buffer'; new Buffer()", - parserOptions: { sourceType: "module" }, - env: { es6: true }, + languageOptions: { sourceType: "module" }, }, { code: "import {request} from 'http'; request()", - parserOptions: { sourceType: "module" }, - env: { es6: true }, + languageOptions: { sourceType: "module" }, }, // On Node v6.8.0, fs.existsSync revived. @@ -56,8 +54,7 @@ ruleTester.run("no-deprecated-api", rule, { }, { code: "import domain from 'domain/';", - parserOptions: { sourceType: "module" }, - env: { es6: true }, + languageOptions: { sourceType: "module" }, }, // https://github.com/mysticatea/eslint-plugin-node/issues/55 @@ -648,8 +645,7 @@ ruleTester.run("no-deprecated-api", rule, { { code: "import b from 'buffer'; new b.Buffer()", options: [{ version: "6.0.0" }], - parserOptions: { sourceType: "module" }, - env: { es6: true }, + languageOptions: { sourceType: "module" }, errors: [ "'new buffer.Buffer()' was deprecated since v6.0.0. Use 'buffer.Buffer.alloc()' or 'buffer.Buffer.from()' instead.", ], @@ -657,8 +653,7 @@ ruleTester.run("no-deprecated-api", rule, { { code: "import b from 'node:buffer'; new b.Buffer()", options: [{ version: "6.0.0" }], - parserOptions: { sourceType: "module" }, - env: { es6: true }, + languageOptions: { sourceType: "module" }, errors: [ "'new buffer.Buffer()' was deprecated since v6.0.0. Use 'buffer.Buffer.alloc()' or 'buffer.Buffer.from()' instead.", ], @@ -666,8 +661,7 @@ ruleTester.run("no-deprecated-api", rule, { { code: "import * as b from 'buffer'; new b.Buffer()", options: [{ version: "6.0.0" }], - parserOptions: { sourceType: "module" }, - env: { es6: true }, + languageOptions: { sourceType: "module" }, errors: [ "'new buffer.Buffer()' was deprecated since v6.0.0. Use 'buffer.Buffer.alloc()' or 'buffer.Buffer.from()' instead.", ], @@ -675,8 +669,7 @@ ruleTester.run("no-deprecated-api", rule, { { code: "import * as b from 'buffer'; new b.default.Buffer()", options: [{ version: "6.0.0" }], - parserOptions: { sourceType: "module" }, - env: { es6: true }, + languageOptions: { sourceType: "module" }, errors: [ "'new buffer.Buffer()' was deprecated since v6.0.0. Use 'buffer.Buffer.alloc()' or 'buffer.Buffer.from()' instead.", ], @@ -684,8 +677,7 @@ ruleTester.run("no-deprecated-api", rule, { { code: "import {Buffer as b} from 'buffer'; new b()", options: [{ version: "6.0.0" }], - parserOptions: { sourceType: "module" }, - env: { es6: true }, + languageOptions: { sourceType: "module" }, errors: [ "'new buffer.Buffer()' was deprecated since v6.0.0. Use 'buffer.Buffer.alloc()' or 'buffer.Buffer.from()' instead.", ], @@ -693,8 +685,7 @@ ruleTester.run("no-deprecated-api", rule, { { code: "import b from 'buffer'; b.SlowBuffer", options: [{ version: "6.0.0" }], - parserOptions: { sourceType: "module" }, - env: { es6: true }, + languageOptions: { sourceType: "module" }, errors: [ "'buffer.SlowBuffer' was deprecated since v6.0.0. Use 'buffer.Buffer.allocUnsafeSlow()' instead.", ], @@ -702,8 +693,7 @@ ruleTester.run("no-deprecated-api", rule, { { code: "import * as b from 'buffer'; b.SlowBuffer", options: [{ version: "6.0.0" }], - parserOptions: { sourceType: "module" }, - env: { es6: true }, + languageOptions: { sourceType: "module" }, errors: [ "'buffer.SlowBuffer' was deprecated since v6.0.0. Use 'buffer.Buffer.allocUnsafeSlow()' instead.", ], @@ -711,8 +701,7 @@ ruleTester.run("no-deprecated-api", rule, { { code: "import * as b from 'buffer'; b.default.SlowBuffer", options: [{ version: "6.0.0" }], - parserOptions: { sourceType: "module" }, - env: { es6: true }, + languageOptions: { sourceType: "module" }, errors: [ "'buffer.SlowBuffer' was deprecated since v6.0.0. Use 'buffer.Buffer.allocUnsafeSlow()' instead.", ], @@ -720,8 +709,7 @@ ruleTester.run("no-deprecated-api", rule, { { code: "import {SlowBuffer as b} from 'buffer';", options: [{ version: "6.0.0" }], - parserOptions: { sourceType: "module" }, - env: { es6: true }, + languageOptions: { sourceType: "module" }, errors: [ "'buffer.SlowBuffer' was deprecated since v6.0.0. Use 'buffer.Buffer.allocUnsafeSlow()' instead.", ], @@ -729,8 +717,7 @@ ruleTester.run("no-deprecated-api", rule, { { code: "import domain from 'domain';", options: [{ version: "4.0.0" }], - parserOptions: { sourceType: "module" }, - env: { es6: true }, + languageOptions: { sourceType: "module" }, errors: ["'domain' module was deprecated since v4.0.0."], }, @@ -816,7 +803,7 @@ ruleTester.run("no-deprecated-api", rule, { { code: "root;", options: [{ version: "6.0.0" }], - globals: { root: false }, + languageOptions: { globals: { root: false } }, errors: [ "'root' was deprecated since v6.0.0. Use 'global' instead.", ], diff --git a/tests/lib/rules/no-exports-assign.js b/tests/lib/rules/no-exports-assign.js index 34ce6657..b565d8a0 100644 --- a/tests/lib/rules/no-exports-assign.js +++ b/tests/lib/rules/no-exports-assign.js @@ -4,13 +4,15 @@ */ "use strict" -const { RuleTester } = require("eslint") +const { RuleTester } = require("#eslint-rule-tester") const rule = require("../../../lib/rules/no-exports-assign.js") new RuleTester({ - globals: { - exports: "writable", - module: "readonly", + languageOptions: { + globals: { + exports: "writable", + module: "readonly", + } }, }).run("no-exports-assign", rule, { valid: [ diff --git a/tests/lib/rules/no-extraneous-import.js b/tests/lib/rules/no-extraneous-import.js index e03fa971..d63de62d 100644 --- a/tests/lib/rules/no-extraneous-import.js +++ b/tests/lib/rules/no-extraneous-import.js @@ -5,11 +5,12 @@ "use strict" const path = require("path") -const { Linter, RuleTester } = require("eslint") +const { Linter } = require("eslint") +const { RuleTester } = require("#eslint-rule-tester") const rule = require("../../../lib/rules/no-extraneous-import") const DynamicImportSupported = (() => { - const config = { parserOptions: { ecmaVersion: 2020 } } + const config = { languageOptions: { ecmaVersion: 2020 } } const messages = new Linter().verify("import(s)", config) return messages.length === 0 })() @@ -31,8 +32,7 @@ function fixture(name) { } const ruleTester = new RuleTester({ - parserOptions: { sourceType: "module" }, - env: { node: true, es6: true }, + languageOptions: { sourceType: "module" }, }) ruleTester.run("no-extraneous-import", rule, { valid: [ @@ -103,7 +103,7 @@ ruleTester.run("no-extraneous-import", rule, { { filename: fixture("dependencies/a.js"), code: "function f() { import('bbb') }", - parserOptions: { ecmaVersion: 2020 }, + languageOptions: { ecmaVersion: 2020 }, errors: ['"bbb" is extraneous.'], }, ] diff --git a/tests/lib/rules/no-extraneous-require.js b/tests/lib/rules/no-extraneous-require.js index eb15c67e..ad8adc0d 100644 --- a/tests/lib/rules/no-extraneous-require.js +++ b/tests/lib/rules/no-extraneous-require.js @@ -5,7 +5,7 @@ "use strict" const path = require("path") -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-extraneous-require") /** @@ -17,7 +17,7 @@ function fixture(name) { return path.resolve(__dirname, "../../fixtures/no-extraneous", name) } -const tester = new RuleTester({ env: { node: true } }) +const tester = new RuleTester() tester.run("no-extraneous-require", rule, { valid: [ diff --git a/tests/lib/rules/no-hide-core-modules.js b/tests/lib/rules/no-hide-core-modules.js index 8f4885aa..bf93ea5b 100644 --- a/tests/lib/rules/no-hide-core-modules.js +++ b/tests/lib/rules/no-hide-core-modules.js @@ -14,7 +14,7 @@ //------------------------------------------------------------------------------ const path = require("path") -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-hide-core-modules") //------------------------------------------------------------------------------ @@ -39,8 +39,7 @@ const INDIRECT_THIRD_PERTY = path.resolve( //------------------------------------------------------------------------------ const tester = new RuleTester({ - parserOptions: { sourceType: "module" }, - env: { node: true, es6: true }, + languageOptions: { sourceType: "module" }, }) tester.run("no-hide-core-modules", rule, { diff --git a/tests/lib/rules/no-missing-import.js b/tests/lib/rules/no-missing-import.js index 79133439..c4c9e8fa 100644 --- a/tests/lib/rules/no-missing-import.js +++ b/tests/lib/rules/no-missing-import.js @@ -5,11 +5,12 @@ "use strict" const path = require("path") -const { Linter, RuleTester } = require("eslint") +const { Linter } = require("eslint") +const { RuleTester } = require("#eslint-rule-tester") const rule = require("../../../lib/rules/no-missing-import") const DynamicImportSupported = (() => { - const config = { parserOptions: { ecmaVersion: 2020 } } + const config = { languageOptions: { ecmaVersion: 2020 } } const messages = new Linter().verify("import(s)", config) return messages.length === 0 })() @@ -39,13 +40,9 @@ function fixture(name) { } const ruleTester = new RuleTester({ - parserOptions: { + languageOptions: { sourceType: "module", }, - env: { - node: true, - es6: true, - }, }) ruleTester.run("no-missing-import", rule, { valid: [ @@ -275,7 +272,7 @@ ruleTester.run("no-missing-import", rule, { { filename: fixture("test.js"), code: "function f() { import(foo) }", - parserOptions: { ecmaVersion: 2020 }, + languageOptions: { ecmaVersion: 2020 }, }, ] : []), @@ -375,7 +372,7 @@ ruleTester.run("no-missing-import", rule, { { filename: fixture("test.js"), code: "function f() { import('no-exist-package-0') }", - parserOptions: { ecmaVersion: 2020 }, + languageOptions: { ecmaVersion: 2020 }, errors: ['"no-exist-package-0" is not found.'], }, ] diff --git a/tests/lib/rules/no-missing-require.js b/tests/lib/rules/no-missing-require.js index 788f8311..cadcfc16 100644 --- a/tests/lib/rules/no-missing-require.js +++ b/tests/lib/rules/no-missing-require.js @@ -5,7 +5,7 @@ "use strict" const path = require("path") -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-missing-require") const tsReactExtensionMap = [ @@ -25,7 +25,7 @@ function fixture(name) { return path.resolve(__dirname, "../../fixtures/no-missing", name) } -const ruleTester = new RuleTester({ env: { node: true, es6: true } }) +const ruleTester = new RuleTester() ruleTester.run("no-missing-require", rule, { valid: [ { @@ -79,7 +79,6 @@ ruleTester.run("no-missing-require", rule, { { filename: fixture("test.js"), code: "require(`eslint`);", - env: { node: true, es6: true }, }, { filename: fixture("test.js"), @@ -127,7 +126,7 @@ ruleTester.run("no-missing-require", rule, { { filename: fixture("test.js"), code: "require('no-exist-package-0');", - globals: { require: "off" }, + languageOptions: { globals: { require: "off" } }, }, // Ignores it if the filename is unknown. @@ -150,7 +149,6 @@ ruleTester.run("no-missing-require", rule, { { filename: fixture("test.js"), code: "require(`foo${bar}`);", - env: { node: true, es6: true }, }, // Should work fine if the filename is relative. diff --git a/tests/lib/rules/no-mixed-requires.js b/tests/lib/rules/no-mixed-requires.js index 7e70e64c..4213b098 100644 --- a/tests/lib/rules/no-mixed-requires.js +++ b/tests/lib/rules/no-mixed-requires.js @@ -4,9 +4,9 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-mixed-requires") -const ruleTester = new RuleTester({ env: { node: true, es6: true } }) +const ruleTester = new RuleTester() ruleTester.run("no-mixed-requires", rule, { valid: [ diff --git a/tests/lib/rules/no-new-require.js b/tests/lib/rules/no-new-require.js index e4b68786..4d88358e 100644 --- a/tests/lib/rules/no-new-require.js +++ b/tests/lib/rules/no-new-require.js @@ -4,10 +4,10 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-new-require") -new RuleTester({ env: { node: true, es6: true } }).run("no-new-require", rule, { +new RuleTester().run("no-new-require", rule, { valid: [ "var appHeader = require('app-header')", "var AppHeader = new (require('app-header'))", diff --git a/tests/lib/rules/no-path-concat.js b/tests/lib/rules/no-path-concat.js index 987fb838..9edf2398 100644 --- a/tests/lib/rules/no-path-concat.js +++ b/tests/lib/rules/no-path-concat.js @@ -5,15 +5,10 @@ "use strict" const path = require("path") -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-path-concat") -new RuleTester({ - env: { - node: true, - es6: true, - }, -}).run("no-path-concat", rule, { +new RuleTester().run("no-path-concat", rule, { valid: [ 'var fullPath = dirname + "foo.js";', 'var fullPath = __dirname == "foo.js";', diff --git a/tests/lib/rules/no-process-env.js b/tests/lib/rules/no-process-env.js index 356f72de..2111ab39 100644 --- a/tests/lib/rules/no-process-env.js +++ b/tests/lib/rules/no-process-env.js @@ -4,10 +4,10 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-process-env") -new RuleTester({ env: { node: true, es6: true } }).run("no-process-env", rule, { +new RuleTester().run("no-process-env", rule, { valid: [ "Process.env", "process[env]", diff --git a/tests/lib/rules/no-process-exit.js b/tests/lib/rules/no-process-exit.js index 0c8a1fe4..a5226a0d 100644 --- a/tests/lib/rules/no-process-exit.js +++ b/tests/lib/rules/no-process-exit.js @@ -4,9 +4,9 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-process-exit") -const ruleTester = new RuleTester({ env: { node: true, es6: true } }) +const ruleTester = new RuleTester() ruleTester.run("no-process-exit", rule, { valid: ["Process.exit()", "var exit = process.exit;", "f(process.exit)"], diff --git a/tests/lib/rules/no-restricted-import.js b/tests/lib/rules/no-restricted-import.js index 03619122..67b17ef6 100644 --- a/tests/lib/rules/no-restricted-import.js +++ b/tests/lib/rules/no-restricted-import.js @@ -5,11 +5,12 @@ "use strict" const path = require("path") -const { Linter, RuleTester } = require("eslint") +const { Linter } = require("eslint") +const { RuleTester } = require("#eslint-rule-tester") const rule = require("../../../lib/rules/no-restricted-import") const DynamicImportSupported = (() => { - const config = { parserOptions: { ecmaVersion: 2020 } } + const config = { languageOptions: { ecmaVersion: 2020 } } const messages = new Linter().verify("import(s)", config) return messages.length === 0 })() @@ -22,8 +23,7 @@ if (!DynamicImportSupported) { } new RuleTester({ - parserOptions: { sourceType: "module" }, - env: { node: true, es6: true }, + languageOptions: { sourceType: "module" }, }).run("no-restricted-import", rule, { valid: [ { code: 'import "fs"', options: [["crypto"]] }, @@ -74,7 +74,7 @@ new RuleTester({ { code: "import(fs)", options: [["fs"]], - parserOptions: { ecmaVersion: 2020 }, + languageOptions: { ecmaVersion: 2020 }, }, ] : []), @@ -271,7 +271,7 @@ new RuleTester({ { code: 'import("fs")', options: [["fs"]], - parserOptions: { ecmaVersion: 2020 }, + languageOptions: { ecmaVersion: 2020 }, errors: [ { messageId: "restricted", diff --git a/tests/lib/rules/no-restricted-require.js b/tests/lib/rules/no-restricted-require.js index 8970408c..340b8f9e 100644 --- a/tests/lib/rules/no-restricted-require.js +++ b/tests/lib/rules/no-restricted-require.js @@ -5,12 +5,10 @@ "use strict" const path = require("path") -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-restricted-require") -new RuleTester({ - globals: { require: "readonly" }, -}).run("no-restricted-require", rule, { +new RuleTester().run("no-restricted-require", rule, { valid: [ { code: 'require("fs")', options: [["crypto"]] }, { code: 'require("path")', options: [["crypto", "stream", "os"]] }, diff --git a/tests/lib/rules/no-sync.js b/tests/lib/rules/no-sync.js index 223d8f1a..f4fcf0b8 100644 --- a/tests/lib/rules/no-sync.js +++ b/tests/lib/rules/no-sync.js @@ -4,10 +4,10 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-sync") -new RuleTester({ env: { node: true, es6: true } }).run("no-sync", rule, { +new RuleTester().run("no-sync", rule, { valid: [ "var foo = fs.foo.foo();", { diff --git a/tests/lib/rules/no-unpublished-bin.js b/tests/lib/rules/no-unpublished-bin.js index 83845a2f..35c1cb96 100644 --- a/tests/lib/rules/no-unpublished-bin.js +++ b/tests/lib/rules/no-unpublished-bin.js @@ -5,7 +5,7 @@ "use strict" const path = require("path") -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-unpublished-bin") /** @@ -17,7 +17,7 @@ function fixture(name) { return path.resolve(__dirname, "../../fixtures/no-unpublished-bin", name) } -new RuleTester({ env: { node: true, es6: true } }).run( +new RuleTester().run( "no-unpublished-bin", rule, { diff --git a/tests/lib/rules/no-unpublished-import.js b/tests/lib/rules/no-unpublished-import.js index 60260547..99bbc4f6 100644 --- a/tests/lib/rules/no-unpublished-import.js +++ b/tests/lib/rules/no-unpublished-import.js @@ -5,11 +5,13 @@ "use strict" const path = require("path") -const { Linter, RuleTester } = require("eslint") +const { Linter } = require("eslint") +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-unpublished-import") +const globals = require("globals") const DynamicImportSupported = (() => { - const config = { parserOptions: { ecmaVersion: 2020 } } + const config = { languageOptions: { ecmaVersion: 2020 } } const messages = new Linter().verify("import(s)", config) return messages.length === 0 })() @@ -31,9 +33,9 @@ function fixture(name) { } const ruleTester = new RuleTester({ - parserOptions: { - ecmaVersion: 2015, + languageOptions: { sourceType: "module", + env: { node: false }, }, }) ruleTester.run("no-unpublished-import", rule, { @@ -137,7 +139,7 @@ ruleTester.run("no-unpublished-import", rule, { { filename: fixture("3/src/readme.js"), code: "import bbb from 'bbb';", - env: { node: true }, + languageOptions: { globals: globals.node }, }, // Negative patterns in files field. @@ -155,10 +157,7 @@ ruleTester.run("no-unpublished-import", rule, { // https://github.com/eslint-community/eslint-plugin-n/issues/78 { filename: fixture("1/test.ts"), - parser: path.join( - __dirname, - "../../../node_modules/@typescript-eslint/parser" - ), + languageOptions: { parser: require("@typescript-eslint/parser") }, code: "import type foo from 'foo';", options: [{ ignoreTypeImport: true }], }, @@ -268,7 +267,7 @@ ruleTester.run("no-unpublished-import", rule, { { filename: fixture("1/test.js"), code: "import a from '../2/a.js';", - env: { node: true }, + languageOptions: { globals: globals.node }, errors: ['"../2/a.js" is not published.'], }, @@ -278,7 +277,7 @@ ruleTester.run("no-unpublished-import", rule, { { filename: fixture("2/test.js"), code: "function f() { import('./ignore1.js') }", - parserOptions: { ecmaVersion: 2020 }, + languageOptions: { ecmaVersion: 2020 }, errors: ['"./ignore1.js" is not published.'], }, ] @@ -287,10 +286,7 @@ ruleTester.run("no-unpublished-import", rule, { // https://github.com/eslint-community/eslint-plugin-n/issues/78 { filename: fixture("1/test.ts"), - parser: path.join( - __dirname, - "../../../node_modules/@typescript-eslint/parser" - ), + languageOptions: { parser: require("@typescript-eslint/parser") }, code: "import type foo from 'foo';", options: [{ ignoreTypeImport: false }], errors: [{ messageId: "notPublished" }], @@ -298,10 +294,7 @@ ruleTester.run("no-unpublished-import", rule, { { filename: fixture("1/test.ts"), - parser: path.join( - __dirname, - "../../../node_modules/@typescript-eslint/parser" - ), + languageOptions: { parser: require("@typescript-eslint/parser") }, code: "import type foo from 'foo';", errors: [{ messageId: "notPublished" }], }, diff --git a/tests/lib/rules/no-unpublished-require.js b/tests/lib/rules/no-unpublished-require.js index a4bf96c1..864cb042 100644 --- a/tests/lib/rules/no-unpublished-require.js +++ b/tests/lib/rules/no-unpublished-require.js @@ -5,7 +5,7 @@ "use strict" const path = require("path") -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-unpublished-require") /** @@ -17,7 +17,7 @@ function fixture(name) { return path.resolve(__dirname, "../../fixtures/no-unpublished", name) } -const ruleTester = new RuleTester({ env: { node: true, es6: true } }) +const ruleTester = new RuleTester() ruleTester.run("no-unpublished-require", rule, { valid: [ { @@ -181,7 +181,6 @@ ruleTester.run("no-unpublished-require", rule, { { filename: fixture("1/test.js"), code: "require(`foo${bar}`);", - env: { node: true, es6: true }, }, // Should work fine if the filename is relative. diff --git a/tests/lib/rules/no-unsupported-features.js b/tests/lib/rules/no-unsupported-features.js index ea139d3e..8351e7f9 100644 --- a/tests/lib/rules/no-unsupported-features.js +++ b/tests/lib/rules/no-unsupported-features.js @@ -5,7 +5,7 @@ "use strict" const path = require("path") -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/no-unsupported-features") const VERSION_MAP = new Map([ @@ -68,12 +68,11 @@ function convertPattern(retv, pattern) { // If this is supported, add to a valid pattern. retv.valid.push({ code: `/*${pattern.name}: ${versionText}*/ ${pattern.code}`, - env: { es6: true }, - globals: { SharedArrayBuffer: false, Atomics: false }, options: [version], - parserOptions: { + languageOptions: { ecmaVersion: 2018, sourceType: pattern.modules ? "module" : "script", + globals: { SharedArrayBuffer: false, Atomics: false }, }, }) } else { @@ -82,12 +81,11 @@ function convertPattern(retv, pattern) { retv.valid, pattern.keys.map(key => ({ code: `/*${pattern.name}: ${versionText}, ignores: ["${key}"]*/ ${pattern.code}`, - env: { es6: true }, - globals: { SharedArrayBuffer: false, Atomics: false }, options: [{ version, ignores: [key] }], - parserOptions: { + languageOptions: { ecmaVersion: 2018, sourceType: pattern.modules ? "module" : "script", + globals: { SharedArrayBuffer: false, Atomics: false }, }, })) ) @@ -95,12 +93,11 @@ function convertPattern(retv, pattern) { // If this is not supported, add to a invalid pattern. retv.invalid.push({ code: `/*${pattern.name}: ${versionText}*/ ${pattern.code}`, - env: { es6: true }, - globals: { SharedArrayBuffer: false, Atomics: false }, options: [version], - parserOptions: { + languageOptions: { ecmaVersion: 2018, sourceType: pattern.modules ? "module" : "script", + globals: { SharedArrayBuffer: false, Atomics: false }, }, errors: errors.map(message => `${message + versionText}.`), }) @@ -123,7 +120,7 @@ function fixture(name) { ) } -const ruleTester = new RuleTester({ env: { node: true, es6: true } }) +const ruleTester = new RuleTester() ruleTester.run( "no-unsupported-features", rule, @@ -1299,64 +1296,56 @@ ruleTester.run( { filename: fixture("gte-4.0.0/a.js"), code: "var a = () => 1", - env: { es6: true }, }, { filename: fixture("gte-4.4.0-lt-5.0.0/a.js"), code: "var a = () => 1", - env: { es6: true }, }, { filename: fixture("hat-4.1.2/a.js"), code: "var a = () => 1", - env: { es6: true }, }, { code: "'\\\\u{0123}'", - env: { es6: true }, }, { filename: fixture("gte-4.0.0/a.js"), code: "var a = async () => 1", - parserOptions: { ecmaVersion: 2017 }, + languageOptions: { ecmaVersion: 2017 }, options: [{ ignores: ["asyncAwait"] }], }, { filename: fixture("gte-7.6.0/a.js"), code: "var a = async () => 1", - parserOptions: { ecmaVersion: 2017 }, + languageOptions: { ecmaVersion: 2017 }, }, { filename: fixture("gte-7.10.0/a.js"), code: "var a = async () => 1", - parserOptions: { ecmaVersion: 2017 }, + languageOptions: { ecmaVersion: 2017 }, }, { filename: fixture("invalid/a.js"), code: "var a = () => 1", - env: { es6: true }, }, { filename: fixture("nothing/a.js"), code: "var a = () => 1", - env: { es6: true }, }, { code: "var a = async () => 1", - parserOptions: { ecmaVersion: 2017 }, + languageOptions: { ecmaVersion: 2017 }, options: ["7.10.0"], }, { filename: fixture("without-node/a.js"), code: "var a = () => 1", - env: { es6: true }, }, ], invalid: [ { filename: fixture("gte-0.12.8/a.js"), code: "var a = () => 1", - env: { es6: true }, errors: [ "Arrow functions are not supported yet on Node >=0.12.8.", ], @@ -1364,8 +1353,7 @@ ruleTester.run( { filename: fixture("invalid/a.js"), code: "var a = (b,) => 1", - parserOptions: { ecmaVersion: 2017 }, - env: { es6: true }, + languageOptions: { ecmaVersion: 2017 }, errors: [ "Trailing commas in functions are not supported yet on Node 4.0.0.", ], @@ -1373,8 +1361,7 @@ ruleTester.run( { filename: fixture("lt-6.0.0/a.js"), code: "var a = () => 1", - parserOptions: { ecmaVersion: 2017 }, - env: { es6: true }, + languageOptions: { ecmaVersion: 2017 }, errors: [ "Arrow functions are not supported yet on Node <6.0.0.", ], @@ -1382,8 +1369,7 @@ ruleTester.run( { filename: fixture("nothing/a.js"), code: "var a = (b,) => 1", - parserOptions: { ecmaVersion: 2017 }, - env: { es6: true }, + languageOptions: { ecmaVersion: 2017 }, errors: [ "Trailing commas in functions are not supported yet on Node 4.0.0.", ], @@ -1391,14 +1377,14 @@ ruleTester.run( { filename: fixture("gte-7.5.0/a.js"), code: "var a = async () => 1", - parserOptions: { ecmaVersion: 2017 }, + languageOptions: { ecmaVersion: 2017 }, errors: [ "Async functions are not supported yet on Node >=7.5.0.", ], }, { code: "var a = async () => 1", - parserOptions: { ecmaVersion: 2017 }, + languageOptions: { ecmaVersion: 2017 }, options: ["7.1.0"], errors: [ "Async functions are not supported yet on Node 7.1.0.", diff --git a/tests/lib/rules/no-unsupported-features/es-builtins.js b/tests/lib/rules/no-unsupported-features/es-builtins.js index 424b88bf..870698d6 100644 --- a/tests/lib/rules/no-unsupported-features/es-builtins.js +++ b/tests/lib/rules/no-unsupported-features/es-builtins.js @@ -3,10 +3,9 @@ * See LICENSE file in root directory for full license. */ "use strict" - -const { RuleTester } = require("eslint") -const { builtin } = require("globals") +const { RuleTester } = require("#eslint-rule-tester") const rule = require("../../../../lib/rules/no-unsupported-features/es-builtins") +const globals = require("globals") /** * Clone given invalid patterns with adding `ignores` option. @@ -65,8 +64,7 @@ function concat(patterns) { } const ruleTester = new RuleTester({ - parserOptions: { ecmaVersion: 2018 }, - globals: builtin, + languageOptions: { ecmaVersion: 2018, globals: globals.builtin }, }) ruleTester.run( "no-unsupported-features/es-builtins", diff --git a/tests/lib/rules/no-unsupported-features/es-syntax.js b/tests/lib/rules/no-unsupported-features/es-syntax.js index 73808f71..17287978 100644 --- a/tests/lib/rules/no-unsupported-features/es-syntax.js +++ b/tests/lib/rules/no-unsupported-features/es-syntax.js @@ -5,20 +5,20 @@ "use strict" const path = require("path") -const { Linter, RuleTester } = require("eslint") -const { builtin } = require("globals") +const { Linter } = require("eslint") +const RuleTester = require("#eslint-rule-tester").RuleTester const { Range } = require("semver") const rule = require("../../../../lib/rules/no-unsupported-features/es-syntax") const ES2021Supported = (() => { - const config = { parserOptions: { ecmaVersion: 2021 } } + const config = { languageOptions: { ecmaVersion: 2021 } } const messages = new Linter().verify("0n", config) return messages.length === 0 })() const ES2020Supported = ES2021Supported || (() => { - const config = { parserOptions: { ecmaVersion: 2020 } } + const config = { languageOptions: { ecmaVersion: 2020 } } const messages = new Linter().verify("0n", config) return messages.length === 0 })() @@ -100,8 +100,7 @@ function concat(patterns) { } const ruleTester = new RuleTester({ - parserOptions: { ecmaVersion }, - globals: builtin, + languageOptions: { ecmaVersion, env: { node: false } }, }) ruleTester.run( "no-unsupported-features/es-syntax", @@ -859,29 +858,29 @@ ruleTester.run( }, { code: "import a from 'a'", - parserOptions: { sourceType: "module" }, + languageOptions: { sourceType: "module" }, options: [{ version: "13.1.0", ignores: ["modules"] }], }, { code: "export default {}", - parserOptions: { sourceType: "module" }, + languageOptions: { sourceType: "module" }, options: [{ version: "13.1.0", ignores: ["modules"] }], }, { code: "export const a = {}", - parserOptions: { sourceType: "module" }, + languageOptions: { sourceType: "module" }, options: [{ version: "13.1.0", ignores: ["modules"] }], }, { code: "export {}", - parserOptions: { sourceType: "module" }, + languageOptions: { sourceType: "module" }, options: [{ version: "13.1.0", ignores: ["modules"] }], }, ], invalid: [ { code: "import a from 'a'", - parserOptions: { sourceType: "module" }, + languageOptions: { sourceType: "module" }, options: [{ version: "10.0.0" }], errors: [ { @@ -892,7 +891,7 @@ ruleTester.run( }, { code: "export default {}", - parserOptions: { sourceType: "module" }, + languageOptions: { sourceType: "module" }, options: [{ version: "10.0.0" }], errors: [ { @@ -903,7 +902,7 @@ ruleTester.run( }, { code: "export const a = {}", - parserOptions: { sourceType: "module" }, + languageOptions: { sourceType: "module" }, options: [{ version: "10.0.0" }], errors: [ { @@ -914,7 +913,7 @@ ruleTester.run( }, { code: "export {}", - parserOptions: { sourceType: "module" }, + languageOptions: { sourceType: "module" }, options: [{ version: "10.0.0" }], errors: [ { diff --git a/tests/lib/rules/no-unsupported-features/node-builtins.js b/tests/lib/rules/no-unsupported-features/node-builtins.js index 910ab88c..ed6422e4 100644 --- a/tests/lib/rules/no-unsupported-features/node-builtins.js +++ b/tests/lib/rules/no-unsupported-features/node-builtins.js @@ -4,7 +4,7 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../../lib/rules/no-unsupported-features/node-builtins") /** @@ -26,10 +26,7 @@ function concat(patterns) { return ret } -new RuleTester({ - parserOptions: { sourceType: "module" }, - env: { node: true, es6: true }, -}).run( +new RuleTester({ languageOptions: { sourceType: "module" } }).run( "no-unsupported-features/node-builtins", rule, concat([ diff --git a/tests/lib/rules/prefer-global/buffer.js b/tests/lib/rules/prefer-global/buffer.js index 6a43622c..936f0fe2 100644 --- a/tests/lib/rules/prefer-global/buffer.js +++ b/tests/lib/rules/prefer-global/buffer.js @@ -4,12 +4,10 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../../lib/rules/prefer-global/buffer") -new RuleTester({ - env: { node: true, es6: true }, -}).run("prefer-global/buffer", rule, { +new RuleTester().run("prefer-global/buffer", rule, { valid: [ "var b = Buffer.alloc(10)", { diff --git a/tests/lib/rules/prefer-global/console.js b/tests/lib/rules/prefer-global/console.js index fcdb4b67..e611f647 100644 --- a/tests/lib/rules/prefer-global/console.js +++ b/tests/lib/rules/prefer-global/console.js @@ -4,12 +4,10 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../../lib/rules/prefer-global/console") -new RuleTester({ - env: { node: true, es6: true }, -}).run("prefer-global/console", rule, { +new RuleTester().run("prefer-global/console", rule, { valid: [ "console.log(10)", { diff --git a/tests/lib/rules/prefer-global/process.js b/tests/lib/rules/prefer-global/process.js index 8dbb0d51..8df0c8a7 100644 --- a/tests/lib/rules/prefer-global/process.js +++ b/tests/lib/rules/prefer-global/process.js @@ -4,12 +4,10 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../../lib/rules/prefer-global/process") -new RuleTester({ - env: { node: true, es6: true }, -}).run("prefer-global/process", rule, { +new RuleTester().run("prefer-global/process", rule, { valid: [ "process.exit(0)", { diff --git a/tests/lib/rules/prefer-global/text-decoder.js b/tests/lib/rules/prefer-global/text-decoder.js index bed954b5..5c561857 100644 --- a/tests/lib/rules/prefer-global/text-decoder.js +++ b/tests/lib/rules/prefer-global/text-decoder.js @@ -4,12 +4,10 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../../lib/rules/prefer-global/text-decoder") -new RuleTester({ - env: { node: true, es6: true }, -}).run("prefer-global/text-decoder", rule, { +new RuleTester().run("prefer-global/text-decoder", rule, { valid: [ "var b = new TextDecoder(s)", { diff --git a/tests/lib/rules/prefer-global/text-encoder.js b/tests/lib/rules/prefer-global/text-encoder.js index 4e422ca9..c1b03210 100644 --- a/tests/lib/rules/prefer-global/text-encoder.js +++ b/tests/lib/rules/prefer-global/text-encoder.js @@ -4,12 +4,10 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../../lib/rules/prefer-global/text-encoder") -new RuleTester({ - env: { node: true, es6: true }, -}).run("prefer-global/text-encoder", rule, { +new RuleTester().run("prefer-global/text-encoder", rule, { valid: [ "var b = new TextEncoder(s)", { diff --git a/tests/lib/rules/prefer-global/url-search-params.js b/tests/lib/rules/prefer-global/url-search-params.js index 23a08564..031e3115 100644 --- a/tests/lib/rules/prefer-global/url-search-params.js +++ b/tests/lib/rules/prefer-global/url-search-params.js @@ -4,12 +4,10 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../../lib/rules/prefer-global/url-search-params") -new RuleTester({ - env: { node: true, es6: true }, -}).run("prefer-global/url-search-params", rule, { +new RuleTester().run("prefer-global/url-search-params", rule, { valid: [ "var b = new URLSearchParams(s)", { diff --git a/tests/lib/rules/prefer-global/url.js b/tests/lib/rules/prefer-global/url.js index dd7a9af8..a06218f1 100644 --- a/tests/lib/rules/prefer-global/url.js +++ b/tests/lib/rules/prefer-global/url.js @@ -4,12 +4,10 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../../lib/rules/prefer-global/url") -new RuleTester({ - env: { node: true, es6: true }, -}).run("prefer-global/url", rule, { +new RuleTester().run("prefer-global/url", rule, { valid: [ "var b = new URL(s)", { diff --git a/tests/lib/rules/prefer-promises/dns.js b/tests/lib/rules/prefer-promises/dns.js index c264559f..63958469 100644 --- a/tests/lib/rules/prefer-promises/dns.js +++ b/tests/lib/rules/prefer-promises/dns.js @@ -4,12 +4,11 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../../lib/rules/prefer-promises/dns") new RuleTester({ - parserOptions: { sourceType: "module" }, - env: { node: true, es6: true }, + languageOptions: { sourceType: "module" }, }).run("prefer-promises/dns", rule, { valid: [ "const dns = require('dns'); dns.lookupSync()", diff --git a/tests/lib/rules/prefer-promises/fs.js b/tests/lib/rules/prefer-promises/fs.js index d9a3645e..2a717e06 100644 --- a/tests/lib/rules/prefer-promises/fs.js +++ b/tests/lib/rules/prefer-promises/fs.js @@ -4,12 +4,11 @@ */ "use strict" -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../../lib/rules/prefer-promises/fs") new RuleTester({ - parserOptions: { sourceType: "module" }, - env: { node: true, es6: true }, + languageOptions: { sourceType: "module" }, }).run("prefer-promises/fs", rule, { valid: [ "const fs = require('fs'); fs.createReadStream()", diff --git a/tests/lib/rules/shebang.js b/tests/lib/rules/shebang.js index 900a6d52..47d9460c 100644 --- a/tests/lib/rules/shebang.js +++ b/tests/lib/rules/shebang.js @@ -5,7 +5,7 @@ "use strict" const path = require("path") -const RuleTester = require("eslint").RuleTester +const RuleTester = require("#eslint-rule-tester").RuleTester const rule = require("../../../lib/rules/shebang") /** @@ -17,7 +17,7 @@ function fixture(name) { return path.resolve(__dirname, "../../fixtures/shebang", name) } -const ruleTester = new RuleTester({ env: { node: true, es6: true } }) +const ruleTester = new RuleTester() ruleTester.run("shebang", rule, { valid: [ {