diff --git a/tests/files/module-exports-direct.js b/tests/files/module-exports-direct.js new file mode 100644 index 0000000000..b55d834ab7 --- /dev/null +++ b/tests/files/module-exports-direct.js @@ -0,0 +1,5 @@ +exports = { + a: 0, + 1: 1, + 'c': 2, +} diff --git a/tests/files/module-exports-number.js b/tests/files/module-exports-number.js new file mode 100644 index 0000000000..caedade498 --- /dev/null +++ b/tests/files/module-exports-number.js @@ -0,0 +1 @@ +module.exports = 5 diff --git a/tests/files/named-exports-es5.js b/tests/files/named-exports-es5.js new file mode 100644 index 0000000000..04571436bc --- /dev/null +++ b/tests/files/named-exports-es5.js @@ -0,0 +1,15 @@ +Object.defineProperty(exports, '__esModule', {value: true}) + +exports.destructuredProp = {} + +module.exports.arrayKeyProp = null + +exports.deepSparseElement = [] + +exports.a = 1 +exports.b = 2 + +const c = 3 +module.exports.d = c + +exports.ExportedClass = class {} diff --git a/tests/files/re-export-names-es5.js b/tests/files/re-export-names-es5.js new file mode 100644 index 0000000000..c80073a133 --- /dev/null +++ b/tests/files/re-export-names-es5.js @@ -0,0 +1,8 @@ +const namedExports = require('./named-exports-es5') + +module.exports = { + __esModule: true, + foo: namedExports.a, + bar: namedExports.b, + baz: 'will it blend?', +} diff --git a/tests/src/rules/named.js b/tests/src/rules/named.js index cb1a5b843b..c0f952be11 100644 --- a/tests/src/rules/named.js +++ b/tests/src/rules/named.js @@ -33,6 +33,14 @@ ruleTester.run('named', rule, { '// eslint-disable-line named' }), test({ code: 'import { foo, bar } from "./re-export-names"' }), + test({ + code: 'import { foo, bar } from "./re-export-names-es5"', + options: [{ commonjs: { exports: true }}], + }), + test({ + code: 'import { foo, bar } from "./re-export-names-es5"', + options: [{ commonjs: true }], + }), test({ code: 'import { foo, bar } from "./common"' , settings: { 'import/ignore': ['common'] } }), @@ -65,6 +73,11 @@ ruleTester.run('named', rule, { test({ code: 'import { destructuredProp } from "./named-exports"' }), test({ code: 'import { arrayKeyProp } from "./named-exports"' }), test({ code: 'import { deepProp } from "./named-exports"' }), + test({ code: 'import { deepProp, deepSparseElement } from "./named-exports-es5"' }), + test({ + code: 'import { deepProp, deepSparseElement } from "./named-exports-es5"', + options: [{ commonjs: { exports: true } }], + }), test({ code: 'import { deepSparseElement } from "./named-exports"' }), // should ignore imported flow types, even if they don’t exist @@ -154,6 +167,10 @@ ruleTester.run('named', rule, { test({ code: '/*jsnext*/ import { createStore } from "redux"', }), + test({ + code: 'import { createStore } from "redux/lib/index"', + options: [{ commonjs: true }], + }), // ignore is ignored if exports are found test({ code: 'import { foo } from "es6-module"' }), @@ -178,6 +195,17 @@ ruleTester.run('named', rule, { code: 'import { common } from "./re-export-default"', }), + // direct module exports cases + test({ + code: 'import { a, c } from "./module-exports-direct"', + options: [{ commonjs: true }], + }), + + test({ + code: 'import { default as n } from "./module-exports-number"', + options: [{ commonjs: true }], + }), + ...SYNTAX_CASES, ], @@ -207,10 +235,16 @@ ruleTester.run('named', rule, { test({ code: 'import { a } from "./re-export-names"', - options: [2, 'es6-only'], + options: [{ commonjs: true }], errors: [error('a', './re-export-names')], }), + test({ + code: 'import { a } from "./re-export-names-es5"', + options: [{ commonjs: true }], + errors: [error('a', './re-export-names-es5')], + }), + // export tests test({ code: 'export { bar } from "./bar"', @@ -282,11 +316,23 @@ ruleTester.run('named', rule, { settings: { 'import/ignore': [] }, errors: ["createSnorlax not found in 'redux'"], }), + test({ + code: 'import { createSnorlax } from "redux/lib/index"', + settings: { 'import/ignore': [] }, + options: [{ commonjs: true }], + errors: ["createSnorlax not found in 'redux/lib/index'"], + }), // should work without ignore test({ code: '/*jsnext*/ import { createSnorlax } from "redux"', errors: ["createSnorlax not found in 'redux'"], }), + test({ + code: 'import { createSnorlax } from "redux/lib/index"', + options: [{ commonjs: { exports: true } }], + errors: ["createSnorlax not found in 'redux/lib/index'"], + }), + // ignore is ignored if exports are found test({ @@ -306,6 +352,19 @@ ruleTester.run('named', rule, { code: 'import { default as barDefault } from "./re-export"', errors: [`default not found in './re-export'`], }), + + // direct module.exports assignment + test({ + code: 'import { b } from "./module-exports-direct"', + options: [{ commonjs: true }], + errors: [ error('b', './module-exports-direct') ], + }), + + test({ + code: 'import { noExports } from "./module-exports-number"', + options: [{ commonjs: true }], + errors: [ error('noExports', './module-exports-number') ], + }), ], })