diff --git a/CHANGELOG.md b/CHANGELOG.md index 18409a9c1..6c0bfec24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ This change log adheres to standards from [Keep a CHANGELOG](http://keepachangel ## [Unreleased] +### Fixed +- [`import/extensions`]: ignore non-main modules ([#1563], thanks [@saschanaz]) + ## [2.19.1] - 2019-12-08 ### Fixed - [`no-extraneous-dependencies`]: ensure `node.source` exists @@ -620,6 +623,7 @@ for info on changes for earlier releases. [`memo-parser`]: ./memo-parser/README.md +[#1563]: https://github.com/benmosher/eslint-plugin-import/pull/1563 [#1551]: https://github.com/benmosher/eslint-plugin-import/pull/1551 [#1542]: https://github.com/benmosher/eslint-plugin-import/pull/1542 [#1521]: https://github.com/benmosher/eslint-plugin-import/pull/1521 diff --git a/src/core/importType.js b/src/core/importType.js index 722ce7b06..57558cbd8 100644 --- a/src/core/importType.js +++ b/src/core/importType.js @@ -34,7 +34,7 @@ function isExternalPath(path, name, settings) { } const externalModuleRegExp = /^\w/ -function isExternalModule(name, settings, path) { +export function isExternalModule(name, settings, path) { return externalModuleRegExp.test(name) && isExternalPath(path, name, settings) } @@ -44,7 +44,7 @@ export function isExternalModuleMain(name, settings, path) { } const scopedRegExp = /^@[^/]+\/?[^/]+/ -function isScoped(name) { +export function isScoped(name) { return scopedRegExp.test(name) } diff --git a/src/rules/extensions.js b/src/rules/extensions.js index 0fe605adc..c6077fb2c 100644 --- a/src/rules/extensions.js +++ b/src/rules/extensions.js @@ -1,7 +1,7 @@ import path from 'path' import resolve from 'eslint-module-utils/resolve' -import { isBuiltIn, isExternalModuleMain, isScopedMain } from '../core/importType' +import { isBuiltIn, isExternalModule, isScoped } from '../core/importType' import docsUrl from '../docsUrl' const enumValues = { enum: [ 'always', 'ignorePackages', 'never' ] } @@ -110,8 +110,8 @@ module.exports = { return props.pattern[extension] || props.defaultConfig } - function isUseOfExtensionRequired(extension, isPackageMain) { - return getModifier(extension) === 'always' && (!props.ignorePackages || !isPackageMain) + function isUseOfExtensionRequired(extension, isPackage) { + return getModifier(extension) === 'always' && (!props.ignorePackages || !isPackage) } function isUseOfExtensionForbidden(extension) { @@ -144,11 +144,11 @@ module.exports = { const extension = path.extname(resolvedPath || importPath).substring(1) // determine if this is a module - const isPackageMain = isExternalModuleMain(importPath, context.settings) - || isScopedMain(importPath) + const isPackage = isExternalModule(importPath, context.settings) + || isScoped(importPath) if (!extension || !importPath.endsWith(`.${extension}`)) { - const extensionRequired = isUseOfExtensionRequired(extension, isPackageMain) + const extensionRequired = isUseOfExtensionRequired(extension, isPackage) const extensionForbidden = isUseOfExtensionForbidden(extension) if (extensionRequired && !extensionForbidden) { context.report({ diff --git a/tests/src/rules/extensions.js b/tests/src/rules/extensions.js index a1629335c..720867c21 100644 --- a/tests/src/rules/extensions.js +++ b/tests/src/rules/extensions.js @@ -293,6 +293,7 @@ ruleTester.run('extensions', rule, { import bar from './bar.json' import Component from './Component' import baz from 'foo/baz' + import baw from '@scoped/baw/import' import express from 'express' `, options: [ 'always', {ignorePackages: true} ], @@ -301,10 +302,6 @@ ruleTester.run('extensions', rule, { message: 'Missing file extension for "./Component"', line: 4, column: 31, - }, { - message: 'Missing file extension for "foo/baz"', - line: 5, - column: 25, }, ], }), @@ -315,6 +312,7 @@ ruleTester.run('extensions', rule, { import bar from './bar.json' import Component from './Component' import baz from 'foo/baz' + import baw from '@scoped/baw/import' import express from 'express' `, options: [ 'ignorePackages' ], @@ -323,10 +321,6 @@ ruleTester.run('extensions', rule, { message: 'Missing file extension for "./Component"', line: 4, column: 31, - }, { - message: 'Missing file extension for "foo/baz"', - line: 5, - column: 25, }, ], }),