diff --git a/.changeset/dull-wombats-boil.md b/.changeset/dull-wombats-boil.md new file mode 100644 index 00000000..bf8b4973 --- /dev/null +++ b/.changeset/dull-wombats-boil.md @@ -0,0 +1,5 @@ +--- +"eslint-plugin-import-x": patch +--- + +fix(extensions): should only report on fixable paths diff --git a/src/rules/extensions.ts b/src/rules/extensions.ts index 7f8c5f82..2ec5a22f 100644 --- a/src/rules/extensions.ts +++ b/src/rules/extensions.ts @@ -355,8 +355,9 @@ export default createRule({ ) const extensionForbidden = isUseOfExtensionForbidden(extension) if (extensionRequired && !extensionForbidden) { - const fixedImportPath = stringifyPath({ - pathname: `${ + const pathname = + extension && + `${ /([\\/]|[\\/]?\.?\.)$/.test(importPath) ? `${ importPath.endsWith('/') @@ -364,10 +365,17 @@ export default createRule({ : importPath }/index.${extension}` : `${importPath}.${extension}` - }`, - query, - hash, - }) + }` + const fixedImportPath = + extension && stringifyPath({ pathname, query, hash }) + + if ( + importPath === fixedImportPath || + resolvedPath !== resolve(pathname, context) + ) { + return + } + const fixOrSuggest = { fix(fixer: TSESLint.RuleFixer) { return fixer.replaceText( @@ -376,6 +384,7 @@ export default createRule({ ) }, } + context.report({ node: source, messageId: extension ? 'missingKnown' : 'missing', @@ -408,11 +417,17 @@ export default createRule({ ) { const fixedPathname = importPath.slice(0, -(extension.length + 1)) const isIndex = fixedPathname.endsWith('/index') + const pathname = isIndex ? fixedPathname.slice(0, -6) : fixedPathname const fixedImportPath = stringifyPath({ - pathname: isIndex ? fixedPathname.slice(0, -6) : fixedPathname, + pathname, query, hash, }) + + if (resolvedPath !== resolve(pathname, context)) { + return + } + const fixOrSuggest = { fix(fixer: TSESLint.RuleFixer) { return fixer.replaceText( @@ -421,6 +436,7 @@ export default createRule({ ) }, } + const commonSuggestion = { ...fixOrSuggest, messageId: 'removeUnexpected' as const, @@ -430,6 +446,7 @@ export default createRule({ fixedImportPath, }, } + context.report({ node: source, messageId: 'unexpected', diff --git a/test/rules/extensions.spec.ts b/test/rules/extensions.spec.ts index f7824036..7d131efc 100644 --- a/test/rules/extensions.spec.ts +++ b/test/rules/extensions.spec.ts @@ -170,6 +170,11 @@ ruleTester.run('extensions', rule, { code: "import foo from './foo.js';", options: [{ fix: true, pattern: { js: 'always' } }], }), + + tValid({ + code: "import eslint from 'eslint';", + options: [{ fix: true, pattern: { js: 'always' } }], + }), ], invalid: [