diff --git a/package.json b/package.json index 689c3bfa2..6b6f9da06 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,7 @@ "mocha": "^3.5.3", "npm-which": "^3.0.1", "nyc": "^11.9.0", + "object.fromentries": "^2.0.5", "redux": "^3.7.2", "rimraf": "^2.7.1", "safe-publish-latest": "^2.0.0", diff --git a/tests/src/parsers.js b/tests/src/parsers.js new file mode 100644 index 000000000..7407f7eb3 --- /dev/null +++ b/tests/src/parsers.js @@ -0,0 +1,158 @@ +'use strict'; + +// const path = require('path'); +const semver = require('semver'); +const version = require('eslint/package.json').version; +const flatMap = require('array.prototype.flatmap'); +const tsParserVersion = require('@typescript-eslint/parser/package.json').version; + +const disableNewTS = semver.satisfies(tsParserVersion, '>= 4.1') // this rule is not useful on v4.1+ of the TS parser + ? (x) => Object.assign({}, x, { features: [].concat(x.features, 'no-ts-new') }) + : (x) => x; + +// const NODE_MODULES = '../../node_modules'; + +// TODO: consolidate +import { parsers as utilsParsers } from './utils'; + +const parsers = { + ...utilsParsers, + disableNewTS, + babelParserOptions: function parserOptions(test, features) { + return Object.assign({}, test.parserOptions, { + requireConfigFile: false, + babelOptions: { + presets: [ + '@babel/preset-react', + ], + plugins: [ + '@babel/plugin-syntax-do-expressions', + '@babel/plugin-syntax-function-bind', + ['@babel/plugin-syntax-decorators', { legacy: true }], + ], + parserOpts: { + allowSuperOutsideMethod: false, + allowReturnOutsideFunction: false, + }, + }, + ecmaFeatures: Object.assign( + {}, + test.parserOptions && test.parserOptions.ecmaFeatures, + { + jsx: true, + modules: true, + legacyDecorators: features.has('decorators'), + }, + ), + }); + }, + all: function all(tests) { + const t = flatMap(tests, (test) => { + if (typeof test === 'string') { + test = { code: test }; + } + if ('parser' in test) { + delete test.features; + return test; + } + const features = new Set([].concat(test.features || [])); + delete test.features; + const es = test.parserOptions && test.parserOptions.ecmaVersion; + + function addComment(testObject, parser) { + const extras = [].concat( + `features: [${Array.from(features).join(',')}]`, + `parser: ${parser}`, + testObject.parserOptions ? `parserOptions: ${JSON.stringify(testObject.parserOptions)}` : [], + testObject.options ? `options: ${JSON.stringify(testObject.options)}` : [], + testObject.settings ? `settings: ${JSON.stringify(testObject.settings)}` : [], + ); + + const extraComment = `\n// ${extras.join(', ')}`; + + // Augment expected fix code output with extraComment + const nextCode = { code: testObject.code + extraComment }; + const nextOutput = testObject.output && { output: testObject.output + extraComment }; + + // Augment expected suggestion outputs with extraComment + // `errors` may be a number (expected number of errors) or an array of + // error objects. + const nextErrors = testObject.errors + && typeof testObject.errors !== 'number' + && { + errors: testObject.errors.map( + (errorObject) => { + const nextSuggestions = errorObject.suggestions && { + suggestions: errorObject.suggestions.map((suggestion) => Object.assign({}, suggestion, { + output: suggestion.output + extraComment, + })), + }; + + return Object.assign({}, errorObject, nextSuggestions); + }, + ), + }; + + return Object.assign( + {}, + testObject, + nextCode, + nextOutput, + nextErrors, + ); + } + + const skipBase = (features.has('class fields') && semver.satisfies(version, '< 8')) + || (es >= 2020 && semver.satisfies(version, '< 6')) + || features.has('no-default') + || features.has('bind operator') + || features.has('do expressions') + || features.has('decorators') + || features.has('flow') + || features.has('ts') + || features.has('types') + || (features.has('fragment') && semver.satisfies(version, '< 5')); + + const skipBabel = features.has('no-babel'); + const skipOldBabel = skipBabel || features.has('no-babel-old') || semver.satisfies(version, '>= 8'); + const skipNewBabel = skipBabel + || features.has('no-babel-new') + || !semver.satisfies(version, '^7.5.0') // require('@babel/eslint-parser/package.json').peerDependencies.eslint + || features.has('flow') + || features.has('types') + || features.has('ts'); + const skipTS = semver.satisfies(version, '<= 5') // TODO: make these pass on eslint 5 + || features.has('no-ts') + || features.has('flow') + || features.has('jsx namespace') + || features.has('bind operator') + || features.has('do expressions'); + const tsOld = !skipTS && !features.has('no-ts-old'); + const tsNew = !skipTS && !features.has('no-ts-new'); + + return [].concat( + skipBase ? [] : addComment( + Object.assign({}, test, features.has('class fields') && { + parserOptions: Object.assign({}, test.parserOptions, { + ecmaVersion: Math.max((test.parserOptions && test.parserOptions.ecmaVersion) || 0, 2022), + }), + }), + 'default', + ), + skipOldBabel ? [] : addComment(Object.assign({}, test, { + parser: parsers.BABEL_ESLINT, + parserOptions: parsers.babelParserOptions(test, features), + }), 'babel-eslint'), + skipNewBabel ? [] : addComment(Object.assign({}, test, { + parser: parsers['@BABEL_ESLINT'], + parserOptions: parsers.babelParserOptions(test, features), + }), '@babel/eslint-parser'), + tsOld ? addComment(Object.assign({}, test, { parser: parsers.TYPESCRIPT_ESLINT }), 'typescript-eslint') : [], + tsNew ? addComment(Object.assign({}, test, { parser: parsers['@TYPESCRIPT_ESLINT'] }), '@typescript-eslint/parser') : [], + ); + }); + return t; + }, +}; + +module.exports = parsers; diff --git a/tests/src/rules/default.js b/tests/src/rules/default.js index eb2028c71..764164cb5 100644 --- a/tests/src/rules/default.js +++ b/tests/src/rules/default.js @@ -1,28 +1,40 @@ import path from 'path'; -import { test, testVersion, SYNTAX_CASES, getTSParsers, parsers } from '../utils'; +import { test, testVersion, SYNTAX_CASES, parsers as utilsParsers, getTSParsers } from '../utils'; +import parsers from '../parsers'; import { RuleTester } from 'eslint'; import semver from 'semver'; import { version as tsEslintVersion } from 'typescript-eslint-parser/package.json'; +import fromEntries from "object.fromentries" import { CASE_SENSITIVE_FS } from 'eslint-module-utils/resolve'; -const ruleTester = new RuleTester(); + const rule = require('rules/default'); +const parserOptions = { + ecmaVersion: 2018, + sourceType: 'module', + ecmaFeatures: { + jsx: true, + }, + settings: { + 'import/parsers': fromEntries(getTSParsers().map((parser) => [parser, ['.ts']])) + } +}; + +const ruleTester = new RuleTester({ parserOptions }); + ruleTester.run('default', rule, { - valid: [].concat( + valid: parsers.all([].concat( test({ code: 'import "./malformed.js"' }), test({ code: 'import foo from "./empty-folder";' }), test({ code: 'import { foo } from "./default-export";' }), test({ code: 'import foo from "./default-export";' }), test({ code: 'import foo from "./mixed-exports";' }), - test({ - code: 'import bar from "./default-export";' }), - test({ - code: 'import CoolClass from "./default-class";' }), - test({ - code: 'import bar, { baz } from "./default-export";' }), + test({ code: 'import bar from "./default-export";' }), + test({ code: 'import CoolClass from "./default-class";' }), + test({ code: 'import bar, { baz } from "./default-export";' }), // core modules always have a default test({ code: 'import crypto from "crypto";' }), @@ -30,276 +42,181 @@ ruleTester.run('default', rule, { test({ code: 'import common from "./common";' }), // es7 export syntax - test({ code: 'export bar from "./bar"', - parser: parsers.BABEL_OLD }), + test({ code: 'export bar from "./bar"' }), test({ code: 'export { default as bar } from "./bar"' }), - test({ code: 'export bar, { foo } from "./bar"', - parser: parsers.BABEL_OLD }), - test({ code: 'export { default as bar, foo } from "./bar"' }), - test({ code: 'export bar, * as names from "./bar"', - parser: parsers.BABEL_OLD }), + test({ code: 'export bar, { foo } from "./bar"'}), + test({ code: 'export { default as bar, foo } from "./bar"'}), + test({ code: 'export bar, * as names from "./bar"'}), // sanity check test({ code: 'export {a} from "./named-exports"' }), - test({ - code: 'import twofer from "./trampoline"', - parser: parsers.BABEL_OLD, - }), + test({ code: 'import twofer from "./trampoline"',}), // jsx - test({ - code: 'import MyCoolComponent from "./jsx/MyCoolComponent.jsx"', - parserOptions: { - sourceType: 'module', - ecmaVersion: 6, - ecmaFeatures: { jsx: true }, - }, - }), + test({ code: 'import MyCoolComponent from "./jsx/MyCoolComponent.jsx"' }), // #54: import of named export default test({ code: 'import foo from "./named-default-export"' }), // #94: redux export of execution result, test({ code: 'import connectedApp from "./redux"' }), - test({ - code: 'import App from "./jsx/App"', - parserOptions: { - ecmaFeatures: { jsx: true, modules: true }, - }, - }), + test({ code: 'import App from "./jsx/App"'}), // from no-errors - test({ - code: "import Foo from './jsx/FooES7.js';", - parser: parsers.BABEL_OLD, - }), + test({ code: "import Foo from './jsx/FooES7.js';"}), // #545: more ES7 cases - test({ - code: "import bar from './default-export-from.js';", - parser: parsers.BABEL_OLD, - }), - test({ - code: "import bar from './default-export-from-named.js';", - parser: parsers.BABEL_OLD, - }), + test({ code: "import bar from './default-export-from.js';" }), + test({ code: "import bar from './default-export-from-named.js';"}), test({ code: "import bar from './default-export-from-ignored.js';", - settings: { 'import/ignore': ['common'] }, - parser: parsers.BABEL_OLD, + settings: { 'import/ignore': ['common'] } }), test({ code: "export bar from './default-export-from-ignored.js';", - settings: { 'import/ignore': ['common'] }, - parser: parsers.BABEL_OLD, - }), - - // es2022: Arbitrary module namespace identifier names - testVersion('>= 8.7', () => ({ - code: 'export { "default" as bar } from "./bar"', - parserOptions: { - ecmaVersion: 2022, - }, - })), - - ...SYNTAX_CASES, - ), - - invalid: [ - test({ - code: "import Foo from './jsx/FooES7.js';", - errors: ["Parse errors in imported module './jsx/FooES7.js': Unexpected token = (6:16)"], + settings: { 'import/ignore': ['common'] } }), + //typescript context test({ - code: 'import baz from "./named-exports";', - errors: [{ message: 'No default export found in imported module "./named-exports".', - type: 'ImportDefaultSpecifier' }] }), - - // es7 export syntax - test({ - code: 'export baz from "./named-exports"', - parser: parsers.BABEL_OLD, - errors: ['No default export found in imported module "./named-exports".'], - }), - test({ - code: 'export baz, { bar } from "./named-exports"', - parser: parsers.BABEL_OLD, - errors: ['No default export found in imported module "./named-exports".'], - }), - test({ - code: 'export baz, * as names from "./named-exports"', - parser: parsers.BABEL_OLD, - errors: ['No default export found in imported module "./named-exports".'], - }), - // exports default from a module with no default - test({ - code: 'import twofer from "./broken-trampoline"', - parser: parsers.BABEL_OLD, - errors: ['No default export found in imported module "./broken-trampoline".'], - }), - - // #328: * exports do not include default - test({ - code: 'import barDefault from "./re-export"', - errors: ['No default export found in imported module "./re-export".'], - }), - ], -}); - -// #311: import of mismatched case -if (!CASE_SENSITIVE_FS) { - ruleTester.run('default (path case-insensitivity)', rule, { - valid: [ - test({ - code: 'import foo from "./jsx/MyUncoolComponent.jsx"', - }), - ], - invalid: [ - test({ - code: 'import bar from "./Named-Exports"', - errors: ['No default export found in imported module "./Named-Exports".'], - }), - ], - }); -} - -context('TypeScript', function () { - getTSParsers().forEach((parser) => { - ruleTester.run(`default`, rule, { - valid: [].concat( - test({ code: `import foobar from "./typescript-default"`, - parser, settings: { - 'import/parsers': { [parser]: ['.ts'] }, 'import/resolver': { 'eslint-import-resolver-typescript': true }, }, + features: ["ts"] }), test({ code: `import foobar from "./typescript-export-assign-default"`, - parser, settings: { - 'import/parsers': { [parser]: ['.ts'] }, 'import/resolver': { 'eslint-import-resolver-typescript': true }, }, }), test({ code: `import foobar from "./typescript-export-assign-function"`, - parser, settings: { - 'import/parsers': { [parser]: ['.ts'] }, 'import/resolver': { 'eslint-import-resolver-typescript': true }, }, }), semver.satisfies(tsEslintVersion, '>= 22') ? test({ code: `import foobar from "./typescript-export-assign-mixed"`, - parser, settings: { - 'import/parsers': { [parser]: ['.ts'] }, 'import/resolver': { 'eslint-import-resolver-typescript': true }, }, }) : [], test({ code: `import foobar from "./typescript-export-assign-default-reexport"`, - parser, settings: { - 'import/parsers': { [parser]: ['.ts'] }, 'import/resolver': { 'eslint-import-resolver-typescript': true }, }, }), test({ code: `import React from "./typescript-export-assign-default-namespace"`, - parser, settings: { - 'import/parsers': { [parser]: ['.ts'] }, 'import/resolver': { 'eslint-import-resolver-typescript': true }, }, - parserOptions: { - tsconfigRootDir: path.resolve(__dirname, '../../files/typescript-export-assign-default-namespace/'), - }, }), test({ code: `import Foo from "./typescript-export-as-default-namespace"`, - parser, settings: { - 'import/parsers': { [parser]: ['.ts'] }, 'import/resolver': { 'eslint-import-resolver-typescript': true }, }, - parserOptions: { - tsconfigRootDir: path.resolve(__dirname, '../../files/typescript-export-as-default-namespace/'), - }, }), test({ code: `import Foo from "./typescript-export-react-test-renderer"`, - parser, settings: { - 'import/parsers': { [parser]: ['.ts'] }, 'import/resolver': { 'eslint-import-resolver-typescript': true }, }, - parserOptions: { - tsconfigRootDir: path.resolve(__dirname, '../../files/typescript-export-react-test-renderer/'), - }, }), test({ code: `import Foo from "./typescript-extended-config"`, - parser, settings: { - 'import/parsers': { [parser]: ['.ts'] }, 'import/resolver': { 'eslint-import-resolver-typescript': true }, }, - parserOptions: { - tsconfigRootDir: path.resolve(__dirname, '../../files/typescript-extended-config/'), - }, }), test({ code: `import foobar from "./typescript-export-assign-property"`, - parser, settings: { - 'import/parsers': { [parser]: ['.ts'] }, 'import/resolver': { 'eslint-import-resolver-typescript': true }, }, }), - ), - invalid: [ - test({ + // es2022: Arbitrary module namespace identifier names + testVersion('>= 8.7', () => ({ + code: 'export { "default" as bar } from "./bar"', + parserOptions: { + ecmaVersion: 2022, + }, + })), + + SYNTAX_CASES, + )), + + invalid: parsers.all([].concat( + test({ + code: "import Foo from './jsx/FooES7.js';", + errors: ["Parse errors in imported module './jsx/FooES7.js': Unexpected token = (6:16)"], + }), + + test({ + code: 'import baz from "./named-exports";', + errors: [{ message: 'No default export found in imported module "./named-exports".', + type: 'ImportDefaultSpecifier' }] }), + + // es7 export syntax + test({ + code: 'export baz from "./named-exports"', + errors: ['No default export found in imported module "./named-exports".'], + }), + test({ + code: 'export baz, { bar } from "./named-exports"', + errors: ['No default export found in imported module "./named-exports".'], + }), + test({ + code: 'export baz, * as names from "./named-exports"', + errors: ['No default export found in imported module "./named-exports".'], + }), + // exports default from a module with no default + test({ + code: 'import twofer from "./broken-trampoline"', + errors: ['No default export found in imported module "./broken-trampoline".'], + }), + + // #328: * exports do not include default + test({ + code: 'import barDefault from "./re-export"', + errors: ['No default export found in imported module "./re-export".'], + }), + + + //typescript context + test({ code: `import foobar from "./typescript"`, - parser, + features: ['ts'], settings: { - 'import/parsers': { [parser]: ['.ts'] }, 'import/resolver': { 'eslint-import-resolver-typescript': true }, }, errors: ['No default export found in imported module "./typescript".'], }), test({ code: `import React from "./typescript-export-assign-default-namespace"`, - parser, + settings: { - 'import/parsers': { [parser]: ['.ts'] }, 'import/resolver': { 'eslint-import-resolver-typescript': true }, }, errors: ['No default export found in imported module "./typescript-export-assign-default-namespace".'], }), test({ code: `import FooBar from "./typescript-export-as-default-namespace"`, - parser, settings: { - 'import/parsers': { [parser]: ['.ts'] }, 'import/resolver': { 'eslint-import-resolver-typescript': true }, }, errors: ['No default export found in imported module "./typescript-export-as-default-namespace".'], }), test({ code: `import Foo from "./typescript-export-as-default-namespace"`, - parser, settings: { - 'import/parsers': { [parser]: ['.ts'] }, 'import/resolver': { 'eslint-import-resolver-typescript': true }, }, - parserOptions: { - tsconfigRootDir: path.resolve(__dirname, '../../files/typescript-no-compiler-options/'), - }, errors: [ { message: 'No default export found in imported module "./typescript-export-as-default-namespace".', @@ -310,7 +227,22 @@ context('TypeScript', function () { }, ], }), - ], - }); - }); + ]), }); + +// #311: import of mismatched case +if (!CASE_SENSITIVE_FS) { + ruleTester.run('default (path case-insensitivity)', rule, { + valid: parsers.all([ + test({ + code: 'import foo from "./jsx/MyUncoolComponent.jsx"', + }), + ]), + invalid:parsers.all([ + test({ + code: 'import bar from "./Named-Exports"', + errors: ['No default export found in imported module "./Named-Exports".'], + }), + ]), + }); +} diff --git a/tests/src/rules/dynamic-import-chunkname.js b/tests/src/rules/dynamic-import-chunkname.js index 7e482cf03..2c188227a 100644 --- a/tests/src/rules/dynamic-import-chunkname.js +++ b/tests/src/rules/dynamic-import-chunkname.js @@ -15,7 +15,7 @@ const pickyCommentOptions = [{ const multipleImportFunctionOptions = [{ importFunctions: ['dynamicImport', 'definitelyNotStaticImport'], }]; -const parser = parsers.BABEL_OLD; +const parser = parsers.BABEL_ESLINT; const noLeadingCommentError = 'dynamic imports require a leading comment with the webpack chunkname'; const nonBlockCommentError = 'dynamic imports require a /* foo */ style comment, not a // foo comment'; @@ -495,7 +495,7 @@ ruleTester.run('dynamic-import-chunkname', rule, { context('TypeScript', () => { getTSParsers().forEach((typescriptParser) => { - const nodeType = typescriptParser === parsers.TS_OLD || (typescriptParser === parsers.TS_NEW && semver.satisfies(require('@typescript-eslint/parser/package.json').version, '^2')) + const nodeType = typescriptParser === parsers.TYPESCRIPT_ESLINT || (typescriptParser === parsers['@TYPESCRIPT_ESLINT'] && semver.satisfies(require('@typescript-eslint/parser/package.json').version, '^2')) ? 'CallExpression' : 'ImportExpression'; diff --git a/tests/src/rules/extensions.js b/tests/src/rules/extensions.js index cf93fac9f..10ad54d54 100644 --- a/tests/src/rules/extensions.js +++ b/tests/src/rules/extensions.js @@ -601,7 +601,7 @@ ruleTester.run('extensions', rule, { describe('TypeScript', () => { getTSParsers() // Type-only imports were added in TypeScript ESTree 2.23.0 - .filter((parser) => parser !== parsers.TS_OLD) + .filter((parser) => parser !== parsers.TYPESCRIPT_ESLINT) .forEach((parser) => { ruleTester.run(`${parser}: extensions ignore type-only`, rule, { valid: [ diff --git a/tests/src/rules/max-dependencies.js b/tests/src/rules/max-dependencies.js index 982a4b427..261292823 100644 --- a/tests/src/rules/max-dependencies.js +++ b/tests/src/rules/max-dependencies.js @@ -66,7 +66,7 @@ ruleTester.run('max-dependencies', rule, { test({ code: 'import type { x } from \'./foo\'; import type { y } from \'./bar\'', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, options: [{ max: 1, }], @@ -77,7 +77,7 @@ ruleTester.run('max-dependencies', rule, { test({ code: 'import type { x } from \'./foo\'; import type { y } from \'./bar\'; import type { z } from \'./baz\'', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, options: [{ max: 2, ignoreTypeImports: false, @@ -92,7 +92,7 @@ ruleTester.run('max-dependencies', rule, { describe('TypeScript', () => { getTSParsers() // Type-only imports were added in TypeScript ESTree 2.23.0 - .filter((parser) => parser !== parsers.TS_OLD) + .filter((parser) => parser !== parsers.TYPESCRIPT_ESLINT) .forEach((parser) => { ruleTester.run(`max-dependencies (${parser.replace(process.cwd(), '.')})`, rule, { valid: [ diff --git a/tests/src/rules/named.js b/tests/src/rules/named.js index 036198397..edd6e7fd1 100644 --- a/tests/src/rules/named.js +++ b/tests/src/rules/named.js @@ -54,11 +54,11 @@ ruleTester.run('named', rule, { // es7 test({ code: 'export bar, { foo } from "./bar"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import { foo, bar } from "./named-trampoline"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), // regression tests @@ -73,43 +73,43 @@ ruleTester.run('named', rule, { // should ignore imported/exported flow types, even if they don’t exist test({ code: 'import type { MissingType } from "./flowtypes"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import typeof { MissingType } from "./flowtypes"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import type { MyOpaqueType } from "./flowtypes"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import typeof { MyOpaqueType } from "./flowtypes"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import { type MyOpaqueType, MyClass } from "./flowtypes"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import { typeof MyOpaqueType, MyClass } from "./flowtypes"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import typeof MissingType from "./flowtypes"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import typeof * as MissingType from "./flowtypes"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'export type { MissingType } from "./flowtypes"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'export type { MyOpaqueType } from "./flowtypes"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), // jsnext @@ -244,17 +244,17 @@ ruleTester.run('named', rule, { // es7 test({ code: 'export bar2, { bar } from "./bar"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: ["bar not found in './bar'"], }), test({ code: 'import { foo, bar, baz } from "./named-trampoline"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: ["baz not found in './named-trampoline'"], }), test({ code: 'import { baz } from "./broken-trampoline"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: ['baz not found via broken-trampoline.js -> named-exports.js'], }), @@ -294,7 +294,7 @@ ruleTester.run('named', rule, { test({ code: 'import { type MyOpaqueType, MyMissingClass } from "./flowtypes"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: ["MyMissingClass not found in './flowtypes'"], }), diff --git a/tests/src/rules/namespace.js b/tests/src/rules/namespace.js index 1465d2136..57590bac8 100644 --- a/tests/src/rules/namespace.js +++ b/tests/src/rules/namespace.js @@ -57,16 +57,16 @@ const valid = [ // es7 // ///////// test({ code: 'export * as names from "./named-exports"', - parser: parsers.BABEL_OLD }), + parser: parsers.BABEL_ESLINT }), test({ code: 'export defport, * as names from "./named-exports"', - parser: parsers.BABEL_OLD }), + parser: parsers.BABEL_ESLINT }), // non-existent is handled by no-unresolved test({ code: 'export * as names from "./does-not-exist"', - parser: parsers.BABEL_OLD }), + parser: parsers.BABEL_ESLINT }), test({ code: 'import * as Endpoints from "./issue-195/Endpoints"; console.log(Endpoints.Users)', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), // respect hoisting @@ -81,11 +81,11 @@ const valid = [ test({ code: "import * as names from './default-export'; console.log(names.default)" }), test({ code: 'export * as names from "./default-export"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'export defport, * as names from "./default-export"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), // #456: optionally ignore computed references @@ -103,7 +103,7 @@ const valid = [ }), test({ code: `import * as names from './named-exports'; const {a, b, ...rest} = names;`, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), // #1144: should handle re-export CommonJS as namespace @@ -251,7 +251,7 @@ const invalid = [].concat( test({ code: 'import * as Endpoints from "./issue-195/Endpoints"; console.log(Endpoints.Foo)', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: ["'Foo' not found in imported namespace 'Endpoints'."], }), @@ -316,7 +316,7 @@ const invalid = [].concat( /////////////////////// // deep dereferences // ////////////////////// -;[['deep', require.resolve('espree')], ['deep-es7', parsers.BABEL_OLD]].forEach(function ([folder, parser]) { // close over params +;[['deep', require.resolve('espree')], ['deep-es7', parsers.BABEL_ESLINT]].forEach(function ([folder, parser]) { // close over params valid.push( test({ parser, code: `import * as a from "./${folder}/a"; console.log(a.b.c.d.e)` }), test({ parser, code: `import { b } from "./${folder}/a"; console.log(b.c.d.e)` }), diff --git a/tests/src/rules/newline-after-import.js b/tests/src/rules/newline-after-import.js index bf91064f8..f6de37413 100644 --- a/tests/src/rules/newline-after-import.js +++ b/tests/src/rules/newline-after-import.js @@ -194,22 +194,22 @@ ruleTester.run('newline-after-import', require('rules/newline-after-import'), { class App {} `, parserOptions: { ecmaVersion: 2015, sourceType: 'module' }, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }, { code: `var foo = require('foo');\n\n@SomeDecorator(foo)\nclass Foo {}`, parserOptions: { ecmaVersion: 2015, sourceType: 'module' }, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }, { code : `// issue 1004\nimport foo from 'foo';\n\n@SomeDecorator(foo)\nexport default class Test {}`, parserOptions: { sourceType: 'module' }, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }, { code : `// issue 1004\nconst foo = require('foo');\n\n@SomeDecorator(foo)\nexport default class Test {}`, parserOptions: { sourceType: 'module' }, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }, flatMap(getTSParsers(), (parser) => [].concat( { @@ -246,14 +246,14 @@ ruleTester.run('newline-after-import', require('rules/newline-after-import'), { parser, parserOptions: { ecmaVersion: 2015, sourceType: 'module' }, }, - parser !== parsers.TS_OLD || semver.satisfies(tsEslintVersion, '>= 22') ? { + parser !== parsers.TYPESCRIPT_ESLINT || semver.satisfies(tsEslintVersion, '>= 22') ? { code: ` export import a = obj;\nf(a); `, parser, parserOptions: { ecmaVersion: 2015, sourceType: 'module' }, } : [], - parser !== parsers.TS_OLD || semver.satisfies(tsEslintVersion, '>= 22') ? { + parser !== parsers.TYPESCRIPT_ESLINT || semver.satisfies(tsEslintVersion, '>= 22') ? { code: ` import { a } from "./a"; @@ -553,7 +553,7 @@ ruleTester.run('newline-after-import', require('rules/newline-after-import'), { message: IMPORT_ERROR_MESSAGE, } ], parserOptions: { ecmaVersion: 2015, sourceType: 'module' }, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }, { code: `var foo = require('foo');\n@SomeDecorator(foo)\nclass Foo {}`, @@ -564,7 +564,7 @@ ruleTester.run('newline-after-import', require('rules/newline-after-import'), { message: REQUIRE_ERROR_MESSAGE, } ], parserOptions: { ecmaVersion: 2015, sourceType: 'module' }, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }, { code: `// issue 10042\nimport foo from 'foo';\n@SomeDecorator(foo)\nexport default class Test {}`, @@ -575,7 +575,7 @@ ruleTester.run('newline-after-import', require('rules/newline-after-import'), { message: IMPORT_ERROR_MESSAGE, } ], parserOptions: { sourceType: 'module' }, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }, { code: `// issue 1004\nconst foo = require('foo');\n@SomeDecorator(foo)\nexport default class Test {}`, @@ -586,7 +586,7 @@ ruleTester.run('newline-after-import', require('rules/newline-after-import'), { message: REQUIRE_ERROR_MESSAGE, } ], parserOptions: { sourceType: 'module' }, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }, testVersion('>= 6', () => ({ code: ` @@ -610,7 +610,7 @@ ruleTester.run('newline-after-import', require('rules/newline-after-import'), { }, ], parserOptions: { sourceType: 'module' }, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, })) || [], ), }); diff --git a/tests/src/rules/no-cycle.js b/tests/src/rules/no-cycle.js index ad29292c2..0d20db687 100644 --- a/tests/src/rules/no-cycle.js +++ b/tests/src/rules/no-cycle.js @@ -66,57 +66,57 @@ ruleTester.run('no-cycle', rule, { test({ code: `import("./${testDialect}/depth-two").then(function({ foo }) {})`, options: [{ maxDepth: 1 }], - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: `import type { FooType } from "./${testDialect}/depth-one"`, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: `import type { FooType, BarType } from "./${testDialect}/depth-one"`, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: `function bar(){ return import("./${testDialect}/depth-one"); } // #2265 1`, options: [{ allowUnsafeDynamicCyclicDependency: true }], - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: `import { foo } from "./${testDialect}/depth-one-dynamic"; // #2265 2`, options: [{ allowUnsafeDynamicCyclicDependency: true }], - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), - ].concat(parsers.TS_NEW ? [ + ].concat(parsers['@TYPESCRIPT_ESLINT'] ? [ test({ code: `function bar(){ return import("./${testDialect}/depth-one"); } // #2265 3`, options: [{ allowUnsafeDynamicCyclicDependency: true }], - parser: parsers.TS_NEW, + parser: parsers['@TYPESCRIPT_ESLINT'], }), test({ code: `import { foo } from "./${testDialect}/depth-one-dynamic"; // #2265 4`, options: [{ allowUnsafeDynamicCyclicDependency: true }], - parser: parsers.TS_NEW, + parser: parsers['@TYPESCRIPT_ESLINT'], }), ] : [])), test({ code: 'import { bar } from "./flow-types"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import { bar } from "./flow-types-only-importing-type"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import { bar } from "./flow-types-only-importing-multiple-types"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), ), invalid: [].concat( test({ code: 'import { bar } from "./flow-types-some-type-imports"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: [error(`Dependency cycle detected.`)], }), test({ @@ -200,7 +200,7 @@ ruleTester.run('no-cycle', rule, { code: `import { bar } from "./${testDialect}/depth-three-indirect"`, options: [{ ...opts }], errors: [error(`Dependency cycle via ./depth-two:1=>./depth-one:1`)], - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: `import { foo } from "./${testDialect}/depth-two"`, @@ -216,12 +216,12 @@ ruleTester.run('no-cycle', rule, { test({ code: `import("./${testDialect}/depth-three-star")`, errors: [error(`Dependency cycle via ./depth-two:1=>./depth-one:1`)], - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: `import("./${testDialect}/depth-three-indirect")`, errors: [error(`Dependency cycle via ./depth-two:1=>./depth-one:1`)], - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: `import { foo } from "./${testDialect}/depth-two"`, @@ -236,30 +236,31 @@ ruleTester.run('no-cycle', rule, { test({ code: `function bar(){ return import("./${testDialect}/depth-one"); } // #2265 5`, errors: [error(`Dependency cycle detected.`)], - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), ]).concat( - testVersion('> 3', () => ({ // Dynamic import is not properly caracterized with eslint < 4 + // TODO: enable for eslint 8+, just not for the old babel parser + testVersion('> 3 && < 8', () => ({ // Dynamic import is not properly characterized with eslint < 4 code: `import { foo } from "./${testDialect}/depth-one-dynamic"; // #2265 6`, errors: [error(`Dependency cycle detected.`)], - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, })), - ).concat(parsers.TS_NEW ? [ + ).concat(parsers['@TYPESCRIPT_ESLINT'] ? [ test({ code: `function bar(){ return import("./${testDialect}/depth-one"); } // #2265 7`, errors: [error(`Dependency cycle detected.`)], - parser: parsers.TS_NEW, + parser: parsers['@TYPESCRIPT_ESLINT'], }), test({ code: `import { foo } from "./${testDialect}/depth-one-dynamic"; // #2265 8`, errors: [error(`Dependency cycle detected.`)], - parser: parsers.TS_NEW, + parser: parsers['@TYPESCRIPT_ESLINT'], }), ] : [])), test({ code: 'import { bar } from "./flow-types-depth-one"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: [error(`Dependency cycle via ./flow-types-depth-two:4=>./es6/depth-one:1`)], }), ), diff --git a/tests/src/rules/no-default-export.js b/tests/src/rules/no-default-export.js index 6c1a85a1d..d12d313df 100644 --- a/tests/src/rules/no-default-export.js +++ b/tests/src/rules/no-default-export.js @@ -58,7 +58,7 @@ ruleTester.run('no-default-export', rule, { }), test({ code: 'export { a, b } from "foo.js"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), // no exports at all @@ -74,15 +74,15 @@ ruleTester.run('no-default-export', rule, { test({ code: `export type UserId = number;`, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'export foo from "foo.js"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: `export Memory, { MemoryValue } from './Memory'`, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), ], invalid: [].concat( @@ -154,7 +154,7 @@ ruleTester.run('no-default-export', rule, { }), test({ code: 'export default from "foo.js"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: [ { type: 'ExportNamedDeclaration', diff --git a/tests/src/rules/no-duplicates.js b/tests/src/rules/no-duplicates.js index cde41b3a0..cf6239d47 100644 --- a/tests/src/rules/no-duplicates.js +++ b/tests/src/rules/no-duplicates.js @@ -26,7 +26,7 @@ ruleTester.run('no-duplicates', rule, { // #225: ignore duplicate if is a flow type import test({ code: "import { x } from './foo'; import type { y } from './foo'", - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), // #1107: Using different query strings that trigger different webpack loaders. @@ -107,7 +107,7 @@ ruleTester.run('no-duplicates', rule, { test({ code: "import type { x } from './foo'; import type { y } from './foo'", output: "import type { x , y } from './foo'; ", - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: ['\'./foo\' imported multiple times.', '\'./foo\' imported multiple times.'], }), @@ -418,7 +418,7 @@ import {x,y} from './foo' context('TypeScript', function () { getNonDefaultParsers() // Type-only imports were added in TypeScript ESTree 2.23.0 - .filter((parser) => parser !== parsers.TS_OLD) + .filter((parser) => parser !== parsers.TYPESCRIPT_ESLINT) .forEach((parser) => { const parserConfig = { parser, diff --git a/tests/src/rules/no-dynamic-require.js b/tests/src/rules/no-dynamic-require.js index 0b141ccd7..73b79dd51 100644 --- a/tests/src/rules/no-dynamic-require.js +++ b/tests/src/rules/no-dynamic-require.js @@ -29,7 +29,7 @@ ruleTester.run('no-dynamic-require', rule, { test({ code: 'var foo = require("@scope/foo")' }), //dynamic import - ...flatMap([parsers.ESPREE, parsers.BABEL_OLD], (parser) => { + ...flatMap([parsers.ESPREE, parsers.BABEL_ESLINT], (parser) => { const _test = parser === parsers.ESPREE ? (testObj) => testVersion('>= 6.2.0', () => testObj) @@ -142,7 +142,7 @@ ruleTester.run('no-dynamic-require', rule, { }), // dynamic import - ...flatMap([parsers.ESPREE, parsers.BABEL_OLD], (parser) => { + ...flatMap([parsers.ESPREE, parsers.BABEL_ESLINT], (parser) => { const _test = parser === parsers.ESPREE ? (testObj) => testVersion('>= 6.2.0', () => testObj) diff --git a/tests/src/rules/no-extraneous-dependencies.js b/tests/src/rules/no-extraneous-dependencies.js index d4e3886be..3d4a09218 100644 --- a/tests/src/rules/no-extraneous-dependencies.js +++ b/tests/src/rules/no-extraneous-dependencies.js @@ -82,7 +82,7 @@ ruleTester.run('no-extraneous-dependencies', rule, { test({ code: 'import type MyType from "myflowtyped";', options: [{ packageDir: packageDirWithFlowTyped }], - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: ` @@ -90,7 +90,7 @@ ruleTester.run('no-extraneous-dependencies', rule, { import typeof TypeScriptModule from 'typescript'; `, options: [{ packageDir: packageDirWithFlowTyped }], - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import react from "react";', @@ -398,7 +398,7 @@ ruleTester.run('no-extraneous-dependencies', rule, { describe('TypeScript', () => { getTSParsers() // Type-only imports were added in TypeScript ESTree 2.23.0 - .filter((parser) => parser !== parsers.TS_OLD) + .filter((parser) => parser !== parsers.TYPESCRIPT_ESLINT) .forEach((parser) => { const parserConfig = { parser, @@ -433,12 +433,12 @@ typescriptRuleTester.run('no-extraneous-dependencies typescript type imports', r test({ code: 'import type MyType from "not-a-dependency";', filename: testFilePath('./no-unused-modules/typescript/file-ts-a.ts'), - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import type { MyType } from "not-a-dependency";', filename: testFilePath('./no-unused-modules/typescript/file-ts-a.ts'), - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), ], invalid: [ diff --git a/tests/src/rules/no-mutable-exports.js b/tests/src/rules/no-mutable-exports.js index 1171443c4..4ae8243f9 100644 --- a/tests/src/rules/no-mutable-exports.js +++ b/tests/src/rules/no-mutable-exports.js @@ -25,11 +25,11 @@ ruleTester.run('no-mutable-exports', rule, { test({ code: 'class Counter {}\nexport default Counter' }), test({ code: 'class Counter {}\nexport { Counter as default }' }), test({ - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, code: 'export Something from "./something";', }), test({ - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, code: 'type Foo = {}\nexport type {Foo}', }), // es2022: Arbitrary module namespace identifier names diff --git a/tests/src/rules/no-named-as-default.js b/tests/src/rules/no-named-as-default.js index 04ec28e61..1c2d47cff 100644 --- a/tests/src/rules/no-named-as-default.js +++ b/tests/src/rules/no-named-as-default.js @@ -13,13 +13,13 @@ ruleTester.run('no-named-as-default', rule, { // es7 test({ code: 'export bar, { foo } from "./bar";', - parser: parsers.BABEL_OLD }), + parser: parsers.BABEL_ESLINT }), test({ code: 'export bar from "./bar";', - parser: parsers.BABEL_OLD }), + parser: parsers.BABEL_ESLINT }), // #566: don't false-positive on `default` itself test({ code: 'export default from "./bar";', - parser: parsers.BABEL_OLD }), + parser: parsers.BABEL_ESLINT }), // es2022: Arbitrary module namespae identifier names testVersion('>= 8.7', () => ({ @@ -45,13 +45,13 @@ ruleTester.run('no-named-as-default', rule, { // es7 test({ code: 'export foo from "./bar";', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: [ { message: 'Using exported name \'foo\' as identifier for default export.', type: 'ExportDefaultSpecifier' } ] }), test({ code: 'export foo, { foo as bar } from "./bar";', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: [ { message: 'Using exported name \'foo\' as identifier for default export.', type: 'ExportDefaultSpecifier' } ] }), diff --git a/tests/src/rules/no-named-default.js b/tests/src/rules/no-named-default.js index 191c9c6ce..aa0fdaf08 100644 --- a/tests/src/rules/no-named-default.js +++ b/tests/src/rules/no-named-default.js @@ -12,11 +12,11 @@ ruleTester.run('no-named-default', rule, { // Should ignore imported flow types test({ code: 'import { type default as Foo } from "./bar";', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import { typeof default as Foo } from "./bar";', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), ...SYNTAX_CASES, @@ -29,7 +29,7 @@ ruleTester.run('no-named-default', rule, { message: 'Use default import syntax to import \'default\'.', type: 'Identifier', }], - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }),*/ test({ code: 'import { default as bar } from "./bar";', diff --git a/tests/src/rules/no-named-export.js b/tests/src/rules/no-named-export.js index 58b5da2f8..3e417754c 100644 --- a/tests/src/rules/no-named-export.js +++ b/tests/src/rules/no-named-export.js @@ -14,7 +14,7 @@ ruleTester.run('no-named-export', rule, { }), test({ code: 'export default from "foo.js"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), // no exports at all @@ -152,7 +152,7 @@ ruleTester.run('no-named-export', rule, { }), test({ code: 'export { a, b } from "foo.js"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: [{ type: 'ExportNamedDeclaration', message: 'Named exports are not allowed.', @@ -160,7 +160,7 @@ ruleTester.run('no-named-export', rule, { }), test({ code: `export type UserId = number;`, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: [{ type: 'ExportNamedDeclaration', message: 'Named exports are not allowed.', @@ -168,7 +168,7 @@ ruleTester.run('no-named-export', rule, { }), test({ code: 'export foo from "foo.js"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: [{ type: 'ExportNamedDeclaration', message: 'Named exports are not allowed.', @@ -176,7 +176,7 @@ ruleTester.run('no-named-export', rule, { }), test({ code: `export Memory, { MemoryValue } from './Memory'`, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: [{ type: 'ExportNamedDeclaration', message: 'Named exports are not allowed.', diff --git a/tests/src/rules/no-relative-parent-imports.js b/tests/src/rules/no-relative-parent-imports.js index 305049802..cb4ad83ce 100644 --- a/tests/src/rules/no-relative-parent-imports.js +++ b/tests/src/rules/no-relative-parent-imports.js @@ -4,7 +4,7 @@ import { parsers, test as _test, testFilePath } from '../utils'; const test = def => _test(Object.assign(def, { filename: testFilePath('./internal-modules/plugins/plugin2/index.js'), - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, })); const ruleTester = new RuleTester(); diff --git a/tests/src/rules/no-unresolved.js b/tests/src/rules/no-unresolved.js index 198d46167..160ac3658 100644 --- a/tests/src/rules/no-unresolved.js +++ b/tests/src/rules/no-unresolved.js @@ -30,7 +30,7 @@ function runResolverTests(resolver) { rest({ code: "import {someThing} from './test-module';" }), rest({ code: "import fs from 'fs';" }), rest({ code: "import('fs');", - parser: parsers.BABEL_OLD }), + parser: parsers.BABEL_ESLINT }), // check with eslint parser testVersion('>= 7', () => rest({ @@ -46,9 +46,9 @@ function runResolverTests(resolver) { // stage 1 proposal for export symmetry, rest({ code: 'export * as bar from "./bar"', - parser: parsers.BABEL_OLD }), + parser: parsers.BABEL_ESLINT }), rest({ code: 'export bar from "./bar"', - parser: parsers.BABEL_OLD }), + parser: parsers.BABEL_ESLINT }), rest({ code: 'import foo from "./jsx/MyUnCoolComponent.jsx"' }), // commonjs setting @@ -127,7 +127,7 @@ function runResolverTests(resolver) { message: 'Unable to resolve path to module \'in-alternate-root\'.', type: 'Literal', }], - parser: parsers.BABEL_OLD }), + parser: parsers.BABEL_ESLINT }), rest({ code: 'export { foo } from "./does-not-exist"', errors: ["Unable to resolve path to module './does-not-exist'."] }), @@ -148,11 +148,11 @@ function runResolverTests(resolver) { // export symmetry proposal rest({ code: 'export * as bar from "./does-not-exist"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: ["Unable to resolve path to module './does-not-exist'."], }), rest({ code: 'export bar from "./does-not-exist"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, errors: ["Unable to resolve path to module './does-not-exist'."], }), @@ -444,7 +444,7 @@ ruleTester.run('import() with built-in parser', rule, { context('TypeScript', () => { // Type-only imports were added in TypeScript ESTree 2.23.0 - getTSParsers().filter(x => x !== parsers.TS_OLD).forEach((parser) => { + getTSParsers().filter(x => x !== parsers.TYPESCRIPT_ESLINT).forEach((parser) => { ruleTester.run(`${parser}: no-unresolved ignore type-only`, rule, { valid: [ test({ diff --git a/tests/src/rules/no-unused-modules.js b/tests/src/rules/no-unused-modules.js index 485400ece..00b9fda6f 100644 --- a/tests/src/rules/no-unused-modules.js +++ b/tests/src/rules/no-unused-modules.js @@ -112,49 +112,49 @@ ruleTester.run('no-unused-modules', rule, { options: unusedExportsOptions, code: 'import { o2 } from "./file-o";export default () => 12', filename: testFilePath('./no-unused-modules/file-a.js'), - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ options: unusedExportsOptions, code: 'export const b = 2', filename: testFilePath('./no-unused-modules/file-b.js'), - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ options: unusedExportsOptions, code: 'const c1 = 3; function c2() { return 3 }; export { c1, c2 }', filename: testFilePath('./no-unused-modules/file-c.js'), - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ options: unusedExportsOptions, code: 'export function d() { return 4 }', filename: testFilePath('./no-unused-modules/file-d.js'), - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ options: unusedExportsOptions, code: 'export class q { q0() {} }', filename: testFilePath('./no-unused-modules/file-q.js'), - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ options: unusedExportsOptions, code: 'const e0 = 5; export { e0 as e }', filename: testFilePath('./no-unused-modules/file-e.js'), - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ options: unusedExportsOptions, code: 'const l0 = 5; const l = 10; export { l0 as l1, l }; export default () => {}', filename: testFilePath('./no-unused-modules/file-l.js'), - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ options: unusedExportsOptions, code: 'const o0 = 0; const o1 = 1; export { o0, o1 as o2 }; export default () => {}', filename: testFilePath('./no-unused-modules/file-o.js'), - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), ], invalid: [ @@ -253,8 +253,8 @@ describe('dynamic imports', () => { // test for unused exports with `import()` ruleTester.run('no-unused-modules', rule, { - valid: [ - test({ + valid: [].concat( + semver.satisfies(eslintPkg.version, '< 8') ? test({ options: unusedExportsOptions, code: ` export const a = 10 @@ -262,22 +262,22 @@ describe('dynamic imports', () => { export const c = 30 const d = 40 export default d - `, - parser: parsers.BABEL_OLD, + `, + parser: parsers.BABEL_ESLINT, filename: testFilePath('./no-unused-modules/exports-for-dynamic-js.js'), - }), - ], + }) : [], + ), invalid: [ test({ options: unusedExportsOptions, code: ` - export const a = 10 - export const b = 20 - export const c = 30 - const d = 40 - export default d + export const a = 10 + export const b = 20 + export const c = 30 + const d = 40 + export default d `, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, filename: testFilePath('./no-unused-modules/exports-for-dynamic-js-2.js'), errors: [ error(`exported declaration 'a' not used within other modules`), @@ -298,7 +298,7 @@ describe('dynamic imports', () => { const ts_d = 40 export default ts_d `, - parser: parsers.TS_NEW, + parser: parsers['@TYPESCRIPT_ESLINT'], filename: testFilePath('./no-unused-modules/typescript/exports-for-dynamic-ts.ts'), }), test({ @@ -306,7 +306,7 @@ describe('dynamic imports', () => { import App from './App'; `, filename: testFilePath('./unused-modules-reexport-crash/src/index.tsx'), - parser: parsers.TS_NEW, + parser: parsers['@TYPESCRIPT_ESLINT'], options: [{ unusedExports: true, ignoreExports: ['**/magic/**'], @@ -1188,7 +1188,7 @@ describe('correctly work with JSX only files', () => { test({ options: unusedExportsJsxOptions, code: 'import a from "file-jsx-a";', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, filename: testFilePath('./no-unused-modules/jsx/file-jsx-a.jsx'), }), ], @@ -1196,7 +1196,7 @@ describe('correctly work with JSX only files', () => { test({ options: unusedExportsJsxOptions, code: `export const b = 2;`, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, filename: testFilePath('./no-unused-modules/jsx/file-jsx-b.jsx'), errors: [ error(`exported declaration 'b' not used within other modules`), @@ -1212,7 +1212,7 @@ describe('ignore flow types', () => { test({ options: unusedExportsOptions, code: 'import { type FooType, type FooInterface } from "./flow-2";', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, filename: testFilePath('./no-unused-modules/flow/flow-0.js'), }), test({ @@ -1221,13 +1221,13 @@ describe('ignore flow types', () => { export type FooType = string; export interface FooInterface {}; `, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, filename: testFilePath('./no-unused-modules/flow/flow-2.js'), }), test({ options: unusedExportsOptions, code: 'import type { FooType, FooInterface } from "./flow-4";', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, filename: testFilePath('./no-unused-modules/flow/flow-3.js'), }), test({ @@ -1236,7 +1236,7 @@ describe('ignore flow types', () => { export type FooType = string; export interface FooInterface {}; `, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, filename: testFilePath('./no-unused-modules/flow/flow-4.js'), }), test({ @@ -1245,7 +1245,7 @@ describe('ignore flow types', () => { export type Bar = number; export interface BarInterface {}; `, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, filename: testFilePath('./no-unused-modules/flow/flow-1.js'), }), ], @@ -1259,13 +1259,13 @@ describe('support (nested) destructuring assignment', () => { test({ options: unusedExportsOptions, code: 'import {a, b} from "./destructuring-b";', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, filename: testFilePath('./no-unused-modules/destructuring-a.js'), }), test({ options: unusedExportsOptions, code: 'const obj = {a: 1, dummy: {b: 2}}; export const {a, dummy: {b}} = obj;', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, filename: testFilePath('./no-unused-modules/destructuring-b.js'), }), ], diff --git a/tests/src/rules/no-useless-path-segments.js b/tests/src/rules/no-useless-path-segments.js index f96095350..63092baff 100644 --- a/tests/src/rules/no-useless-path-segments.js +++ b/tests/src/rules/no-useless-path-segments.js @@ -29,11 +29,11 @@ function runResolverTests(resolver) { test({ code: 'import "./importType"', options: [{ noUselessIndex: true }] }), // ./importType.js does not exist test({ code: 'import(".")', - parser: parsers.BABEL_OLD }), + parser: parsers.BABEL_ESLINT }), test({ code: 'import("..")', - parser: parsers.BABEL_OLD }), + parser: parsers.BABEL_ESLINT }), test({ code: 'import("fs").then(function(fs) {})', - parser: parsers.BABEL_OLD }), + parser: parsers.BABEL_ESLINT }), ], invalid: [ @@ -232,19 +232,19 @@ function runResolverTests(resolver) { code: 'import("./")', output: 'import(".")', errors: [ 'Useless path segments for "./", should be "."'], - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import("../")', output: 'import("..")', errors: [ 'Useless path segments for "../", should be ".."'], - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'import("./deep//a")', output: 'import("./deep/a")', errors: [ 'Useless path segments for "./deep//a", should be "./deep/a"'], - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), ], }); diff --git a/tests/src/rules/no-webpack-loader-syntax.js b/tests/src/rules/no-webpack-loader-syntax.js index 2b841e18a..4a782b25c 100644 --- a/tests/src/rules/no-webpack-loader-syntax.js +++ b/tests/src/rules/no-webpack-loader-syntax.js @@ -85,7 +85,7 @@ context('TypeScript', function () { }; // @typescript-eslint/parser@5+ throw error for invalid module specifiers at parsing time. // https://github.com/typescript-eslint/typescript-eslint/releases/tag/v5.0.0 - if (!(parser === parsers.TS_NEW && semver.satisfies(require('@typescript-eslint/parser/package.json').version, '>= 5'))) { + if (!(parser === parsers['@TYPESCRIPT_ESLINT'] && semver.satisfies(require('@typescript-eslint/parser/package.json').version, '>= 5'))) { ruleTester.run('no-webpack-loader-syntax', rule, { valid: [ test(Object.assign({ diff --git a/tests/src/rules/order.js b/tests/src/rules/order.js index f5c3bb393..0ed54b8a3 100644 --- a/tests/src/rules/order.js +++ b/tests/src/rules/order.js @@ -2383,7 +2383,7 @@ ruleTester.run('order', rule, { context('TypeScript', function () { getNonDefaultParsers() // Type-only imports were added in TypeScript ESTree 2.23.0 - .filter((parser) => parser !== parsers.TS_OLD) + .filter((parser) => parser !== parsers.TYPESCRIPT_ESLINT) .forEach((parser) => { const parserConfig = { parser, diff --git a/tests/src/rules/prefer-default-export.js b/tests/src/rules/prefer-default-export.js index 6ecd2e3af..aa2b36a62 100644 --- a/tests/src/rules/prefer-default-export.js +++ b/tests/src/rules/prefer-default-export.js @@ -66,7 +66,7 @@ ruleTester.run('prefer-default-export', rule, { }), test({ code: `export Memory, { MemoryValue } from './Memory'`, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), // no exports at all @@ -77,24 +77,24 @@ ruleTester.run('prefer-default-export', rule, { test({ code: `export type UserId = number;`, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), // issue #653 test({ code: 'export default from "foo.js"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), test({ code: 'export { a, b } from "foo.js"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), // ...SYNTAX_CASES, test({ code: ` export const [CounterProvider,, withCounter] = func();; `, - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, }), // es2022: Arbitrary module namespae identifier names testVersion('>= 8.7', () => ({ diff --git a/tests/src/rules/unambiguous.js b/tests/src/rules/unambiguous.js index 8cef69625..470ce0cfb 100644 --- a/tests/src/rules/unambiguous.js +++ b/tests/src/rules/unambiguous.js @@ -39,7 +39,7 @@ ruleTester.run('unambiguous', rule, { }, { code: 'function x() {}; export * as y from "z"', - parser: parsers.BABEL_OLD, + parser: parsers.BABEL_ESLINT, parserOptions: { ecmaVersion: 2015, sourceType: 'module' }, }, { diff --git a/tests/src/utils.js b/tests/src/utils.js index ed04aa967..8334aaa67 100644 --- a/tests/src/utils.js +++ b/tests/src/utils.js @@ -5,11 +5,13 @@ import semver from 'semver'; // warms up the module cache. this import takes a while (>500ms) import 'babel-eslint'; +const NODE_MODULES = '../../node_modules'; + export const parsers = { ESPREE: require.resolve('espree'), - TS_OLD: semver.satisfies(eslintPkg.version, '>=4.0.0 <6.0.0') && require.resolve('typescript-eslint-parser'), - TS_NEW: semver.satisfies(eslintPkg.version, '> 5') && require.resolve('@typescript-eslint/parser'), - BABEL_OLD: require.resolve('babel-eslint'), + TYPESCRIPT_ESLINT: semver.satisfies(eslintPkg.version, '>=4.0.0 <6.0.0') && path.join(__dirname, NODE_MODULES, 'typescript-eslint-parser'), + '@TYPESCRIPT_ESLINT': semver.satisfies(eslintPkg.version, '> 5') && path.join(__dirname, NODE_MODULES, '@typescript-eslint/parser'), + BABEL_ESLINT: path.join(__dirname, NODE_MODULES, 'babel-eslint'), }; export function testFilePath(relativePath) { @@ -18,13 +20,13 @@ export function testFilePath(relativePath) { export function getTSParsers() { return [ - parsers.TS_OLD, - parsers.TS_NEW, + parsers.TYPESCRIPT_ESLINT, + parsers['@TYPESCRIPT_ESLINT'], ].filter(Boolean); } export function getNonDefaultParsers() { - return getTSParsers().concat(parsers.BABEL_OLD).filter(Boolean); + return getTSParsers().concat(parsers.BABEL_ESLINT).filter(Boolean); } export const FILENAME = testFilePath('foo.js'); @@ -67,7 +69,7 @@ export const SYNTAX_CASES = [ test({ code: 'for (let [ foo, bar ] of baz) {}' }), test({ code: 'const { x, y } = bar' }), - test({ code: 'const { x, y, ...z } = bar', parser: parsers.BABEL_OLD }), + test({ code: 'const { x, y, ...z } = bar', parser: parsers.BABEL_ESLINT }), // all the exports test({ code: 'let x; export { x }' }), @@ -75,7 +77,7 @@ export const SYNTAX_CASES = [ // not sure about these since they reference a file // test({ code: 'export { x } from "./y.js"'}), - // test({ code: 'export * as y from "./y.js"', parser: parsers.BABEL_OLD}), + // test({ code: 'export * as y from "./y.js"', parser: parsers.BABEL_ESLINT}), test({ code: 'export const x = null' }), test({ code: 'export var x = null' }),