Skip to content

Commit 2199fb4

Browse files
author
Matthieu Gicquel
authored
feat(eslint-plugin): add new imports config (#108)
1 parent fdaffef commit 2199fb4

File tree

8 files changed

+259
-10
lines changed

8 files changed

+259
-10
lines changed

example-app/.eslintrc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@
77
"extends": "plugin:@bam.tech/tests"
88
}
99
],
10-
"rules": { "@bam.tech/require-named-effect": "error" }
10+
"rules": {
11+
"@bam.tech/require-named-effect": "error"
12+
}
1113
}

example-app/eslint-breaking-examples/not-breaking-rules.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import "react";
2+
13
import { StyleSheet, Text, View } from "react-native";
24

35
// This should not trigger a warning nor an error because explicit-function-return-type rule is off

example-app/package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,19 @@
1616
"@types/react": "^18.2.14",
1717
"@typescript-eslint/eslint-plugin": "^6.0.0",
1818
"eslint": "^8.44.0",
19+
"eslint-config-prettier": "^9.0.0",
20+
"eslint-import-resolver-typescript": "^3.6.1",
21+
"eslint-plugin-import": "^2.29.1",
1922
"eslint-plugin-jest": "^27.2.2",
2023
"eslint-plugin-jest-formatting": "^3.1.0",
2124
"eslint-plugin-prettier": "^5.0.0",
2225
"eslint-plugin-react": "^7.31.11",
2326
"eslint-plugin-react-hooks": "^4.6.0",
2427
"eslint-plugin-react-native": "^4.0.0",
2528
"eslint-plugin-react-native-a11y": "^3.3.0",
29+
"eslint-plugin-simple-import-sort": "^10.0.0",
2630
"eslint-plugin-testing-library": "^6.0.1",
31+
"eslint-plugin-unused-imports": "^3.0.0",
2732
"jest": "^29.5.0",
2833
"prettier": "^3.0.0",
2934
"typescript": "^5.0.0"
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { defineConfig } from "eslint-define-config";
2+
3+
export const importConfig = defineConfig({
4+
extends: ["plugin:import/typescript"],
5+
plugins: ["simple-import-sort", "import", "unused-imports"],
6+
settings: {
7+
"import/resolver": {
8+
typescript: true,
9+
node: true,
10+
},
11+
},
12+
rules: {
13+
/*
14+
* Standardized import syntax
15+
*/
16+
"@typescript-eslint/consistent-type-imports": "error", // use "import type" for types. Optimize import readability, bundle size, avoid circular dependencies
17+
"@typescript-eslint/no-require-imports": "error",
18+
"@typescript-eslint/no-var-requires": "off", // it's mostly a duplicate of no-require-imports
19+
20+
/*
21+
* Auto-remove unused imports
22+
*/
23+
"@typescript-eslint/no-unused-vars": "off", // eslint-plugin-unused-imports replaces this rule
24+
"unused-imports/no-unused-imports": "error", // Automatically remove unused imports on save
25+
"unused-imports/no-unused-vars": "error",
26+
27+
/*
28+
* Import sorting
29+
*/
30+
"simple-import-sort/imports": [
31+
"error",
32+
{
33+
groups: [
34+
["^\\u0000"], // side effect imports
35+
["^@?\\w"], // packages
36+
["^#"], // internal absolute imports
37+
["^[^.]"], // everything else
38+
["^\\."], // relative imports
39+
],
40+
},
41+
],
42+
"simple-import-sort/exports": "error",
43+
"import/first": "error",
44+
"import/newline-after-import": "error",
45+
"import/no-duplicates": "error",
46+
47+
/*
48+
* Bug prevention
49+
*/
50+
"import/no-unresolved": "error", // especially useful for "asset imports" in React Native projects
51+
},
52+
overrides: [
53+
{
54+
files: ["*.js"],
55+
rules: {
56+
"@typescript-eslint/no-require-imports": "off",
57+
},
58+
},
59+
],
60+
});
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { a11yconfig } from "./a11y";
2+
import { importConfig } from "./import";
23
import { recommendedConfig } from "./recommended";
34
import { testsConfig } from "./tests";
45

56
export default {
67
recommended: recommendedConfig,
78
tests: testsConfig,
89
a11y: a11yconfig,
10+
import: importConfig,
911
};

packages/eslint-plugin/lib/configs/recommended.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ export const recommendedConfig = defineConfig({
1919
"plugin:react/jsx-runtime", // Disables the rules that require importing react when using JSX
2020
"plugin:react-native/all",
2121
"plugin:react-hooks/recommended",
22+
"plugin:@bam.tech/import",
2223
"plugin:prettier/recommended", // Enables eslint-plugin-prettier and displays prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array.
2324
],
24-
plugins: ["@bam.tech", "unused-imports"],
25+
plugins: ["@bam.tech"],
2526
rules: {
2627
"@typescript-eslint/ban-ts-comment": "warn",
2728
"@typescript-eslint/explicit-function-return-type": "off",
@@ -38,9 +39,6 @@ export const recommendedConfig = defineConfig({
3839
"react/prop-types": "off",
3940
"react/no-unused-prop-types": "error",
4041
"react/jsx-no-useless-fragment": "error",
41-
"@typescript-eslint/no-unused-vars": "off",
42-
"unused-imports/no-unused-imports": "error",
43-
"unused-imports/no-unused-vars": "error",
4442
// ☢️ Rules that require type information must be added to the `.ts` overrides section below
4543
},
4644
env: {

packages/eslint-plugin/package.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,24 @@
2121
"build": "tsc",
2222
"lint": "npm-run-all \"lint:*\"",
2323
"lint:js": "eslint .",
24-
"lint:eslint-docs": "npm-run-all \"update:eslint-docs -- --check\"",
24+
"lint:eslint-docs": "npm-run-all \"update:eslint-docs --check\"",
2525
"test": "jest",
2626
"update:eslint-docs": "eslint-doc-generator --config-emoji tests,🧪"
2727
},
2828
"peerDependencies": {
2929
"@typescript-eslint/eslint-plugin": "^6.0.0",
3030
"eslint": "^8.44.0",
3131
"eslint-config-prettier": "^9.0.0",
32+
"eslint-import-resolver-typescript": "^3.6.1",
33+
"eslint-plugin-import": "^2.29.1",
3234
"eslint-plugin-jest": "^27.2.2",
3335
"eslint-plugin-jest-formatting": "^3.1.0",
3436
"eslint-plugin-prettier": "^5.0.0",
3537
"eslint-plugin-react": "^7.31.11",
3638
"eslint-plugin-react-hooks": "^4.6.0",
3739
"eslint-plugin-react-native": "^4.0.0",
3840
"eslint-plugin-react-native-a11y": "^3.3.0",
41+
"eslint-plugin-simple-import-sort": "^10.0.0",
3942
"eslint-plugin-testing-library": "^6.0.1",
4043
"eslint-plugin-unused-imports": "^3.0.0",
4144
"prettier": "^3.0.0"
@@ -50,14 +53,17 @@
5053
"eslint": "^8.44.0",
5154
"eslint-config-prettier": "^9.0.0",
5255
"eslint-doc-generator": "^1.4.3",
56+
"eslint-import-resolver-typescript": "^3.6.1",
5357
"eslint-plugin-eslint-plugin": "^5.1.0",
58+
"eslint-plugin-import": "^2.29.1",
5459
"eslint-plugin-jest": "^27.2.2",
5560
"eslint-plugin-jest-formatting": "^3.1.0",
5661
"eslint-plugin-prettier": "^5.0.0",
5762
"eslint-plugin-react": "^7.31.11",
5863
"eslint-plugin-react-hooks": "^4.6.0",
5964
"eslint-plugin-react-native": "^4.0.0",
6065
"eslint-plugin-react-native-a11y": "^3.3.0",
66+
"eslint-plugin-simple-import-sort": "^10.0.0",
6167
"eslint-plugin-testing-library": "6.0.1",
6268
"eslint-plugin-unused-imports": "^3.0.0",
6369
"jest": "^29.7.0",

0 commit comments

Comments
 (0)