From 982493d03acb30a05f46a9d41c31cf85f9acf4cb Mon Sep 17 00:00:00 2001 From: Pascal Corpet Date: Sun, 15 Dec 2019 23:42:50 +0100 Subject: [PATCH] [Fix] `extensions`: Ignore query strings when checking for extensions. Fixes #1567. --- CHANGELOG.md | 2 ++ src/rules/extensions.js | 10 ++++++---- tests/src/rules/extensions.js | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8632f2386..b3061594a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ This change log adheres to standards from [Keep a CHANGELOG](http://keepachangel - [`import/extensions`]: ignore non-main modules ([#1563], thanks [@saschanaz]) - TypeScript config: lookup for external modules in @types folder ([#1526], thanks [@joaovieira]) - [`no-extraneous-dependencies`]: ensure `node.source` is truthy ([#1589], thanks [@ljharb]) +- [`extensions`]: Ignore query strings when checking for extensions ([#1572], thanks [@pcorpet]) ## [2.19.1] - 2019-12-08 ### Fixed @@ -631,6 +632,7 @@ for info on changes for earlier releases. [#1589]: https://github.com/benmosher/eslint-plugin-import/issues/1589 [#1586]: https://github.com/benmosher/eslint-plugin-import/pull/1586 +[#1572]: https://github.com/benmosher/eslint-plugin-import/pull/1572 [#1563]: https://github.com/benmosher/eslint-plugin-import/pull/1563 [#1560]: https://github.com/benmosher/eslint-plugin-import/pull/1560 [#1551]: https://github.com/benmosher/eslint-plugin-import/pull/1551 diff --git a/src/rules/extensions.js b/src/rules/extensions.js index c6077fb2c..c0213cad2 100644 --- a/src/rules/extensions.js +++ b/src/rules/extensions.js @@ -132,10 +132,12 @@ module.exports = { // bail if the declaration doesn't have a source, e.g. "export { foo };" if (!source) return - const importPath = source.value + const importPathWithQueryString = source.value // don't enforce anything on builtins - if (isBuiltIn(importPath, context.settings)) return + if (isBuiltIn(importPathWithQueryString, context.settings)) return + + const importPath = importPathWithQueryString.replace(/\?(.*)$/, '') const resolvedPath = resolve(importPath, context) @@ -154,14 +156,14 @@ module.exports = { context.report({ node: source, message: - `Missing file extension ${extension ? `"${extension}" ` : ''}for "${importPath}"`, + `Missing file extension ${extension ? `"${extension}" ` : ''}for "${importPathWithQueryString}"`, }) } } else if (extension) { if (isUseOfExtensionForbidden(extension) && isResolvableWithoutExtension(importPath)) { context.report({ node: source, - message: `Unexpected use of file extension "${extension}" for "${importPath}"`, + message: `Unexpected use of file extension "${extension}" for "${importPathWithQueryString}"`, }) } } diff --git a/tests/src/rules/extensions.js b/tests/src/rules/extensions.js index 720867c21..5f0a254f5 100644 --- a/tests/src/rules/extensions.js +++ b/tests/src/rules/extensions.js @@ -116,6 +116,16 @@ ruleTester.run('extensions', rule, { ].join('\n'), options: [ 'never' ], }), + + // Query strings. + test({ + code: 'import bare from "./foo?a=True.ext"', + options: [ 'never' ], + }), + test({ + code: 'import bare from "./foo.js?a=True"', + options: [ 'always' ], + }), ], invalid: [ @@ -375,5 +385,29 @@ ruleTester.run('extensions', rule, { }, ], }), + + // Query strings. + test({ + code: 'import withExtension from "./foo.js?a=True"', + options: [ 'never' ], + errors: [ + { + message: 'Unexpected use of file extension "js" for "./foo.js?a=True"', + line: 1, + column: 27, + }, + ], + }), + test({ + code: 'import withoutExtension from "./foo?a=True.ext"', + options: [ 'always' ], + errors: [ + { + message: 'Missing file extension for "./foo?a=True.ext"', + line: 1, + column: 30, + }, + ], + }), ], })