diff --git a/tests/eslint-compat.js b/tests/eslint-compat.js new file mode 100644 index 000000000..5b846bdfe --- /dev/null +++ b/tests/eslint-compat.js @@ -0,0 +1,56 @@ +// @ts-check +const eslint = require('eslint') + +module.exports = { + ESLint: eslint.ESLint || getESLintClassForV6(), + RuleTester: eslint.RuleTester +} + +/** @returns {typeof eslint.ESLint} */ +function getESLintClassForV6() { + class ESLintForV6 { + static get version() { + return eslint.CLIEngine.version + } + + /** @param {eslint.ESLint.Options} options */ + constructor(options) { + const { + overrideConfig: { plugins, globals, ...overrideConfig }, + fix, + reportUnusedDisableDirectives, + plugins: pluginsMap, + ...otherOptions + } = options + this.engine = new eslint.CLIEngine({ + fix: Boolean(fix), + globals: globals + ? Object.keys(globals).filter((n) => globals[n]) + : undefined, + ...otherOptions, + ...overrideConfig, + plugins: plugins || [], + reportUnusedDisableDirectives: reportUnusedDisableDirectives + ? reportUnusedDisableDirectives !== 'off' + : undefined + }) + + for (const [name, plugin] of Object.entries(pluginsMap || {})) { + this.engine.addPlugin(name, plugin) + } + } + + /** + * @param {Parameters} params + * @returns {ReturnType} + */ + async lintText(...params) { + const result = this.engine.executeOnText(params[0], params[1].filePath) + return result.results + } + } + + /** @type {typeof eslint.ESLint} */ + const eslintClass = /** @type {any} */ (ESLintForV6) + return eslintClass +} diff --git a/tests/lib/rules/comment-directive.js b/tests/lib/rules/comment-directive.js index 4b46a88b0..1d2b56e71 100644 --- a/tests/lib/rules/comment-directive.js +++ b/tests/lib/rules/comment-directive.js @@ -10,75 +10,63 @@ // ----------------------------------------------------------------------------- const assert = require('assert') -const path = require('path') -const Module = require('module') -const eslint = require('eslint') +const { ESLint } = require('../../eslint-compat') // ----------------------------------------------------------------------------- // Tests // ----------------------------------------------------------------------------- // Initialize linter. -const linter = new eslint.CLIEngine({ - parser: require.resolve('vue-eslint-parser'), - parserOptions: { - ecmaVersion: 2015 - }, - plugins: ['vue'], - rules: { - 'no-unused-vars': 'error', - 'vue/comment-directive': 'error', - 'vue/no-parsing-error': 'error', - 'vue/no-duplicate-attributes': 'error' +const eslint = new ESLint({ + overrideConfig: { + parser: require.resolve('vue-eslint-parser'), + parserOptions: { + ecmaVersion: 2015 + }, + plugins: ['vue'], + rules: { + 'no-unused-vars': 'error', + 'vue/comment-directive': 'error', + 'vue/no-parsing-error': 'error', + 'vue/no-duplicate-attributes': 'error' + } }, - useEslintrc: false + useEslintrc: false, + plugins: { vue: require('../../../lib/index') } }) describe('comment-directive', () => { - // Preparation. - // Make `require("eslint-plugin-vue")` loading this plugin while this test. - const resolveFilename = Module._resolveFilename - before(() => { - Module._resolveFilename = function (id, ...args) { - if (id === 'eslint-plugin-vue') { - return path.resolve(__dirname, '../../../lib/index.js') - } - return resolveFilename.call(this, id, ...args) - } - }) - after(() => { - Module._resolveFilename = resolveFilename - }) - describe('eslint-disable/eslint-enable', () => { - it('disable all rules if ', () => { + it('disable all rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 0) }) - it('disable specific rules if ', () => { + it('disable specific rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 1) assert.deepEqual(messages[0].ruleId, 'vue/no-parsing-error') }) - it('enable all rules if ', () => { + it('enable all rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 2) assert.deepEqual(messages[0].ruleId, 'vue/no-parsing-error') @@ -97,7 +86,7 @@ describe('comment-directive', () => { assert.deepEqual(messages[1].line, 6) }) - it('enable specific rules if ', () => { + it('enable specific rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 1) assert.deepEqual(messages[0].ruleId, 'vue/no-duplicate-attributes') assert.deepEqual(messages[0].line, 6) }) - it('should not affect to the code in ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.strictEqual(messages.length, 1) assert.strictEqual(messages[0].ruleId, 'no-unused-vars') }) - it('disable specific rules if ', () => { + it('disable specific rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 0) }) }) describe('eslint-disable-line', () => { - it('disable all rules if ', () => { + it('disable all rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 0) }) - it('disable specific rules if ', () => { + it('disable specific rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 1) assert.deepEqual(messages[0].ruleId, 'vue/no-parsing-error') }) - it("don't disable rules if is on another line", () => { + it("don't disable rules if is on another line", async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 2) assert.deepEqual(messages[0].ruleId, 'vue/no-parsing-error') @@ -189,34 +184,36 @@ describe('comment-directive', () => { }) describe('eslint-disable-next-line', () => { - it('disable all rules if ', () => { + it('disable all rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 0) }) - it('disable specific rules if ', () => { + it('disable specific rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 1) assert.deepEqual(messages[0].ruleId, 'vue/no-parsing-error') }) - it("don't disable rules if is on another line", () => { + it("don't disable rules if is on another line", async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 2) assert.deepEqual(messages[0].ruleId, 'vue/no-parsing-error') assert.deepEqual(messages[1].ruleId, 'vue/no-duplicate-attributes') }) - it('should affect only the next line', () => { + it('should affect only the next line', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 2) assert.deepEqual(messages[0].ruleId, 'vue/no-parsing-error') @@ -253,20 +253,21 @@ describe('comment-directive', () => { }) describe('allow description', () => { - it('disable all rules if ', () => { + it('disable all rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 0) }) - it('enable all rules if ', () => { + it('enable all rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 2) assert.deepEqual(messages[0].ruleId, 'vue/no-parsing-error') @@ -285,7 +287,7 @@ describe('comment-directive', () => { assert.deepEqual(messages[1].line, 6) }) - it('enable specific rules if ', () => { + it('enable specific rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 1) assert.deepEqual(messages[0].ruleId, 'vue/no-duplicate-attributes') assert.deepEqual(messages[0].line, 6) }) - it('disable all rules if ', () => { + it('disable all rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 0) }) - it('disable specific rules if ', () => { + it('disable specific rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 1) assert.deepEqual(messages[0].ruleId, 'vue/no-parsing-error') }) - it('disable all rules if ', () => { + it('disable all rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 0) }) - it('disable specific rules if ', () => { + it('disable specific rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 1) assert.deepEqual(messages[0].ruleId, 'vue/no-parsing-error') @@ -356,20 +363,21 @@ describe('comment-directive', () => { }) describe('block level directive', () => { - it('disable all rules if ', () => { + it('disable all rules if ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 0) }) - it("don't disable rules if is on after block", () => { + it("don't disable rules if is on after block", async () => { const code = ` @@ -378,8 +386,10 @@ describe('comment-directive', () => {
Hello
` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 2) assert.deepEqual(messages[0].ruleId, 'vue/no-parsing-error') @@ -388,32 +398,36 @@ describe('comment-directive', () => { }) describe('reportUnusedDisableDirectives', () => { - const linter = new eslint.CLIEngine({ - parser: require.resolve('vue-eslint-parser'), - parserOptions: { - ecmaVersion: 2015 - }, - plugins: ['vue'], - rules: { - 'no-unused-vars': 'error', - 'vue/comment-directive': [ - 'error', - { reportUnusedDisableDirectives: true } - ], - 'vue/no-parsing-error': 'error', - 'vue/no-duplicate-attributes': 'error' + const eslint = new ESLint({ + overrideConfig: { + parser: require.resolve('vue-eslint-parser'), + parserOptions: { + ecmaVersion: 2015 + }, + plugins: ['vue'], + rules: { + 'no-unused-vars': 'error', + 'vue/comment-directive': [ + 'error', + { reportUnusedDisableDirectives: true } + ], + 'vue/no-parsing-error': 'error', + 'vue/no-duplicate-attributes': 'error' + } }, useEslintrc: false }) - it('report unused ', () => { + it('report unused ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 1) assert.deepEqual(messages[0].ruleId, 'vue/comment-directive') @@ -425,19 +439,21 @@ describe('comment-directive', () => { assert.deepEqual(messages[0].column, 11) }) - it('dont report unused ', () => { + it('dont report unused ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 0) }) - it('disable and report unused ', () => { + it('disable and report unused ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 1) assert.deepEqual(messages[0].ruleId, 'vue/comment-directive') @@ -460,15 +478,17 @@ describe('comment-directive', () => { assert.deepEqual(messages[0].column, 11) }) - it('report unused ', () => { + it('report unused ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 2) @@ -489,7 +509,7 @@ describe('comment-directive', () => { assert.deepEqual(messages[1].column, 60) }) - it('report unused ', () => { + it('report unused ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 4) @@ -524,20 +546,22 @@ describe('comment-directive', () => { assert.deepEqual(messages[3].line, 5) }) - it('dont report used ', () => { + it('dont report used ', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 0) }) - it('dont report used, with duplicate eslint-disable', () => { + it('dont report used, with duplicate eslint-disable', async () => { const code = ` ` - const messages = linter.executeOnText(code, 'test.vue').results[0] - .messages + + const messages = ( + await eslint.lintText(code, { filePath: 'test.vue' }) + )[0].messages assert.deepEqual(messages.length, 0) }) diff --git a/tests/lib/rules/func-call-spacing.js b/tests/lib/rules/func-call-spacing.js index d92502006..74fa4cb88 100644 --- a/tests/lib/rules/func-call-spacing.js +++ b/tests/lib/rules/func-call-spacing.js @@ -3,7 +3,7 @@ */ 'use strict' -const { RuleTester, CLIEngine } = require('eslint') +const { RuleTester, ESLint } = require('../../eslint-compat') const semver = require('semver') const rule = require('../../../lib/rules/func-call-spacing') @@ -62,7 +62,7 @@ tester.run('func-call-spacing', rule, { `, errors: [ { - message: semver.lt(CLIEngine.version, '7.0.0') + message: semver.lt(ESLint.version, '7.0.0') ? 'Unexpected newline between function name and paren.' : 'Unexpected whitespace between function name and paren.', line: 3 @@ -105,7 +105,7 @@ tester.run('func-call-spacing', rule, { `, errors: [ { - message: semver.lt(CLIEngine.version, '7.0.0') + message: semver.lt(ESLint.version, '7.0.0') ? 'Unexpected newline between function name and paren.' : 'Unexpected whitespace between function name and paren.', line: 4 diff --git a/tests/lib/rules/space-in-parens.js b/tests/lib/rules/space-in-parens.js index 57be0b52e..8791652ed 100644 --- a/tests/lib/rules/space-in-parens.js +++ b/tests/lib/rules/space-in-parens.js @@ -3,11 +3,11 @@ */ 'use strict' -const { RuleTester, CLIEngine } = require('eslint') +const { RuleTester, ESLint } = require('../../eslint-compat') const semver = require('semver') const rule = require('../../../lib/rules/space-in-parens') -const errorMessage = semver.lt(CLIEngine.version, '6.4.0') +const errorMessage = semver.lt(ESLint.version, '6.4.0') ? (obj) => { const messageId = obj.messageId delete obj.messageId diff --git a/tests/lib/rules/space-infix-ops.js b/tests/lib/rules/space-infix-ops.js index 26b008d86..b8a679787 100644 --- a/tests/lib/rules/space-infix-ops.js +++ b/tests/lib/rules/space-infix-ops.js @@ -3,7 +3,7 @@ */ 'use strict' -const { RuleTester, CLIEngine } = require('eslint') +const { RuleTester, ESLint } = require('../../eslint-compat') const semver = require('semver') const rule = require('../../../lib/rules/space-infix-ops') @@ -12,7 +12,7 @@ const tester = new RuleTester({ parserOptions: { ecmaVersion: 2015 } }) -const message = semver.lt(CLIEngine.version, '5.10.0') +const message = semver.lt(ESLint.version, '5.10.0') ? () => 'Infix operators must be spaced.' : (operator) => `Operator '${operator}' must be spaced.`