From 36a72053b3bae25e13d9c89bd65195d376dffc94 Mon Sep 17 00:00:00 2001 From: Bryan Mishkin <698306+bmish@users.noreply.github.com> Date: Thu, 5 Aug 2021 19:48:58 -0700 Subject: [PATCH 1/5] Chore: Update ignore to v5 https://github.com/kaelzhang/node-ignore/releases/tag/5.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d4f699bbaff..f73c9eba146 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.6.0", - "ignore": "^4.0.6", + "ignore": "^5.1.8", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", From 994b66173da2efcc4d6668b80a8b0e484609236f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=AF=E7=84=B6?= Date: Wed, 11 Aug 2021 22:15:24 +0800 Subject: [PATCH 2/5] fix: skip checking abs/rel paths --- lib/rules/no-restricted-imports.js | 4 +++- lib/rules/no-restricted-modules.js | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/rules/no-restricted-imports.js b/lib/rules/no-restricted-imports.js index 414164d29f7..82b1272fc61 100644 --- a/lib/rules/no-restricted-imports.js +++ b/lib/rules/no-restricted-imports.js @@ -242,7 +242,9 @@ module.exports = { * @private */ function isRestrictedPattern(importSource, group) { - return group.matcher.ignores(importSource); + + // abs/rel path was ignored + return !/^(\.|\/)/u.test(importSource) && group.matcher.ignores(importSource); } /** diff --git a/lib/rules/no-restricted-modules.js b/lib/rules/no-restricted-modules.js index d0b8a78a507..f58ad6ba61a 100644 --- a/lib/rules/no-restricted-modules.js +++ b/lib/rules/no-restricted-modules.js @@ -190,8 +190,11 @@ module.exports = { if (node.arguments.length) { const name = getFirstArgumentString(node.arguments[0]); - // if first argument is a string literal or a static string template literal - if (name) { + /* + * if first argument is a string literal or a static string template literal + * abs/rel path was ignored + */ + if (name && !/^(\.|\/)/u.test(name)) { // check if argument value is in restricted modules array if (isRestrictedPath(name)) { From 8f779acb8073c6ff78fd4cf71154cc05637e38b9 Mon Sep 17 00:00:00 2001 From: Bryan Mishkin <698306+bmish@users.noreply.github.com> Date: Wed, 11 Aug 2021 10:55:09 -0500 Subject: [PATCH 3/5] Revert "fix: skip checking abs/rel paths" This reverts commit 994b66173da2efcc4d6668b80a8b0e484609236f. --- lib/rules/no-restricted-imports.js | 4 +--- lib/rules/no-restricted-modules.js | 7 ++----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/lib/rules/no-restricted-imports.js b/lib/rules/no-restricted-imports.js index 82b1272fc61..414164d29f7 100644 --- a/lib/rules/no-restricted-imports.js +++ b/lib/rules/no-restricted-imports.js @@ -242,9 +242,7 @@ module.exports = { * @private */ function isRestrictedPattern(importSource, group) { - - // abs/rel path was ignored - return !/^(\.|\/)/u.test(importSource) && group.matcher.ignores(importSource); + return group.matcher.ignores(importSource); } /** diff --git a/lib/rules/no-restricted-modules.js b/lib/rules/no-restricted-modules.js index f58ad6ba61a..d0b8a78a507 100644 --- a/lib/rules/no-restricted-modules.js +++ b/lib/rules/no-restricted-modules.js @@ -190,11 +190,8 @@ module.exports = { if (node.arguments.length) { const name = getFirstArgumentString(node.arguments[0]); - /* - * if first argument is a string literal or a static string template literal - * abs/rel path was ignored - */ - if (name && !/^(\.|\/)/u.test(name)) { + // if first argument is a string literal or a static string template literal + if (name) { // check if argument value is in restricted modules array if (isRestrictedPath(name)) { From d1ac6c00c21cb9aee98b44a2fd7d6f88ac77a25e Mon Sep 17 00:00:00 2001 From: Bryan Mishkin <698306+bmish@users.noreply.github.com> Date: Wed, 11 Aug 2021 11:42:59 -0500 Subject: [PATCH 4/5] Strip abs/rel path prefix --- lib/rules/no-restricted-imports.js | 4 ++++ lib/rules/no-restricted-modules.js | 17 ++++++++++++++++- tests/lib/rules/no-restricted-imports.js | 14 +++++++++++++- tests/lib/rules/no-restricted-modules.js | 14 +++++++++++++- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/lib/rules/no-restricted-imports.js b/lib/rules/no-restricted-imports.js index 414164d29f7..0265d22fb5f 100644 --- a/lib/rules/no-restricted-imports.js +++ b/lib/rules/no-restricted-imports.js @@ -242,6 +242,10 @@ module.exports = { * @private */ function isRestrictedPattern(importSource, group) { + while (/^(\.|\/)/u.test(importSource)) { + // ignore v5 doesn't like relative or absolute paths so remove such prefixes from the path. + importSource = importSource.replace(/^(\.|\/)/u, ''); + } return group.matcher.ignores(importSource); } diff --git a/lib/rules/no-restricted-modules.js b/lib/rules/no-restricted-modules.js index d0b8a78a507..a050a1b5e07 100644 --- a/lib/rules/no-restricted-modules.js +++ b/lib/rules/no-restricted-modules.js @@ -182,6 +182,21 @@ module.exports = { return Object.prototype.hasOwnProperty.call(restrictedPathMessages, name); } + /** + * Check if the given importSource is restricted by a pattern. + * @param {string} importSource path of the import + * @param {Object} ig ignore matcher + * @returns {boolean} whether the variable is a restricted pattern or not + * @private + */ + function isRestrictedPattern(importSource, ig) { + while (/^(\.|\/)/u.test(importSource)) { + // ignore v5 doesn't like relative or absolute paths so remove such prefixes from the path. + importSource = importSource.replace(/^(\.|\/)/u, ''); + } + return ig.ignores(importSource); + } + return { CallExpression(node) { if (isRequireCall(node)) { @@ -198,7 +213,7 @@ module.exports = { reportPath(node, name); } - if (restrictedPatterns.length > 0 && ig.ignores(name)) { + if (restrictedPatterns.length > 0 && isRestrictedPattern(name, ig)) { context.report({ node, messageId: "patternMessage", diff --git a/tests/lib/rules/no-restricted-imports.js b/tests/lib/rules/no-restricted-imports.js index c86e67ecf65..ed758620023 100644 --- a/tests/lib/rules/no-restricted-imports.js +++ b/tests/lib/rules/no-restricted-imports.js @@ -38,6 +38,7 @@ ruleTester.run("no-restricted-imports", rule, { { code: "import relative from '../foo';", options: ["../notFoo"] }, { code: "import relativeWithPaths from '../foo';", options: [{ paths: ["../notFoo"] }] }, { code: "import relativeWithPatterns from '../foo';", options: [{ patterns: ["notFoo"] }] }, + { code: "import relativeWithPatterns from '../../foo';", options: [{ patterns: ["notFoo"] }] }, "import absolute from '/foo';", { code: "import absolute from '/foo';", options: ["/notFoo"] }, { code: "import absoluteWithPaths from '/foo';", options: [{ paths: ["/notFoo"] }] }, @@ -853,7 +854,7 @@ ruleTester.run("no-restricted-imports", rule, { }, { code: "import relativeWithPatterns from '../foo';", - options: [{ patterns: ["../foo"] }], + options: [{ patterns: ["foo"] }], errors: [{ message: "'../foo' import is restricted from being used by a pattern.", type: "ImportDeclaration", @@ -862,6 +863,17 @@ ruleTester.run("no-restricted-imports", rule, { endColumn: 43 }] }, + { + code: "import relativeWithPatterns from '../../foo';", + options: [{ patterns: ["foo"] }], + errors: [{ + message: "'../../foo' import is restricted from being used by a pattern.", + type: "ImportDeclaration", + line: 1, + column: 1, + endColumn: 46 + }] + }, { code: "import absolute from '/foo';", options: ["/foo"], diff --git a/tests/lib/rules/no-restricted-modules.js b/tests/lib/rules/no-restricted-modules.js index 5e89a6a7329..ce9055daf2a 100644 --- a/tests/lib/rules/no-restricted-modules.js +++ b/tests/lib/rules/no-restricted-modules.js @@ -42,6 +42,7 @@ ruleTester.run("no-restricted-modules", rule, { { code: "var relative = require('../foo');", options: ["../notFoo"] }, { code: "var relativeWithPaths = require('../foo');", options: [{ paths: ["../notFoo"] }] }, { code: "var relativeWithPatterns = require('../foo');", options: [{ patterns: ["notFoo"] }] }, + { code: "var relativeWithPatterns = require('../../foo');", options: [{ patterns: ["notFoo"] }] }, "var absolute = require('/foo');", { code: "var absolute = require('/foo');", options: ["/notFoo"] }, { code: "var absoluteWithPaths = require('/foo');", options: [{ paths: ["/notFoo"] }] }, @@ -149,7 +150,7 @@ ruleTester.run("no-restricted-modules", rule, { }, { code: "var relativeWithPatterns = require('../foo');", - options: [{ patterns: ["../foo"] }], + options: [{ patterns: ["foo"] }], errors: [{ message: "'../foo' module is restricted from being used by a pattern.", type: "CallExpression", @@ -158,6 +159,17 @@ ruleTester.run("no-restricted-modules", rule, { endColumn: 45 }] }, + { + code: "var relativeWithPatterns = require('../../foo');", + options: [{ patterns: ["foo"] }], + errors: [{ + message: "'../../foo' module is restricted from being used by a pattern.", + type: "CallExpression", + line: 1, + column: 28, + endColumn: 48 + }] + }, { code: "var absolute = require('/foo');", options: ["/foo"], From 0cb33001b0017446ca64a7b0e4cf1e213859f502 Mon Sep 17 00:00:00 2001 From: Bryan Mishkin <698306+bmish@users.noreply.github.com> Date: Wed, 11 Aug 2021 11:49:53 -0500 Subject: [PATCH 5/5] add patterns exception --- lib/rules/no-restricted-imports.js | 4 ++++ lib/rules/no-restricted-modules.js | 4 ++++ tests/lib/rules/no-restricted-imports.js | 1 - tests/lib/rules/no-restricted-modules.js | 1 - 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/rules/no-restricted-imports.js b/lib/rules/no-restricted-imports.js index 0265d22fb5f..c2be24a36ec 100644 --- a/lib/rules/no-restricted-imports.js +++ b/lib/rules/no-restricted-imports.js @@ -147,6 +147,10 @@ module.exports = { ? [{ matcher: ignore().add(restrictedPatterns) }] : restrictedPatterns.map(({ group, message }) => ({ matcher: ignore().add(group), customMessage: message })); + if (restrictedPatterns && restrictedPatterns.some(restrictedPattern => /^(\.|\/)/u.test(restrictedPattern))) { + throw new Error("`patterns` passed to `no-restricted-modules` should not begin with `./` or `../`."); + } + // if no imports are restricted we don"t need to check if (Object.keys(restrictedPaths).length === 0 && restrictedPatternGroups.length === 0) { return {}; diff --git a/lib/rules/no-restricted-modules.js b/lib/rules/no-restricted-modules.js index a050a1b5e07..b49c69080be 100644 --- a/lib/rules/no-restricted-modules.js +++ b/lib/rules/no-restricted-modules.js @@ -97,6 +97,10 @@ module.exports = { return memo; }, {}); + if (restrictedPatterns && restrictedPatterns.some(restrictedPattern => /^(\.|\/)/u.test(restrictedPattern))) { + throw new Error("`patterns` passed to `no-restricted-modules` should not begin with `./` or `../`."); + } + // if no imports are restricted we don"t need to check if (Object.keys(restrictedPaths).length === 0 && restrictedPatterns.length === 0) { return {}; diff --git a/tests/lib/rules/no-restricted-imports.js b/tests/lib/rules/no-restricted-imports.js index ed758620023..47b8f026c46 100644 --- a/tests/lib/rules/no-restricted-imports.js +++ b/tests/lib/rules/no-restricted-imports.js @@ -31,7 +31,6 @@ ruleTester.run("no-restricted-imports", rule, { { code: "import withPatterns from \"foo/bar\";", options: [{ patterns: ["foo/c*"] }] }, { code: "import foo from 'foo';", options: ["../foo"] }, { code: "import foo from 'foo';", options: [{ paths: ["../foo"] }] }, - { code: "import foo from 'foo';", options: [{ patterns: ["../foo"] }] }, { code: "import foo from 'foo';", options: ["/foo"] }, { code: "import foo from 'foo';", options: [{ paths: ["/foo"] }] }, "import relative from '../foo';", diff --git a/tests/lib/rules/no-restricted-modules.js b/tests/lib/rules/no-restricted-modules.js index ce9055daf2a..6523f641a61 100644 --- a/tests/lib/rules/no-restricted-modules.js +++ b/tests/lib/rules/no-restricted-modules.js @@ -35,7 +35,6 @@ ruleTester.run("no-restricted-modules", rule, { { code: "require(`foo${bar}`)", options: ["foo"], parserOptions: { ecmaVersion: 6 } }, { code: "var foo = require('foo');", options: ["../foo"] }, { code: "var foo = require('foo');", options: [{ paths: ["../foo"] }] }, - { code: "var foo = require('foo');", options: [{ patterns: ["../foo"] }] }, { code: "var foo = require('foo');", options: ["/foo"] }, { code: "var foo = require('foo');", options: [{ paths: ["/foo"] }] }, "var relative = require('../foo');",