From bda776992cfb64d147c9e65d732ed9d040f21aa0 Mon Sep 17 00:00:00 2001 From: maximelkin Date: Tue, 19 Nov 2019 09:14:27 +0300 Subject: [PATCH] Add `ignoreImports` option to `import-index` rule (#421) Co-authored-by: Sindre Sorhus --- docs/rules/import-index.md | 22 +++++++++++++++ rules/import-index.js | 25 ++++++++++++++-- test/import-index.js | 58 +++++++++++++++++++++++++++++++++++++- 3 files changed, 101 insertions(+), 4 deletions(-) diff --git a/docs/rules/import-index.md b/docs/rules/import-index.md index 66341e6896..9045835a66 100644 --- a/docs/rules/import-index.md +++ b/docs/rules/import-index.md @@ -61,3 +61,25 @@ const m = require('@foo/bar'); ```js import m from '.'; ``` + + +## Options + +### ignoreImports + +Type: `boolean`\ +Default: `false` + +Don't check `import` statements. + +Can be useful if you're using native `import` in Node.js where the filename and extension is required. + +```js +// eslint unicorn/import-index: ["error", {"ignoreImports": true}] +import m from './index'; // Passes +``` + +```js +// eslint unicorn/import-index: ["error", {"ignoreImports": false}] +import m from './index'; // Fails +``` diff --git a/rules/import-index.js b/rules/import-index.js index 7dd341d301..8df0d90457 100644 --- a/rules/import-index.js +++ b/rules/import-index.js @@ -16,12 +16,30 @@ const importIndex = (context, node, argument) => { }; const create = context => { - return { - 'CallExpression[callee.name="require"]': node => importIndex(context, node, node.arguments[0]), - ImportDeclaration: node => importIndex(context, node, node.source) + const options = context.options[0] || {}; + + const rules = { + 'CallExpression[callee.name="require"]': node => importIndex(context, node, node.arguments[0]) }; + + if (!options.ignoreImports) { + rules.ImportDeclaration = node => importIndex(context, node, node.source); + } + + return rules; }; +const schema = [{ + type: 'object', + properties: { + ignoreImports: { + type: 'boolean', + default: false + } + }, + additionalProperties: false +}]; + module.exports = { create, meta: { @@ -29,6 +47,7 @@ module.exports = { docs: { url: getDocumentationUrl(__filename) }, + schema, fixable: 'code' } }; diff --git a/test/import-index.js b/test/import-index.js index a84e231067..95c8b2bba7 100644 --- a/test/import-index.js +++ b/test/import-index.js @@ -16,10 +16,18 @@ const error = { message: 'Do not reference the index file directly.' }; +const ignoreImportsOptions = [{ + ignoreImports: true +}]; + ruleTester.run('import-index', rule, { valid: [ 'const m = require()', 'const m = require(\'.\')', + { + code: 'const m = require(\'.\')', + options: ignoreImportsOptions + }, 'const m = require(\'..\')', 'const m = require(\'../..\')', 'const m = require(\'./foobar\')', @@ -38,11 +46,47 @@ ruleTester.run('import-index', rule, { 'import m from \'foobar\'', 'import m from \'index\'', 'import m from \'index.js\'', + { + code: 'import m from \'index.js\'', + options: ignoreImportsOptions + }, 'import m from \'indexbar\'', 'import m from \'fooindex\'', 'import m from \'@index/foo\'', 'import m from \'@foo/index\'', - 'import m from \'@foo/index.js\'' + 'import m from \'@foo/index.js\'', + { + code: 'import m from \'./\'', + options: ignoreImportsOptions + }, + { + code: 'import m from \'./index\'', + options: ignoreImportsOptions + }, + { + code: 'import m from \'./index.js\'', + options: ignoreImportsOptions + }, + { + code: 'import m from \'../../index\'', + options: ignoreImportsOptions + }, + { + code: 'import m from \'./foo/index.js\'', + options: ignoreImportsOptions + }, + { + code: 'import m from \'./foobar/\'', + options: ignoreImportsOptions + }, + { + code: 'import m from \'@foo/index/index\'', + options: ignoreImportsOptions + }, + { + code: 'import m from \'@foo/index/index.js\'', + options: ignoreImportsOptions + } ], invalid: [ { @@ -60,11 +104,23 @@ ruleTester.run('import-index', rule, { errors: [error], output: 'const m = require(\'.\')' }, + { + code: 'const m = require(\'./index\')', + errors: [error], + output: 'const m = require(\'.\')', + options: ignoreImportsOptions + }, { code: 'const m = require(\'./index.js\')', errors: [error], output: 'const m = require(\'.\')' }, + { + code: 'const m = require(\'./index.js\')', + errors: [error], + output: 'const m = require(\'.\')', + options: ignoreImportsOptions + }, { code: 'const m = require(\'../../index.js\')', errors: [error],