From 5d7ddfcb7a43c3d62a09009e667b587c1144bf94 Mon Sep 17 00:00:00 2001 From: JounQin Date: Wed, 25 Jun 2025 08:49:01 +0800 Subject: [PATCH 1/2] fix: should only report on fixable paths --- src/rules/extensions.ts | 31 ++++++++++++++++++++++++------- test/rules/extensions.spec.ts | 5 +++++ 2 files changed, 29 insertions(+), 7 deletions(-) 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: [ From 1ad9595f3d9c137cab56a85aa1cb1ea1cb27375f Mon Sep 17 00:00:00 2001 From: JounQin Date: Wed, 25 Jun 2025 08:50:44 +0800 Subject: [PATCH 2/2] Create dull-wombats-boil.md Signed-off-by: JounQin --- .changeset/dull-wombats-boil.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/dull-wombats-boil.md 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