import tseslint from '@typescript-eslint/eslint-plugin'; import tsparser from '@typescript-eslint/parser'; export default [ { name: 'tests/files-to-lint', files: ['tests/**/*.ts', 'scripts/harb-evaluator/**/*.ts'], languageOptions: { parser: tsparser, parserOptions: { ecmaVersion: 2022, sourceType: 'module', }, globals: { process: 'readonly', console: 'readonly', fetch: 'readonly', setTimeout: 'readonly', Date: 'readonly', Promise: 'readonly', }, }, plugins: { '@typescript-eslint': tseslint, }, rules: { '@typescript-eslint/no-explicit-any': 'error', '@typescript-eslint/no-unused-vars': [ 'error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_', }, ], }, }, { name: 'arch/no-fixed-delays', files: ['tests/**/*.ts', 'scripts/harb-evaluator/**/*.ts'], rules: { 'no-restricted-syntax': [ 'error', { selector: "CallExpression[callee.property.name='waitForTimeout']", message: '[BANNED] waitForTimeout is a fixed delay. → Subscribe to events instead (eth_newFilter for on-chain, waitForSelector/waitForURL for DOM). → Polling with timeout is acceptable only if no event source exists. → See AGENTS.md #Engineering Principles.', }, { selector: "NewExpression[callee.name='Promise'] > ArrowFunctionExpression CallExpression[callee.name='setTimeout']", message: '[BANNED] Promise+setTimeout sleep pattern. → Use event subscription or polling with timeout instead. → See AGENTS.md #Engineering Principles.', }, ], }, }, ];