# ESLint configured

- **Pattern:** `ab-002162` (`code-quality-essentials.organization.eslint-configured`)
- **Severity:** low
- **Lifecycle:** active
- **Last modified:** 2026-04-18
- **Canonical URL:** https://auditbuffet.com/patterns/ab-002162
- **License:** CC-BY-4.0 — attribute to AuditBuffet Pattern Catalog (https://auditbuffet.com/patterns/ab-002162)

## Why it matters

Without ESLint or Biome, code quality issues — unused variables, implicit `any`, unsafe type assertions, missing `await`, console.log in production — are caught only by the developer's own review discipline rather than automatically on every commit. ISO 25010:2011 §6.5.4 classifies absent static analysis as a maintainability defect. The practical effect: every code review must manually check for issues that a linter would flag in milliseconds, and issues that slip through become permanent residents of the codebase.

## Severity rationale

Low because absent linting does not cause immediate failures but means an entire category of preventable defects — unused variables, unsafe patterns, style violations — is caught only by manual review, if at all.

## Remediation

Set up ESLint with TypeScript support and wire it into CI. A minimal configuration:

```bash
npm install -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
```

```javascript
// eslint.config.mjs
import tseslint from '@typescript-eslint/eslint-plugin'
import tsparser from '@typescript-eslint/parser'

export default [
  {
    files: ['**/*.ts', '**/*.tsx'],
    languageOptions: { parser: tsparser },
    plugins: { '@typescript-eslint': tseslint },
    rules: {
      ...tseslint.configs.recommended.rules,
      '@typescript-eslint/no-explicit-any': 'error',
      '@typescript-eslint/no-unused-vars': 'error',
      'no-console': ['error', { allow: ['error', 'warn'] }],
    },
  },
]
```

Add to `package.json`:
```json
{ "scripts": { "lint": "eslint src/ --max-warnings=0" } }
```

## Detection

- **ID:** `eslint-configured`
- **Severity:** `low`
- **What to look for:** Check for ESLint configuration files: `eslint.config.js`, `eslint.config.mjs`, `.eslintrc.js`, `.eslintrc.cjs`, `.eslintrc.json`, `.eslintrc.yaml`. Alternatively, check for Biome (`biome.json`) which serves as a combined linter and formatter. Verify that the configuration extends appropriate rulesets: `eslint:recommended` for base JavaScript, `@typescript-eslint/recommended` or `@typescript-eslint/strict` for TypeScript. Check whether a `lint` script is in `package.json`. Look for ESLint in `devDependencies`. A missing ESLint configuration means code quality issues (unused variables, implicit any, unsafe patterns) are caught only by the developer's judgment rather than automatically on every commit.
- **Pass criteria:** Enumerate all relevant code locations. ESLint or Biome is configured, extends a TypeScript-aware ruleset, and is run via a `lint` script. The `lint` script runs in CI with at least 1 verified location.
- **Fail criteria:** No ESLint or Biome configuration found. A partial implementation does not count as pass.
- **Skip (N/A) when:** Never — linting applies to all JavaScript/TypeScript projects.
- **Cross-reference:** Compare with `code-quality-essentials.organization.naming-conventions` — ESLint enforces naming rules programmatically while naming-conventions evaluates adherence manually.
- **Detail on fail:** `"No ESLint configuration found; code quality issues are not automatically caught during development or CI"`
- **Remediation:** Set up ESLint with TypeScript support:

  ```bash
  npm install -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
  ```

  ```javascript
  // eslint.config.mjs
  import tseslint from '@typescript-eslint/eslint-plugin'
  import tsparser from '@typescript-eslint/parser'

  export default [
    {
      files: ['**/*.ts', '**/*.tsx'],
      languageOptions: { parser: tsparser },
      plugins: { '@typescript-eslint': tseslint },
      rules: {
        ...tseslint.configs.recommended.rules,
        '@typescript-eslint/no-explicit-any': 'error',
        '@typescript-eslint/no-unused-vars': 'error',
        'no-console': ['error', { allow: ['error', 'warn'] }],
      },
    },
  ]
  ```

  Add to `package.json`:
  ```json
  { "scripts": { "lint": "eslint src/ --max-warnings=0" } }
  ```

## External references

- iso-25010 maintainability.modifiability

Taxons: code-quality

HTML version: https://auditbuffet.com/patterns/ab-002162
