❗ ESLint는 js 린터이므로, js(및 모듈js 등)외의 확장자는 기본적으로 오류를 인식할 수 없음.
따라서, 다른 확장자도 인식하게 하기 위해서는 일반적으로 해당 확장자를 지원하게 하는 plugin을 설치해야 함
폴더 및 파일명 컨벤션을 정했지만, 이를 일일이 기억하고 적용하기 어려웠음.
컨벤션을 자동으로 강제하는 도구를 커스텀하여 활용하지 않음
eslint-plugin-project-structure 플러그인을 통해 folder 및 file structure 컨벤션 정의
export default [
//...
{
files: [
"**/*.{js,mjs,cjs,ts,jsx,tsx}",
// 확장자가 없는 파일
// [참고] https://eslint.org/docs/latest/use/configure/configuration-files#specifying-files-without-extension
"**/!(*.*)",
// gitkeep 파일에 대해서도 검사 (빈 폴더 추적)
"**.gitkeep",
],
languageOptions: {
parser: projectStructureParser,
},
plugins: {
"project-structure": projectStructurePlugin,
},
rules: {
"project-structure/folder-structure": ["error", folderStructureConfig],
},
},
];
import {createFolderStructure} from "eslint-plugin-project-structure";
export const folderStructureConfig = createFolderStructure({
structure: {
children: [
{
name: "*",
},
{
name: "src",
children: [
{name: "App.tsx"},
{name: "main.tsx"},
{name: "vite-env.d.ts"},
{
name: "@commons",
children: [
{name: "components", ruleId: "componentRule"},
{name: "constants", ruleId: "tsRule"},
{name: "hooks", ruleId: "hooksRule"},
{name: "layouts", ruleId: "componentRule"},
{name: "routes", ruleId: "componentRule"},
{name: "services", ruleId: "tsRule"},
{name: "stores", ruleId: "tsRule"},
{name: "types", ruleId: "tsRule"},
{name: "utilities", ruleId: "tsRule"},
],
},
{name: "assets", children: [{name: "*"}]},
{
name: "domains",
children: [
{
name: "*",
children: [
{name: "apis", ruleId: "tsRule"},
{name: "components", ruleId: "componentRule"},
{name: "hooks", ruleId: "hooksRule"},
{name: "layouts", ruleId: "componentRule"},
{name: "pages", ruleId: "componentRule"},
{name: "types", ruleId: "tsRule"},
],
},
],
},
],
},
],
},
});
rules: {
hooksRule: {
children: [
{name: ".gitkeep"},
{name: "use{PascalCase}.ts"},
{
name: "use{PascalCase}",
children: [
{
name: "use{PascalCase}",
children: [
{name: ".gitkeep"},
{name: "use{PascalCase}.ts"},
{name: "use{PascalCase}", ruleId: "hooksRule"},
],
},
],
},
],
},
componentRule: {
children: [
{name: ".gitkeep"},
{name: "{PascalCase}(.styled)?.tsx"},
{
name: "{PascalCase}",
children: [
{name: ".gitkeep"},
{name: "{PascalCase}(.styled)?.tsx"},
{name: "{PascalCase}", ruleId: "componentRule"},
],
},
],
},
tsRule: {
children: [
{name: ".gitkeep"},
{name: "{camelCase}(.*)?.ts"},
{
name: "{camelCase}",
children: [{name: ".gitkeep"}, {name: "{camelCase}(.*)?.ts"}, {name: "{camelCase}", ruleId: "tsRule"}],
},
],
},
},
eslint-plugin-project-structure 플러그인에서 다른 file도 검사할 수 있도록 확장자 추가**/!(*.*) 추가.gitkeep을 반드시 추가하도록 함(git에서도 추적하는데 필요함).gitkeep 파일을 추적하면 빈 폴더도 추적 가능