diff --git a/.gitignore b/.gitignore index 642ad460..281b1c34 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ .idea -.nyc_output +coverage .vscode node_modules/ npm-debug.log diff --git a/eslint.config.js b/eslint.config.js index 24f9f4ea..b25c54b1 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -2,7 +2,6 @@ const js = require('@eslint/js'); const { FlatCompat } = require('@eslint/eslintrc'); -const globals = require('globals'); const markdown = require('eslint-plugin-markdown'); const pluginN = require('eslint-plugin-n'); const eslintPluginConfig = require('eslint-plugin-eslint-plugin/configs/all'); @@ -54,7 +53,7 @@ module.exports = [ }, { files: ['tests/**/*.js'], - languageOptions: { globals: globals.mocha }, + languageOptions: { sourceType: 'module' }, }, { files: ['**/*.md'], diff --git a/package.json b/package.json index 939af51f..63da8091 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "lint:js-docs": "eslint --no-inline-config \"**/*.md\"", "lint:package-json": "npmPkgJsonLint .", "release": "release-it", - "test": "nyc --all --check-coverage --include lib mocha tests --recursive", + "test": "vitest run --coverage", "test:remote": "eslint-remote-tester -c ./eslint-remote-tester.config.mjs", "update:eslint-docs": "eslint-doc-generator" }, @@ -43,12 +43,6 @@ "@eslint-community/eslint-utils": "^4.4.0", "estraverse": "^5.3.0" }, - "nyc": { - "branches": 95, - "functions": 99, - "lines": 99, - "statements": 99 - }, "devDependencies": { "@commitlint/cli": "^19.6.0", "@commitlint/config-conventional": "^19.6.0", @@ -60,7 +54,7 @@ "@types/estree": "^1.0.8", "@typescript-eslint/parser": "^8.34.1", "@typescript-eslint/utils": "^8.34.1", - "chai": "^4.5.0", + "@vitest/coverage-istanbul": "^3.2.4", "eslint": "^9.16.0", "eslint-config-not-an-aardvark": "^2.1.0", "eslint-config-prettier": "^9.1.0", @@ -73,17 +67,15 @@ "eslint-remote-tester": "^4.0.1", "eslint-scope": "^8.0.1", "espree": "^10.0.1", - "globals": "^15.13.0", "husky": "^9.1.7", "lodash": "^4.17.21", "markdownlint-cli": "^0.43.0", - "mocha": "^11.0.0", "npm-package-json-lint": "^8.0.0", "npm-run-all2": "^7.0.1", - "nyc": "^17.1.0", "prettier": "^3.4.1", "release-it": "^17.2.0", - "typescript": "^5.8.3" + "typescript": "^5.8.3", + "vitest": "^3.2.4" }, "peerDependencies": { "eslint": ">=8.23.0" diff --git a/tests/lib/eslint-rule-tester.js b/tests/lib/eslint-rule-tester.js deleted file mode 100644 index dd16a8e2..00000000 --- a/tests/lib/eslint-rule-tester.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * @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'); - -// greater than or equal to ESLint v9 -exports.gteEslintV9 = +eslintVersion.split('.')[0] >= 9; - -exports.RuleTester = exports.gteEslintV9 ? RuleTester : FlatRuleTester; diff --git a/tests/lib/fixtures/tsconfig.json b/tests/lib/fixtures/tsconfig.json index 0d505be7..403ce01b 100644 --- a/tests/lib/fixtures/tsconfig.json +++ b/tests/lib/fixtures/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { "moduleResolution": "NodeNext" - } + }, + "include": ["*.ts"] } diff --git a/tests/lib/index.js b/tests/lib/index.js index 794d0d57..96f52e44 100644 --- a/tests/lib/index.js +++ b/tests/lib/index.js @@ -1,7 +1,6 @@ -'use strict'; +import { assert, describe, it } from 'vitest'; -const assert = require('chai').assert; -const plugin = require('../..'); +import plugin from '../../lib/index.js'; const RULE_NAMES = Object.keys(plugin.rules); diff --git a/tests/lib/rule-setup.js b/tests/lib/rule-setup.js index a1c75e82..ab097bc3 100644 --- a/tests/lib/rule-setup.js +++ b/tests/lib/rule-setup.js @@ -1,15 +1,17 @@ -'use strict'; +import { readdirSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; -const { readdirSync, readFileSync } = require('fs'); -const path = require('path'); -const assert = require('chai').assert; -const plugin = require('../..'); +import { assert, describe, it } from 'vitest'; + +import plugin from '../../lib/index.js'; const RULE_NAMES = Object.keys(plugin.rules); +const dirname = path.dirname(fileURLToPath(import.meta.url)); describe('rule setup is correct', () => { it('should have a list of exported rules and rules directory that match', () => { - const filePath = path.join(__dirname, '..', 'lib', 'rules'); + const filePath = path.join(dirname, '..', 'lib', 'rules'); const files = readdirSync(filePath); assert.deepStrictEqual( @@ -34,7 +36,7 @@ describe('rule setup is correct', () => { it('should have the right contents', () => { const filePath = path.join( - __dirname, + dirname, '..', '..', 'lib', @@ -53,7 +55,7 @@ describe('rule setup is correct', () => { }); it('should have tests for all rules', () => { - const filePath = path.join(__dirname, 'rules'); + const filePath = path.join(dirname, 'rules'); const files = readdirSync(filePath); assert.deepStrictEqual( @@ -65,7 +67,7 @@ describe('rule setup is correct', () => { }); it('should have documentation for all rules', () => { - const filePath = path.join(__dirname, '..', '..', 'docs', 'rules'); + const filePath = path.join(dirname, '..', '..', 'docs', 'rules'); const files = readdirSync(filePath); assert.deepStrictEqual( diff --git a/tests/lib/rules/consistent-output.js b/tests/lib/rules/consistent-output.js index 75ecabe8..60ac1899 100644 --- a/tests/lib/rules/consistent-output.js +++ b/tests/lib/rules/consistent-output.js @@ -3,14 +3,12 @@ * @author Teddy Katz */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/consistent-output'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/consistent-output.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; const ERROR = { messageId: 'missingOutput', type: 'ObjectExpression' }; diff --git a/tests/lib/rules/fixer-return.js b/tests/lib/rules/fixer-return.js index 349a9bf4..cc3798c5 100644 --- a/tests/lib/rules/fixer-return.js +++ b/tests/lib/rules/fixer-return.js @@ -3,14 +3,12 @@ * @author 薛定谔的猫 */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/fixer-return'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/fixer-return.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/meta-property-ordering.js b/tests/lib/rules/meta-property-ordering.js index 1d4dfec8..1a843e94 100644 --- a/tests/lib/rules/meta-property-ordering.js +++ b/tests/lib/rules/meta-property-ordering.js @@ -2,14 +2,12 @@ * @fileoverview Enforces the order of meta properties */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/meta-property-ordering'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/meta-property-ordering.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/no-deprecated-context-methods.js b/tests/lib/rules/no-deprecated-context-methods.js index 84770ccd..7338f37e 100644 --- a/tests/lib/rules/no-deprecated-context-methods.js +++ b/tests/lib/rules/no-deprecated-context-methods.js @@ -3,14 +3,12 @@ * @author Teddy Katz */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/no-deprecated-context-methods'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/no-deprecated-context-methods.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/no-deprecated-report-api.js b/tests/lib/rules/no-deprecated-report-api.js index 6483fbde..ed1bd422 100644 --- a/tests/lib/rules/no-deprecated-report-api.js +++ b/tests/lib/rules/no-deprecated-report-api.js @@ -3,14 +3,12 @@ * @author Teddy Katz */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/no-deprecated-report-api'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/no-deprecated-report-api.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/no-identical-tests.js b/tests/lib/rules/no-identical-tests.js index 6f0e444e..bcfcd8cd 100644 --- a/tests/lib/rules/no-identical-tests.js +++ b/tests/lib/rules/no-identical-tests.js @@ -3,14 +3,12 @@ * @author 薛定谔的猫 */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/no-identical-tests'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/no-identical-tests.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; const ERROR_OBJECT_TEST = { messageId: 'identical', type: 'ObjectExpression' }; const ERROR_STRING_TEST = { messageId: 'identical', type: 'Literal' }; diff --git a/tests/lib/rules/no-meta-replaced-by.js b/tests/lib/rules/no-meta-replaced-by.js index d72f41ac..2d357a39 100644 --- a/tests/lib/rules/no-meta-replaced-by.js +++ b/tests/lib/rules/no-meta-replaced-by.js @@ -2,14 +2,12 @@ * @fileoverview Disallows the usage of `meta.replacedBy` property */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/no-meta-replaced-by'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/no-meta-replaced-by.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/no-meta-schema-default.js b/tests/lib/rules/no-meta-schema-default.js index 869f4971..06376284 100644 --- a/tests/lib/rules/no-meta-schema-default.js +++ b/tests/lib/rules/no-meta-schema-default.js @@ -1,11 +1,9 @@ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/no-meta-schema-default'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/no-meta-schema-default.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/no-missing-message-ids.js b/tests/lib/rules/no-missing-message-ids.js index 78b9e600..efee8a9d 100644 --- a/tests/lib/rules/no-missing-message-ids.js +++ b/tests/lib/rules/no-missing-message-ids.js @@ -1,11 +1,9 @@ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/no-missing-message-ids'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/no-missing-message-ids.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/no-missing-placeholders.js b/tests/lib/rules/no-missing-placeholders.js index 43bb137b..13767ec2 100644 --- a/tests/lib/rules/no-missing-placeholders.js +++ b/tests/lib/rules/no-missing-placeholders.js @@ -3,14 +3,12 @@ * @author Teddy Katz */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/no-missing-placeholders'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/no-missing-placeholders.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; /** * Create an error for the given key diff --git a/tests/lib/rules/no-only-tests.js b/tests/lib/rules/no-only-tests.js index 0df7e600..25257c65 100644 --- a/tests/lib/rules/no-only-tests.js +++ b/tests/lib/rules/no-only-tests.js @@ -1,11 +1,9 @@ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/no-only-tests'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/no-only-tests.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/no-property-in-node.js b/tests/lib/rules/no-property-in-node.js index 952e976f..c7225404 100644 --- a/tests/lib/rules/no-property-in-node.js +++ b/tests/lib/rules/no-property-in-node.js @@ -1,12 +1,11 @@ -'use strict'; - -const RuleTester = require('../eslint-rule-tester').RuleTester; -const path = require('path'); -const rule = require('../../../lib/rules/no-property-in-node'); +import { RuleTester } from '../../utils/eslint-rule-tester.js'; +import path from 'path'; +import rule from '../../../lib/rules/no-property-in-node.js'; +import parser from '@typescript-eslint/parser'; const ruleTester = new RuleTester({ languageOptions: { - parser: require('@typescript-eslint/parser'), + parser, parserOptions: { projectService: { defaultProject: 'tsconfig.json', diff --git a/tests/lib/rules/no-unused-message-ids.js b/tests/lib/rules/no-unused-message-ids.js index 8f5f6fa8..54184cdc 100644 --- a/tests/lib/rules/no-unused-message-ids.js +++ b/tests/lib/rules/no-unused-message-ids.js @@ -1,11 +1,9 @@ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/no-unused-message-ids'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/no-unused-message-ids.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/no-unused-placeholders.js b/tests/lib/rules/no-unused-placeholders.js index fd93b777..87de5cb9 100644 --- a/tests/lib/rules/no-unused-placeholders.js +++ b/tests/lib/rules/no-unused-placeholders.js @@ -3,14 +3,12 @@ * @author 薛定谔的猫 */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/no-unused-placeholders'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/no-unused-placeholders.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; /** * Create an error for the given key diff --git a/tests/lib/rules/no-useless-token-range.js b/tests/lib/rules/no-useless-token-range.js index c4b13960..0ad6b61f 100644 --- a/tests/lib/rules/no-useless-token-range.js +++ b/tests/lib/rules/no-useless-token-range.js @@ -3,14 +3,12 @@ * @author Teddy Katz */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/no-useless-token-range'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/no-useless-token-range.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; /** * Wraps a code sample as an eslint rule diff --git a/tests/lib/rules/prefer-message-ids.js b/tests/lib/rules/prefer-message-ids.js index ac54184e..342fb501 100644 --- a/tests/lib/rules/prefer-message-ids.js +++ b/tests/lib/rules/prefer-message-ids.js @@ -1,11 +1,9 @@ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/prefer-message-ids'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/prefer-message-ids.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/prefer-object-rule.js b/tests/lib/rules/prefer-object-rule.js index 9c0aae74..0e1583f7 100644 --- a/tests/lib/rules/prefer-object-rule.js +++ b/tests/lib/rules/prefer-object-rule.js @@ -2,14 +2,12 @@ * @author Brad Zacher */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/prefer-object-rule'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/prefer-object-rule.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/prefer-output-null.js b/tests/lib/rules/prefer-output-null.js index b7c0eda1..22e7bfb4 100644 --- a/tests/lib/rules/prefer-output-null.js +++ b/tests/lib/rules/prefer-output-null.js @@ -3,14 +3,12 @@ * @author 薛定谔的猫 */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/prefer-output-null'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/prefer-output-null.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; const ERROR = { messageId: 'useOutputNull', type: 'Property' }; diff --git a/tests/lib/rules/prefer-placeholders.js b/tests/lib/rules/prefer-placeholders.js index f7fe49e0..2da2c535 100644 --- a/tests/lib/rules/prefer-placeholders.js +++ b/tests/lib/rules/prefer-placeholders.js @@ -3,14 +3,12 @@ * @author Teddy Katz */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/prefer-placeholders'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/prefer-placeholders.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/prefer-replace-text.js b/tests/lib/rules/prefer-replace-text.js index c83a9559..e8dc8041 100644 --- a/tests/lib/rules/prefer-replace-text.js +++ b/tests/lib/rules/prefer-replace-text.js @@ -3,14 +3,12 @@ * @author 薛定谔的猫 */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/prefer-replace-text'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/prefer-replace-text.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/report-message-format.js b/tests/lib/rules/report-message-format.js index 7ca4cf10..8a1c7338 100644 --- a/tests/lib/rules/report-message-format.js +++ b/tests/lib/rules/report-message-format.js @@ -3,14 +3,12 @@ * @author Teddy Katz */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/report-message-format'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/report-message-format.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/require-meta-default-options.js b/tests/lib/rules/require-meta-default-options.js index da2b4209..b0e3df4f 100644 --- a/tests/lib/rules/require-meta-default-options.js +++ b/tests/lib/rules/require-meta-default-options.js @@ -1,7 +1,6 @@ -'use strict'; - -const rule = require('../../../lib/rules/require-meta-default-options'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/require-meta-default-options.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; +import parser from '@typescript-eslint/parser'; const ruleTester = new RuleTester({ languageOptions: { sourceType: 'commonjs' }, @@ -149,7 +148,7 @@ ruleTester.run('require-meta-default-options', rule, { const ruleTesterTypeScript = new RuleTester({ languageOptions: { - parser: require('@typescript-eslint/parser'), + parser, parserOptions: { sourceType: 'module' }, }, }); diff --git a/tests/lib/rules/require-meta-docs-description.js b/tests/lib/rules/require-meta-docs-description.js index 2b4ded37..d3aa09bd 100644 --- a/tests/lib/rules/require-meta-docs-description.js +++ b/tests/lib/rules/require-meta-docs-description.js @@ -1,11 +1,10 @@ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/require-meta-docs-description'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/require-meta-docs-description.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; +import parser from '@typescript-eslint/parser'; // ------------------------------------------------------------------------------ // Tests @@ -298,7 +297,7 @@ ruleTester.run('require-meta-docs-description', rule, { const ruleTesterTypeScript = new RuleTester({ languageOptions: { sourceType: 'module', - parser: require('@typescript-eslint/parser'), + parser, }, }); ruleTesterTypeScript.run('require-meta-docs-description (TypeScript)', rule, { diff --git a/tests/lib/rules/require-meta-docs-recommended.js b/tests/lib/rules/require-meta-docs-recommended.js index 1a58bacc..b50a3b93 100644 --- a/tests/lib/rules/require-meta-docs-recommended.js +++ b/tests/lib/rules/require-meta-docs-recommended.js @@ -1,7 +1,6 @@ -'use strict'; - -const rule = require('../../../lib/rules/require-meta-docs-recommended'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/require-meta-docs-recommended.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; +import parser from '@typescript-eslint/parser'; const ruleTester = new RuleTester({ languageOptions: { sourceType: 'commonjs' }, @@ -269,7 +268,7 @@ ruleTester.run('require-meta-docs-recommended', rule, { const ruleTesterTypeScript = new RuleTester({ languageOptions: { - parser: require('@typescript-eslint/parser'), + parser, parserOptions: { sourceType: 'module' }, }, }); diff --git a/tests/lib/rules/require-meta-docs-url.js b/tests/lib/rules/require-meta-docs-url.js index da7a9048..a13d63b2 100644 --- a/tests/lib/rules/require-meta-docs-url.js +++ b/tests/lib/rules/require-meta-docs-url.js @@ -4,14 +4,12 @@ * See LICENSE file in root directory for full license. */ -'use strict'; - // ----------------------------------------------------------------------------- // Requirements // ----------------------------------------------------------------------------- -const RuleTester = require('../eslint-rule-tester').RuleTester; -const rule = require('../../../lib/rules/require-meta-docs-url'); +import { RuleTester } from '../../utils/eslint-rule-tester.js'; +import rule from '../../../lib/rules/require-meta-docs-url.js'; // ----------------------------------------------------------------------------- // Tests diff --git a/tests/lib/rules/require-meta-fixable.js b/tests/lib/rules/require-meta-fixable.js index 8aef6c04..a0d343f3 100644 --- a/tests/lib/rules/require-meta-fixable.js +++ b/tests/lib/rules/require-meta-fixable.js @@ -3,14 +3,12 @@ * @author Teddy Katz */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/require-meta-fixable'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/require-meta-fixable.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/require-meta-has-suggestions.js b/tests/lib/rules/require-meta-has-suggestions.js index 0a1e96ab..9c19d011 100644 --- a/tests/lib/rules/require-meta-has-suggestions.js +++ b/tests/lib/rules/require-meta-has-suggestions.js @@ -1,11 +1,9 @@ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/require-meta-has-suggestions'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/require-meta-has-suggestions.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/require-meta-schema-description.js b/tests/lib/rules/require-meta-schema-description.js index 1b3f4256..6fb5b741 100644 --- a/tests/lib/rules/require-meta-schema-description.js +++ b/tests/lib/rules/require-meta-schema-description.js @@ -1,11 +1,9 @@ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/require-meta-schema-description'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/require-meta-schema-description.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/require-meta-schema.js b/tests/lib/rules/require-meta-schema.js index dfb1754d..aff9df9f 100644 --- a/tests/lib/rules/require-meta-schema.js +++ b/tests/lib/rules/require-meta-schema.js @@ -1,11 +1,9 @@ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/require-meta-schema'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/require-meta-schema.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/require-meta-type.js b/tests/lib/rules/require-meta-type.js index 2180e23e..ae52476f 100644 --- a/tests/lib/rules/require-meta-type.js +++ b/tests/lib/rules/require-meta-type.js @@ -3,14 +3,12 @@ * @author 唯然 */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/require-meta-type'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/require-meta-type.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/test-case-property-ordering.js b/tests/lib/rules/test-case-property-ordering.js index 149278d1..65b8970a 100644 --- a/tests/lib/rules/test-case-property-ordering.js +++ b/tests/lib/rules/test-case-property-ordering.js @@ -3,14 +3,12 @@ * @author 薛定谔的猫 */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/test-case-property-ordering'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/test-case-property-ordering.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; // ------------------------------------------------------------------------------ // Tests diff --git a/tests/lib/rules/test-case-shorthand-strings.js b/tests/lib/rules/test-case-shorthand-strings.js index 4deddade..f358d3ee 100644 --- a/tests/lib/rules/test-case-shorthand-strings.js +++ b/tests/lib/rules/test-case-shorthand-strings.js @@ -3,14 +3,12 @@ * @author Teddy Katz */ -'use strict'; - // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ -const rule = require('../../../lib/rules/test-case-shorthand-strings'); -const RuleTester = require('../eslint-rule-tester').RuleTester; +import rule from '../../../lib/rules/test-case-shorthand-strings.js'; +import { RuleTester } from '../../utils/eslint-rule-tester.js'; /** * Returns the code for some valid test cases diff --git a/tests/lib/utils.js b/tests/lib/utils.js index d299abcc..22e2a539 100644 --- a/tests/lib/utils.js +++ b/tests/lib/utils.js @@ -1,13 +1,13 @@ -'use strict'; - -const { inspect } = require('util'); -const lodash = require('lodash'); -const espree = require('espree'); -const eslintScope = require('eslint-scope'); -const estraverse = require('estraverse'); -const assert = require('chai').assert; -const utils = require('../../lib/utils'); -const typescriptEslintParser = require('@typescript-eslint/parser'); +import { inspect } from 'node:util'; + +import typescriptEslintParser from '@typescript-eslint/parser'; +import * as eslintScope from 'eslint-scope'; +import * as espree from 'espree'; +import * as estraverse from 'estraverse'; +import lodash from 'lodash'; +import { assert, describe, it } from 'vitest'; + +import * as utils from '../../lib/utils.js'; describe('utils', () => { describe('getRuleInfo', () => { diff --git a/tests/utils/eslint-rule-tester.js b/tests/utils/eslint-rule-tester.js new file mode 100644 index 00000000..5b3c5239 --- /dev/null +++ b/tests/utils/eslint-rule-tester.js @@ -0,0 +1,21 @@ +/** + * @fileoverview Helpers for tests. + * @author 唯然 + */ + +import { RuleTester as ESLintRuleTester } from 'eslint'; +import * as unsupportedApi from 'eslint/use-at-your-own-risk'; +import packageConfig from 'eslint/package.json' with { type: 'json' }; +import * as vitest from 'vitest'; + +const { version: eslintVersion } = packageConfig; + +const FlatRuleTester = unsupportedApi.FlatRuleTester; + +// greater than or equal to ESLint v9 +export const gteEslintV9 = +eslintVersion.split('.')[0] >= 9; + +export const RuleTester = gteEslintV9 ? ESLintRuleTester : FlatRuleTester; +RuleTester.describe = vitest.describe; +RuleTester.it = vitest.it; +RuleTester.itOnly = vitest.it.only; diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..64bc7458 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: ['tests/lib/**/*.js'], + exclude: ['tests/lib/fixtures/**'], + clearMocks: true, + coverage: { + all: true, + include: ['lib'], + reporter: ['html', 'lcov', 'text'], + provider: 'istanbul', + thresholds: { + statements: 95, + branches: 93, + functions: 95, + lines: 95, + }, + }, + }, +});