eslint.config.js (149 lines of code) (raw):
// @ts-check
const { fixupPluginRules } = require('@eslint/compat');
const { FlatCompat } = require('@eslint/eslintrc');
const eslintJs = require('@eslint/js');
const eslintTs = require('typescript-eslint');
const angular = require('angular-eslint');
// plugins
const jsdoc = require('eslint-plugin-jsdoc');
const prettier = require('eslint-plugin-prettier');
const unusedImports = require('eslint-plugin-unused-imports');
const header = require('eslint-plugin-header');
// @see https://github.com/Stuk/eslint-plugin-header/issues/57#issuecomment-2378485611
header.rules.header.meta.schema = false;
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: eslintJs.configs.recommended
});
/**
* @description Resolve a legacy plugin that does not support eslint@9
* @see https://github.com/import-js/eslint-plugin-import/issues/2948#issuecomment-2148832701
* @param {string} name the plugin name
* @param {string} alias the plugin alias
* @returns {import('eslint').ESLint.Plugin}
*/
function legacyPlugin(name, alias = name) {
const plugin = compat.plugins(name)[0]?.plugins?.[alias];
if (!plugin) {
throw new Error(`Unable to resolve plugin ${name} and/or alias ${alias}`);
}
return fixupPluginRules(plugin);
}
module.exports = eslintTs.config(
{
files: ['**/*.ts'],
plugins: {
jsdoc,
'unused-imports': unusedImports,
header: legacyPlugin('eslint-plugin-header', 'header'),
import: legacyPlugin('eslint-plugin-import', 'import'),
prettier
},
extends: [
eslintJs.configs.recommended,
...eslintTs.configs.recommended,
...eslintTs.configs.stylistic,
...angular.configs.tsRecommended
],
processor: angular.processInlineTemplates,
rules: {
'prettier/prettier': 'error',
'header/header': [2, './license-header.js'],
'unused-imports/no-unused-imports': 'error',
'import/no-duplicates': 'error',
'import/no-unused-modules': 'error',
'import/no-unassigned-import': 'error',
'import/order': [
'error',
{
alphabetize: {
order: 'asc',
caseInsensitive: false
},
'newlines-between': 'always',
groups: ['external', 'builtin', 'internal', ['parent', 'sibling', 'index']],
pathGroups: [
{
pattern: '{@angular/**,rxjs,rxjs/operators}',
group: 'external',
position: 'before'
},
{
pattern: '@paimon/**',
group: 'internal',
position: 'before'
}
],
pathGroupsExcludedImportTypes: []
}
],
'no-empty-function': 'off',
'no-unused-expressions': 'error',
'no-use-before-define': 'off',
'no-bitwise': 'off',
'no-duplicate-imports': 'error',
'no-invalid-this': 'off',
'no-irregular-whitespace': 'error',
'no-magic-numbers': 'off',
'no-multiple-empty-lines': 'error',
'no-redeclare': 'off',
'no-underscore-dangle': 'off',
'no-sparse-arrays': 'error',
'no-template-curly-in-string': 'off',
'prefer-object-spread': 'error',
'prefer-template': 'error',
yoda: 'error',
'@typescript-eslint/no-explicit-any': 'error',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/array-type': [
'error',
{
default: 'array-simple'
}
],
'@typescript-eslint/consistent-type-definitions': 'error',
'@typescript-eslint/explicit-member-accessibility': [
'off',
{
accessibility: 'explicit'
}
],
'@typescript-eslint/no-floating-promises': 'off',
'@typescript-eslint/no-inferrable-types': [
'error',
{
ignoreParameters: true,
ignoreProperties: true
}
],
'@typescript-eslint/no-this-alias': 'error',
'@typescript-eslint/naming-convention': 'off',
'@typescript-eslint/no-unused-expressions': 'off',
'@typescript-eslint/explicit-function-return-type': [
'error',
{
allowExpressions: true,
allowConciseArrowFunctionExpressionsStartingWithVoid: true
}
],
'@angular-eslint/directive-selector': [
'error',
{
type: 'attribute',
prefix: 'paimon',
style: 'camelCase'
}
],
'@angular-eslint/component-selector': [
'error',
{
type: 'element',
prefix: 'paimon',
style: 'kebab-case'
}
]
}
},
{
files: ['**/*.html'],
extends: [...angular.configs.templateRecommended, ...angular.configs.templateAccessibility],
plugins: {
prettier
},
rules: {
'@angular-eslint/template/click-events-have-key-events': ['off'],
'@angular-eslint/template/interactive-supports-focus': ['off'],
'prettier/prettier': ['error', { parser: 'angular' }]
}
}
);