// @ts-check import tseslint from '@typescript-eslint/eslint-plugin'; import tsParser from '@typescript-eslint/parser'; import importPlugin from 'eslint-plugin-import'; import { fileURLToPath } from 'node:url'; import { dirname, join } from 'node:path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); /** @type {import('eslint').Linter.Config[]} */ export default [ { ignores: ['dist/**', 'node_modules/**', 'coverage/**'], }, { files: ['src/**/*.ts', 'test/**/*.ts'], plugins: { '@typescript-eslint': tseslint, import: importPlugin, }, languageOptions: { parser: tsParser, parserOptions: { project: './tsconfig.test.json', tsconfigRootDir: __dirname, ecmaVersion: 2022, sourceType: 'module', }, }, settings: { 'import/resolver': { typescript: { project: join(__dirname, 'tsconfig.test.json'), }, }, }, rules: { // TypeScript strict promise rules — critical in a stream consumer where // unhandled rejection silently loses work. '@typescript-eslint/no-floating-promises': 'error', '@typescript-eslint/no-misused-promises': 'error', // General quality '@typescript-eslint/no-explicit-any': 'error', '@typescript-eslint/no-unused-vars': [ 'error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, ], '@typescript-eslint/consistent-type-imports': [ 'error', { prefer: 'type-imports' }, ], // Domain isolation: core/ must NEVER import from domain/. // src/domain/ does not exist yet — this rule is preemptive so Phase 2 // cannot violate the boundary by accident. 'import/no-restricted-paths': [ 'error', { basePath: __dirname, zones: [ { target: 'src/core', from: 'src/domain', message: 'src/core must not import from src/domain — domain logic depends on core, not the reverse.', }, ], }, ], }, }, ];