// @ts-check const eslint = require('@eslint/js'); const { defineConfig } = require('eslint/config'); const tseslint = require('typescript-eslint'); const angular = require('angular-eslint'); module.exports = defineConfig([ { ignores: [ '**/dist/**', '**/.angular/**', '**/coverage/**', '**/node_modules/**', '**/*.min.js', ], }, { files: ['**/*.ts'], extends: [ eslint.configs.recommended, tseslint.configs.recommended, tseslint.configs.stylistic, angular.configs.tsRecommended, ], processor: angular.processInlineTemplates, rules: { // Production safety rules: strict on bugs, neutral on visual style. 'no-alert': 'error', 'no-debugger': 'error', 'no-unsafe-finally': 'error', 'no-console': ['warn', { allow: ['warn', 'error'] }], '@typescript-eslint/no-unused-vars': [ 'error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_', }, ], '@angular-eslint/directive-selector': [ 'error', { type: 'attribute', prefix: 'app', style: 'camelCase', }, ], '@angular-eslint/component-selector': [ 'error', { type: 'element', prefix: 'app', style: 'kebab-case', }, ], '@angular-eslint/contextual-lifecycle': 'error', '@angular-eslint/no-empty-lifecycle-method': 'error', '@angular-eslint/no-input-rename': 'error', '@angular-eslint/no-output-native': 'error', '@angular-eslint/use-lifecycle-interface': 'error', }, }, { files: ['**/*.html'], extends: [angular.configs.templateRecommended, angular.configs.templateAccessibility], rules: { '@angular-eslint/template/no-call-expression': 'off', }, }, { files: ['**/*.spec.ts'], rules: { 'no-console': 'off', '@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-unsafe-assignment': 'off', '@typescript-eslint/no-unsafe-member-access': 'off', '@typescript-eslint/no-unsafe-return': 'off', '@typescript-eslint/no-unsafe-call': 'off', }, }, ]);