227 lines
6.6 KiB
JSON
227 lines
6.6 KiB
JSON
{
|
|
"env": {
|
|
"es2022": true,
|
|
"node": true
|
|
},
|
|
"parserOptions": {
|
|
"sourceType": "module",
|
|
"ecmaVersion": 2022
|
|
},
|
|
"settings": {
|
|
"import/resolver": {
|
|
"typescript": {}
|
|
},
|
|
"boundaries/elements": [
|
|
{
|
|
"type": "website",
|
|
"pattern": "apps/website/**/*"
|
|
},
|
|
{
|
|
"type": "api",
|
|
"pattern": "apps/api/**/*"
|
|
},
|
|
{
|
|
"type": "adapters",
|
|
"pattern": ["adapters/**/*", "@adapters/**/*"]
|
|
},
|
|
{
|
|
"type": "core",
|
|
"pattern": ["core/**/*", "@core/**/*"]
|
|
}
|
|
]
|
|
},
|
|
"overrides": [
|
|
{
|
|
"files": ["**/index.ts", "**/index.tsx"],
|
|
"rules": {
|
|
"no-restricted-syntax": [
|
|
"error",
|
|
{
|
|
"selector": "Program",
|
|
"message": "index.ts files are forbidden. Use explicit file names instead (e.g., UserService.ts, not index.ts)."
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["core/*/application/ports/*/*.ts"],
|
|
"rules": {
|
|
"no-restricted-syntax": [
|
|
"error",
|
|
{
|
|
"selector": "TSInterfaceDeclaration[id.name=/^Get.*Port$/]",
|
|
"message": "Port interface names should not start with 'Get'. Use descriptive names without the 'Get' prefix."
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["core/**/*.ts"],
|
|
"rules": {
|
|
"no-restricted-syntax": [
|
|
"error",
|
|
{
|
|
"selector": "TSClassDeclaration[id.name=/Blocker$/], TSInterfaceDeclaration[id.name=/Blocker$/]",
|
|
"message": "Blocker classes/interfaces are not allowed in core. Use Guards in backend."
|
|
},
|
|
{
|
|
"selector": "TSClassDeclaration[id.name=/Presenter$/], TSInterfaceDeclaration[id.name=/Presenter$/]",
|
|
"message": "Presenter classes/interfaces are not allowed in core. Presenters belong in API or frontend layers."
|
|
},
|
|
{
|
|
"selector": "TSClassDeclaration[id.name=/Dto$/], TSInterfaceDeclaration[id.name=/Dto$/]",
|
|
"message": "DTO classes/interfaces are not allowed in core. DTOs belong in API or frontend layers."
|
|
},
|
|
{
|
|
"selector": "TSClassDeclaration[id.name=/ViewModel$/], TSInterfaceDeclaration[id.name=/ViewModel$/]",
|
|
"message": "ViewModel classes/interfaces are not allowed in core. View Models belong in frontend."
|
|
},
|
|
{
|
|
"selector": "TSClassDeclaration[id.name=/CommandModel$/], TSInterfaceDeclaration[id.name=/CommandModel$/]",
|
|
"message": "CommandModel classes/interfaces are not allowed in core. Command Models belong in frontend."
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["apps/website/**/*.ts"],
|
|
"rules": {
|
|
"no-restricted-syntax": [
|
|
"error",
|
|
{
|
|
"selector": "TSClassDeclaration[id.name=/Guard$/], TSInterfaceDeclaration[id.name=/Guard$/]",
|
|
"message": "Guard classes/interfaces are not allowed in frontend. Use Blockers in frontend."
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["apps/api/**/*.ts", "apps/website/lib/dtos/**/*.ts"],
|
|
"rules": {
|
|
"no-restricted-syntax": [
|
|
"error",
|
|
{
|
|
"selector": "TSEnumDeclaration[id.name=/^(?!.*Enum$).+/]",
|
|
"message": "Transport enums must end with 'Enum'."
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["core/*/application/use-cases/*.ts"],
|
|
"rules": {
|
|
"no-restricted-syntax": [
|
|
"error",
|
|
{
|
|
"selector": "TSClassDeclaration[id.name=/^(?!.*UseCase$).+/]",
|
|
"message": "Use Case classes must end with 'UseCase'."
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["core/*/application/services/*.ts"],
|
|
"rules": {
|
|
"no-restricted-syntax": [
|
|
"error",
|
|
{
|
|
"selector": "TSClassDeclaration[id.name=/^(?!.*Service$).+/]",
|
|
"message": "Application Service classes must end with 'Service'."
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["apps/website/lib/view-models/*.ts"],
|
|
"rules": {
|
|
"no-restricted-syntax": [
|
|
"error",
|
|
{
|
|
"selector": "TSClassDeclaration[id.name=/^(?!.*ViewModel$).+/]",
|
|
"message": "View Model classes must end with 'ViewModel'."
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["apps/website/lib/commands/*.ts"],
|
|
"rules": {
|
|
"no-restricted-syntax": [
|
|
"error",
|
|
{
|
|
"selector": "TSClassDeclaration[id.name=/^(?!.*CommandModel$).+/]",
|
|
"message": "Command Model classes must end with 'CommandModel'."
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["**/*.ts", "**/*.tsx"],
|
|
"parser": "@typescript-eslint/parser",
|
|
"plugins": ["@typescript-eslint", "boundaries", "import"],
|
|
"extends": ["plugin:import/recommended", "plugin:import/typescript"],
|
|
"rules": {
|
|
"@typescript-eslint/no-explicit-any": "error",
|
|
"@typescript-eslint/no-unused-vars": [
|
|
"error",
|
|
{
|
|
"args": "all",
|
|
"argsIgnorePattern": "^_",
|
|
"vars": "all",
|
|
"varsIgnorePattern": "^_",
|
|
"caughtErrors": "all"
|
|
}
|
|
],
|
|
"boundaries/element-types": [
|
|
2,
|
|
{
|
|
"default": "disallow",
|
|
"rules": [
|
|
{
|
|
"from": ["website"],
|
|
"allow": ["website"]
|
|
},
|
|
{
|
|
"from": ["api"],
|
|
"allow": ["api", "adapters", "core"]
|
|
},
|
|
{
|
|
"from": ["adapters"],
|
|
"allow": ["adapters", "core"]
|
|
},
|
|
{
|
|
"from": ["core"],
|
|
"allow": ["core"]
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"import/no-default-export": "error",
|
|
"import/no-useless-path-segments": "error",
|
|
"no-restricted-syntax": [
|
|
"error",
|
|
{
|
|
"selector": "ExportDefaultDeclaration",
|
|
"message": "Default exports are forbidden. Use named exports instead."
|
|
},
|
|
{
|
|
"selector": "TSInterfaceDeclaration[id.name=/^I[A-Z]/]",
|
|
"message": "Interface names should not start with 'I'. Use descriptive names without the 'I' prefix (e.g., 'LiverCompositor' instead of 'ILiveryCompositor')."
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"files": ["core/**/*.ts"],
|
|
"rules": {
|
|
"no-restricted-syntax": [
|
|
"error",
|
|
{
|
|
"selector": "ExportDefaultDeclaration",
|
|
"message": "Default exports are forbidden. Use named exports instead."
|
|
}
|
|
]
|
|
}
|
|
}
|
|
]
|
|
} |