Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: no-restricted-imports support casing #15439

Merged
merged 3 commits into from Jan 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
29 changes: 29 additions & 0 deletions docs/rules/no-restricted-imports.md
Expand Up @@ -91,6 +91,17 @@ or like this if you want to apply a custom message to pattern matches:

The custom message will be appended to the default error message.

Pattern matches can also be configured to be case-sensitive:

```json
"no-restricted-imports": ["error", {
"patterns": [{
"group": ["import1/private/prefix[A-Z]*"],
"caseSensitive": true
}]
}]
```

To restrict the use of all Node.js core imports (via <https://github.com/nodejs/node/tree/master/lib>):

```json
Expand Down Expand Up @@ -172,6 +183,15 @@ import * as Foo from "foo";
import pick from 'lodash/pick';
```

```js
/*eslint no-restricted-imports: ["error", { patterns: [{
group: ["foo[A-Z]*"],
caseSensitive: true
}]}]*/

import pick from 'fooBar';
```

Examples of **correct** code for this rule:

```js
Expand Down Expand Up @@ -214,6 +234,15 @@ import { AllowedObject as DisallowedObject } from "foo";
import lodash from 'lodash';
```

```js
/*eslint no-restricted-imports: ["error", { patterns: [{
group: ["foo[A-Z]*"],
caseSensitive: true
}]}]*/

import pick from 'food';
```

## When Not To Use It

Don't use this rule or don't include a module in the list for this rule if you want to be able to import a module in your project without an ESLint error or warning.
19 changes: 15 additions & 4 deletions lib/rules/no-restricted-imports.js
Expand Up @@ -63,6 +63,9 @@ const arrayOfStringsOrObjectPatterns = {
message: {
type: "string",
minLength: 1
},
caseSensitive: {
type: "boolean"
nzakas marked this conversation as resolved.
Show resolved Hide resolved
}
},
additionalProperties: false,
Expand Down Expand Up @@ -142,10 +145,18 @@ module.exports = {
}, {});

// Handle patterns too, either as strings or groups
const restrictedPatterns = (isPathAndPatternsObject ? options[0].patterns : []) || [];
const restrictedPatternGroups = restrictedPatterns.length > 0 && typeof restrictedPatterns[0] === "string"
? [{ matcher: ignore().add(restrictedPatterns) }]
: restrictedPatterns.map(({ group, message }) => ({ matcher: ignore().add(group), customMessage: message }));
let restrictedPatterns = (isPathAndPatternsObject ? options[0].patterns : []) || [];

// standardize to array of objects if we have an array of strings
if (restrictedPatterns.length > 0 && typeof restrictedPatterns[0] === "string") {
restrictedPatterns = [{ group: restrictedPatterns }];
}

// relative paths are supported for this rule
const restrictedPatternGroups = restrictedPatterns.map(({ group, message, caseSensitive }) => ({
matcher: ignore({ allowRelativePaths: true, ignorecase: !caseSensitive }).add(group),
customMessage: message
}));

// if no imports are restricted we don't need to check
if (Object.keys(restrictedPaths).length === 0 && restrictedPatternGroups.length === 0) {
Expand Down
3 changes: 2 additions & 1 deletion lib/rules/no-restricted-modules.js
Expand Up @@ -103,7 +103,8 @@ module.exports = {
return {};
}

const ig = ignore().add(restrictedPatterns);
// relative paths are supported for this rule
const ig = ignore({ allowRelativePaths: true }).add(restrictedPatterns);


/**
Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -67,7 +67,7 @@
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^6.0.1",
"globals": "^13.6.0",
"ignore": "^4.0.6",
"ignore": "^5.2.0",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
Expand Down
20 changes: 20 additions & 0 deletions tests/lib/rules/no-restricted-imports.js
Expand Up @@ -54,6 +54,16 @@ ruleTester.run("no-restricted-imports", rule, {
code: "import withPatterns from \"foo/bar\";",
options: [{ patterns: [{ group: ["foo/*", "!foo/bar"], message: "foo is forbidden, use bar instead" }] }]
},
{
code: "import withPatternsCaseSensitive from 'foo';",
options: [{
patterns: [{
group: ["FOO"],
message: "foo is forbidden, use bar instead",
caseSensitive: true
}]
}]
},
{
code: "import AllowedObject from \"foo\";",
options: [{
Expand Down Expand Up @@ -288,6 +298,16 @@ ruleTester.run("no-restricted-imports", rule, {
column: 1,
endColumn: 36
}]
}, {
code: "import withPatternsCaseInsensitive from 'foo';",
options: [{ patterns: [{ group: ["FOO"] }] }],
errors: [{
message: "'foo' import is restricted from being used by a pattern.",
type: "ImportDeclaration",
line: 1,
column: 1,
endColumn: 47
}]
}, {
code: "import withGitignores from \"foo/bar\";",
options: [{ patterns: ["foo/*", "!foo/baz"] }],
Expand Down