Skip to content

Commit 261f2b0

Browse files
authored
Fix: Add a new ESLint plugin for the latest version in React boilerplate (#2)
1 parent 4d76e7e commit 261f2b0

File tree

5 files changed

+48
-62
lines changed

5 files changed

+48
-62
lines changed

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/operation/tooling/eslint/eslint.ts

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@ import fs from "fs";
33
import cmdRunner from "@/utils/cmdRunner";
44
import { NodePackageManager, SupportedProjectType } from "@/types";
55
import getCurrentProject from "@/operation/getProjectType";
6-
import { deleteFile, isFileExists, writeFile } from "@/utils/file";
7-
import { eslintNextConfig, eslintReactConfig } from "./eslintConfig.js";
6+
import {
7+
deleteFile,
8+
isFileExists,
9+
writeFile,
10+
writeFileFromConfig,
11+
} from "@/utils/file";
12+
import { eslintNextConfig } from "./eslintConfig.js";
13+
import EslintReactPlugin from "@/plugins/react/eslint/config.js";
814

915
async function addEslintInProject(currentPackageManager: NodePackageManager) {
1016
const projectType = getCurrentProject();
@@ -61,22 +67,7 @@ async function addEslintInReact(currentPackageManager: NodePackageManager) {
6167
);
6268

6369
//adding eslint config to the project
64-
const [config, dependencies] = eslintReactConfig(
65-
isFileExists(process.cwd(), "tsconfig"),
66-
isFileExists(process.cwd(), "prettier"),
67-
isFileExists(process.cwd(), ".storybook"),
68-
isFileExists(process.cwd(), "vite"),
69-
);
70-
71-
//adding config file
72-
await writeFile(".eslintrc.json", config);
73-
74-
// installing necessary dependencies
75-
await cmdRunner(currentPackageManager, [
76-
`${currentPackageManager === NodePackageManager.NPM ? "install" : "add"}`,
77-
"-D",
78-
...dependencies.split(" "),
79-
]);
70+
await writeFileFromConfig(EslintReactPlugin);
8071
}
8172

8273
export default addEslintInProject;

src/operation/tooling/eslint/eslintConfig.ts

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -21,51 +21,13 @@ export function eslintNextConfig(
2121
return [JSON.stringify(config, null, 2), dependencies] as const;
2222
}
2323

24-
export function eslintReactConfig(
25-
hasTypescript: boolean,
26-
hasPrettier: boolean,
27-
hasStorybook: boolean,
28-
hasVite: boolean,
29-
) {
30-
//base config for react js
31-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
32-
const baseConfig: Record<string, any> = {
33-
root: true,
34-
env: { browser: true, es2020: true },
35-
ignorePatterns: ["dist", "src/__generated__"],
36-
extends: [
37-
"plugin:react/recommended",
38-
"plugin:react-hooks/recommended",
39-
"eslint:recommended",
40-
],
41-
rules: {
42-
"react/react-in-jsx-scope": "off",
43-
},
44-
};
45-
46-
const initialDependencies =
47-
"eslint eslint-plugin-react eslint-plugin-react-hooks";
48-
49-
const [config, dependencies] = eslintConfigModifier(
50-
baseConfig,
51-
initialDependencies,
52-
hasTypescript,
53-
hasPrettier,
54-
hasStorybook,
55-
hasVite,
56-
!hasTypescript,
57-
);
58-
return [JSON.stringify(config, null, 2), dependencies] as const;
59-
}
60-
6124
function eslintConfigModifier(
6225
// eslint-disable-next-line @typescript-eslint/no-explicit-any
6326
baseConfig: Record<string, any>,
6427
dependencies: string,
6528
hasTypescript: boolean,
6629
hasPrettier: boolean,
6730
hasStorybook: boolean,
68-
hasVite?: boolean,
6931
hasJavascript?: boolean,
7032
) {
7133
if (hasTypescript) {
@@ -95,8 +57,5 @@ function eslintConfigModifier(
9557
baseConfig.extends.push("plugin:storybook/recommended");
9658
}
9759

98-
if (hasVite) {
99-
baseConfig.plugins = ["react-refresh"];
100-
}
10160
return [baseConfig, dependencies] as const;
10261
}

src/plugins/react/eslint/config.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { FileType, PluginConfigType } from "@/types";
2+
3+
const EslintConfig = (
4+
isTsProject: boolean,
5+
) => `import { defineConfig } from "eslint/config";
6+
import globals from "globals";
7+
import js from "@eslint/js";
8+
${isTsProject ? `import tseslint from "typescript-eslint";` : ""}
9+
import pluginReact from "eslint-plugin-react";
10+
11+
12+
export default defineConfig([
13+
{ files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"] },
14+
{ files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"], languageOptions: { globals: globals.browser } },
15+
{ files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"], plugins: { js }, extends: ["js/recommended"] },
16+
${isTsProject ? `tseslint.configs.recommended,` : ``}
17+
pluginReact.configs.flat.recommended,
18+
]);`;
19+
20+
const EslintReactPlugin: PluginConfigType = {
21+
initializingMessage: "Adding Eslint, Please wait !",
22+
devDependencies: (isTsProject: boolean) =>
23+
`eslint eslint-plugin-react ${isTsProject ? "typescript-eslint" : ""}`,
24+
files: [
25+
{
26+
content: EslintConfig,
27+
fileName: "eslint.config.js",
28+
fileType: FileType.SIMPLE,
29+
path: [],
30+
},
31+
],
32+
successMessage: "Successfully added Eslint!",
33+
};
34+
35+
export default EslintReactPlugin;

src/plugins/react/eslint/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from "./config";

0 commit comments

Comments
 (0)