Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support ESLint v6 #1393

Merged
merged 9 commits into from Jun 24, 2019
7 changes: 3 additions & 4 deletions .travis.yml
Expand Up @@ -9,7 +9,7 @@ node_js:
os: linux

env:
- ESLINT_VERSION=^6.0.0-alpha
- ESLINT_VERSION=6
- ESLINT_VERSION=5
- ESLINT_VERSION=4
- ESLINT_VERSION=3
Expand Down Expand Up @@ -59,16 +59,15 @@ matrix:
- node_js: '4'
env: ESLINT_VERSION=5
- node_js: '4'
env: ESLINT_VERSION=^6.0.0-alpha
env: ESLINT_VERSION=6
- node_js: '6'
env: ESLINT_VERSION=^6.0.0-alpha
env: ESLINT_VERSION=6

fast_finish: true
allow_failures:
# issues with typescript deps in this version intersection
- node_js: '4'
env: ESLINT_VERSION=4
- env: ESLINT_VERSION=^6.0.0-alpha

before_install:
- 'nvm install-latest-npm'
Expand Down
10 changes: 5 additions & 5 deletions package.json
Expand Up @@ -47,7 +47,8 @@
},
"homepage": "https://github.com/benmosher/eslint-plugin-import",
"devDependencies": {
"@typescript-eslint/parser": "^1.5.0",
"@eslint/import-test-order-redirect-scoped": "file:./tests/files/order-redirect-scoped",
"@typescript-eslint/parser": "1.10.3-alpha.13",
"babel-cli": "^6.26.0",
"babel-core": "^6.26.3",
"babel-eslint": "^8.2.6",
Expand All @@ -58,13 +59,12 @@
"chai": "^4.2.0",
"coveralls": "^3.0.2",
"cross-env": "^4.0.0",
"eslint": "2.x - 5.x",
"eslint": "2.x - 6.x",
"eslint-import-resolver-node": "file:./resolvers/node",
"eslint-import-resolver-typescript": "^1.0.2",
"eslint-import-resolver-webpack": "file:./resolvers/webpack",
"eslint-module-utils": "file:./utils",
"eslint-import-test-order-redirect": "file:./tests/files/order-redirect",
"@eslint/import-test-order-redirect-scoped": "file:./tests/files/order-redirect-scoped",
"eslint-module-utils": "file:./utils",
"eslint-plugin-import": "2.x",
"linklocal": "^2.8.2",
"mocha": "^3.5.3",
Expand All @@ -77,7 +77,7 @@
"typescript-eslint-parser": "^22.0.0"
},
"peerDependencies": {
"eslint": "2.x - 5.x"
"eslint": "2.x - 6.x"
},
"dependencies": {
"array-includes": "^3.0.3",
Expand Down
5 changes: 4 additions & 1 deletion src/rules/no-unused-modules.js
Expand Up @@ -15,7 +15,10 @@ try {
var FileEnumerator = require('eslint/lib/cli-engine/file-enumerator').FileEnumerator
listFilesToProcess = function (src) {
var e = new FileEnumerator()
return Array.from(e.iterateFiles(src))
return Array.from(e.iterateFiles(src), ({ filePath, ignored }) => ({
ignored,
filename: filePath,
}))
}
} catch (e1) {
try {
Expand Down
15 changes: 11 additions & 4 deletions tests/src/core/getExports.js
Expand Up @@ -187,6 +187,7 @@ describe('ExportMap', function () {
jsdocTests({
parserPath: 'espree',
parserOptions: {
ecmaVersion: 2015,
sourceType: 'module',
attachComment: true,
},
Expand All @@ -195,6 +196,7 @@ describe('ExportMap', function () {
jsdocTests({
parserPath: 'espree',
parserOptions: {
ecmaVersion: 2015,
sourceType: 'module',
attachComment: true,
},
Expand All @@ -206,6 +208,7 @@ describe('ExportMap', function () {
jsdocTests({
parserPath: 'babel-eslint',
parserOptions: {
ecmaVersion: 2015,
sourceType: 'module',
attachComment: true,
},
Expand All @@ -214,6 +217,7 @@ describe('ExportMap', function () {
jsdocTests({
parserPath: 'babel-eslint',
parserOptions: {
ecmaVersion: 2015,
sourceType: 'module',
attachComment: true,
},
Expand All @@ -223,8 +227,8 @@ describe('ExportMap', function () {
})

context('exported static namespaces', function () {
const espreeContext = { parserPath: 'espree', parserOptions: { sourceType: 'module' }, settings: {} }
const babelContext = { parserPath: 'babel-eslint', parserOptions: { sourceType: 'module' }, settings: {} }
const espreeContext = { parserPath: 'espree', parserOptions: { ecmaVersion: 2015, sourceType: 'module' }, settings: {} }
const babelContext = { parserPath: 'babel-eslint', parserOptions: { ecmaVersion: 2015, sourceType: 'module' }, settings: {} }

it('works with espree & traditional namespace exports', function () {
const path = getFilename('deep/a.js')
Expand Down Expand Up @@ -255,7 +259,7 @@ describe('ExportMap', function () {
})

context('deep namespace caching', function () {
const espreeContext = { parserPath: 'espree', parserOptions: { sourceType: 'module' }, settings: {} }
const espreeContext = { parserPath: 'espree', parserOptions: { ecmaVersion: 2015, sourceType: 'module' }, settings: {} }
let a
before('sanity check and prime cache', function (done) {
// first version
Expand Down Expand Up @@ -332,13 +336,16 @@ describe('ExportMap', function () {

const configs = [
// ['string form', { 'typescript-eslint-parser': '.ts' }],
['array form', { 'typescript-eslint-parser': ['.ts', '.tsx'] }],
]

if (semver.satisfies(eslintPkg.version, '>5.0.0')) {
configs.push(['array form', { '@typescript-eslint/parser': ['.ts', '.tsx'] }])
}

if (semver.satisfies(eslintPkg.version, '<6.0.0')) {
configs.push(['array form', { 'typescript-eslint-parser': ['.ts', '.tsx'] }])
}

configs.forEach(([description, parserConfig]) => {

describe(description, function () {
Expand Down
2 changes: 1 addition & 1 deletion tests/src/core/parse.js
Expand Up @@ -20,7 +20,7 @@ describe('parse(content, { settings, ecmaFeatures })', function () {
})

it('infers jsx from ecmaFeatures when using stock parser', function () {
expect(() => parse(path, content, { settings: {}, parserPath: 'espree', parserOptions: { sourceType: 'module', ecmaFeatures: { jsx: true } } }))
expect(() => parse(path, content, { settings: {}, parserPath: 'espree', parserOptions: { ecmaVersion: 2015, sourceType: 'module', ecmaFeatures: { jsx: true } } }))
.not.to.throw(Error)
})

Expand Down
26 changes: 13 additions & 13 deletions tests/src/rules/default.js
Expand Up @@ -28,19 +28,19 @@ ruleTester.run('default', rule, {

// es7 export syntax
test({ code: 'export bar from "./bar"'
, parser: 'babel-eslint' }),
, parser: require.resolve('babel-eslint') }),
ljharb marked this conversation as resolved.
Show resolved Hide resolved
test({ code: 'export { default as bar } from "./bar"' }),
test({ code: 'export bar, { foo } from "./bar"'
, parser: 'babel-eslint' }),
, parser: require.resolve('babel-eslint') }),
test({ code: 'export { default as bar, foo } from "./bar"' }),
test({ code: 'export bar, * as names from "./bar"'
, parser: 'babel-eslint' }),
, parser: require.resolve('babel-eslint') }),

// sanity check
test({ code: 'export {a} from "./named-exports"' }),
test({
code: 'import twofer from "./trampoline"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),

// jsx
Expand Down Expand Up @@ -68,27 +68,27 @@ ruleTester.run('default', rule, {
// from no-errors
test({
code: "import Foo from './jsx/FooES7.js';",
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),

// #545: more ES7 cases
test({
code: "import bar from './default-export-from.js';",
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),
test({
code: "import bar from './default-export-from-named.js';",
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),
test({
code: "import bar from './default-export-from-ignored.js';",
settings: { 'import/ignore': ['common'] },
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),
test({
code: "export bar from './default-export-from-ignored.js';",
settings: { 'import/ignore': ['common'] },
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),

...SYNTAX_CASES,
Expand All @@ -113,23 +113,23 @@ ruleTester.run('default', rule, {
// es7 export syntax
test({
code: 'export baz from "./named-exports"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
errors: ['No default export found in module.'],
}),
test({
code: 'export baz, { bar } from "./named-exports"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
errors: ['No default export found in module.'],
}),
test({
code: 'export baz, * as names from "./named-exports"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
errors: ['No default export found in module.'],
}),
// exports default from a module with no default
test({
code: 'import twofer from "./broken-trampoline"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
errors: ['No default export found in module.'],
}),

Expand Down
2 changes: 1 addition & 1 deletion tests/src/rules/dynamic-import-chunkname.js
Expand Up @@ -14,7 +14,7 @@ const pickyCommentOptions = [{
const multipleImportFunctionOptions = [{
importFunctions: ['dynamicImport', 'definitelyNotStaticImport'],
}]
const parser = 'babel-eslint'
const parser = require.resolve('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'
Expand Down
8 changes: 6 additions & 2 deletions tests/src/rules/export.js
Expand Up @@ -112,10 +112,14 @@ ruleTester.run('export', rule, {

context('Typescript', function () {
// Typescript
const parsers = ['typescript-eslint-parser']
const parsers = []

if (semver.satisfies(eslintPkg.version, '>5.0.0')) {
parsers.push('@typescript-eslint/parser')
parsers.push(require.resolve('@typescript-eslint/parser'))
}

if (semver.satisfies(eslintPkg.version, '<6.0.0')) {
parsers.push(require.resolve('typescript-eslint-parser'))
}

parsers.forEach((parser) => {
Expand Down
2 changes: 1 addition & 1 deletion tests/src/rules/max-dependencies.js
Expand Up @@ -66,7 +66,7 @@ ruleTester.run('max-dependencies', rule, {

test({
code: 'import type { x } from \'./foo\'; import type { y } from \'./bar\'',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
options: [{
max: 1,
}],
Expand Down
40 changes: 22 additions & 18 deletions tests/src/rules/named.js
Expand Up @@ -55,11 +55,11 @@ ruleTester.run('named', rule, {
// es7
test({
code: 'export bar, { foo } from "./bar"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),
test({
code: 'import { foo, bar } from "./named-trampoline"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),

// regression tests
Expand All @@ -74,43 +74,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: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),
test({
code: 'import typeof { MissingType } from "./flowtypes"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),
test({
code: 'import type { MyOpaqueType } from "./flowtypes"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),
test({
code: 'import typeof { MyOpaqueType } from "./flowtypes"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),
test({
code: 'import { type MyOpaqueType, MyClass } from "./flowtypes"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),
test({
code: 'import { typeof MyOpaqueType, MyClass } from "./flowtypes"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),
test({
code: 'import typeof MissingType from "./flowtypes"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),
test({
code: 'import typeof * as MissingType from "./flowtypes"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),
test({
code: 'export type { MissingType } from "./flowtypes"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),
test({
code: 'export type { MyOpaqueType } from "./flowtypes"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
}),

// jsnext
Expand Down Expand Up @@ -188,17 +188,17 @@ ruleTester.run('named', rule, {
// es7
test({
code: 'export bar2, { bar } from "./bar"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
errors: ["bar not found in './bar'"],
}),
test({
code: 'import { foo, bar, baz } from "./named-trampoline"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
errors: ["baz not found in './named-trampoline'"],
}),
test({
code: 'import { baz } from "./broken-trampoline"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
errors: ["baz not found via broken-trampoline.js -> named-exports.js"],
}),

Expand All @@ -214,7 +214,7 @@ ruleTester.run('named', rule, {

test({
code: 'import { type MyOpaqueType, MyMissingClass } from "./flowtypes"',
parser: 'babel-eslint',
parser: require.resolve('babel-eslint'),
errors: ["MyMissingClass not found in './flowtypes'"],
}),

Expand Down Expand Up @@ -286,10 +286,14 @@ ruleTester.run('named (export *)', rule, {

context('Typescript', function () {
// Typescript
const parsers = ['typescript-eslint-parser']
const parsers = []

if (semver.satisfies(eslintPkg.version, '>5.0.0')) {
parsers.push('@typescript-eslint/parser')
parsers.push(require.resolve('@typescript-eslint/parser'))
}

if (semver.satisfies(eslintPkg.version, '<6.0.0')) {
parsers.push(require.resolve('typescript-eslint-parser'))
}

parsers.forEach((parser) => {
Expand Down