@mikey-pro/eslint-config-angular
Version:
Mikey Pro ESLint Angular configuration - Ultimate Angular coding style guide
154 lines (143 loc) • 4.08 kB
JavaScript
// Modern Angular ESLint configuration for Mikey Pro
import angular from '@angular-eslint/eslint-plugin';
import angularTemplate from '@angular-eslint/eslint-plugin-template';
import angularTemplateParser from '@angular-eslint/template-parser';
import { baseConfig } from '../eslint-config/base-config.js';
import { baseOverrides } from '../eslint-config/overrides.js';
// Angular-specific configuration
const angularConfig = {
files: ['**/*.ts'],
languageOptions: {
parser: baseConfig.languageOptions.parser,
parserOptions: {
...baseConfig.languageOptions.parserOptions,
project: './tsconfig.json',
},
},
plugins: {
'@angular-eslint': angular,
},
rules: {
// Angular rules
...angular.configs.recommended.rules,
// Basic Angular-specific overrides
'@angular-eslint/component-class-suffix': [
'error',
{ suffixes: ['Component', 'Page', 'View'] },
],
'@angular-eslint/component-selector': [
'error',
{
prefix: 'app',
style: 'kebab-case',
type: 'element',
},
],
'@angular-eslint/directive-class-suffix': [
'error',
{ suffixes: ['Directive'] },
],
'@angular-eslint/directive-selector': [
'error',
{
prefix: 'app',
style: 'camelCase',
type: 'attribute',
},
],
'@angular-eslint/no-multiple-template-root': 'off', // Angular 17+ allows multiple roots
'@angular-eslint/use-lifecycle-interface': 'error',
},
settings: {
'import/resolver': {
typescript: {
alwaysTryTypes: true,
},
},
},
};
// Angular template configuration
const angularTemplateConfig = {
files: ['**/*.html'],
languageOptions: {
parser: angularTemplateParser,
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
},
},
plugins: {
'@angular-eslint/template': angularTemplate,
},
rules: {
// Angular template rules
...angularTemplate.configs.recommended.rules,
// Basic Angular template-specific overrides
'@angular-eslint/template/alt-text': 'error',
'@angular-eslint/template/click-events-have-key-events': 'error',
'@angular-eslint/template/conditional-complexity': ['error', { max: 3 }],
'@angular-eslint/template/cyclomatic-complexity': ['error', { max: 5 }],
'@angular-eslint/template/eqeqeq': 'error',
'@angular-eslint/template/iframe-title': 'error',
'@angular-eslint/template/interactive-supports-focus': 'error',
'@angular-eslint/template/label-has-associated-control': 'error',
'@angular-eslint/template/mouse-events-have-key-events': 'error',
'@angular-eslint/template/no-autofocus': 'error',
'@angular-eslint/template/no-duplicate-attributes': 'error',
'@angular-eslint/template/no-positive-tabindex': 'error',
'@angular-eslint/template/use-track-by-function': 'error',
'@angular-eslint/template/valid-aria': 'error',
},
};
// Export the complete Angular configuration
export default [
// Global ignores
{
ignores: [
'**/dist/**/*',
'**/vendor/**/*',
'**/node_modules/**/*',
'**/coverage/**/*',
'**/.next/**/*',
'**/.nuxt/**/*',
'**/.output/**/*',
'**/.vite/**/*',
'**/build/**/*',
'**/out/**/*',
'*.properties',
'*.cclibs',
'*.svg',
'*.png',
'*.jpg',
'*.jpeg',
'*.gif',
'*.ico',
'*.webp',
'*.aco',
'*.psd',
'*.ai',
'*.ase',
'*.sh',
'*.bat',
'*.cmd',
'package-lock.json',
'yarn.lock',
'pnpm-lock.yaml',
'LICENSE',
'CNAME',
'*.min.js',
'*.min.css',
],
},
// Base configuration
baseConfig,
// Angular-specific configuration
angularConfig,
// Angular template configuration
angularTemplateConfig,
// File-specific overrides
...baseOverrides,
];
// Export individual components for advanced usage
export { baseConfig } from '../eslint-config/base-config.js';
export { baseOverrides } from '../eslint-config/overrides.js';