From c0d1d1342234079413c0479aa42b30bff1e1b2cb Mon Sep 17 00:00:00 2001 From: Daniel Kennedy Date: Fri, 30 Jan 2026 09:29:32 -0500 Subject: [PATCH] chore: convert to ESLint flat config - Replace .eslintrc.json with eslint.config.mjs - Remove .eslintignore (ignores now in config) - Remove deprecated rules (semi, type-annotation-spacing, no-empty-interface) --- .eslintignore | 5 -- .eslintrc.json | 107 ----------------------------------------- eslint.config.mjs | 118 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+), 112 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.json create mode 100644 eslint.config.mjs diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 3ac58072..00000000 --- a/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules/ -packages/*/node_modules/ -packages/*/lib/ -packages/glob/__tests__/_temp -packages/*/src/generated/*/ diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index f86ba651..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "plugins": [ - "jest", - "@typescript-eslint", - "prettier" - ], - "extends": [ - "plugin:github/recommended", - "plugin:prettier/recommended" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 9, - "sourceType": "module", - "project": "./tsconfig.eslint.json" - }, - "rules": { - "prettier/prettier": [ - "error", - { - "endOfLine": "auto" - } - ], - "eslint-comments/no-use": "off", - "no-constant-condition": ["error", { "checkLoops": false }], - "github/no-then": "off", - "import/no-namespace": "off", - "no-shadow": "off", - "no-unused-vars": "off", - "i18n-text/no-en": "off", - "filenames/match-regex": "off", - "import/no-commonjs": "off", - "import/named": "off", - "no-sequences": "off", - "import/no-unresolved": "off", - "no-undef": "off", - "no-only-tests/no-only-tests": "off", - "@typescript-eslint/no-unused-vars": "error", - "@typescript-eslint/explicit-member-accessibility": [ - "error", - { - "accessibility": "no-public" - } - ], - "@typescript-eslint/no-require-imports": "error", - "@typescript-eslint/array-type": "error", - "@typescript-eslint/await-thenable": "error", - "@typescript-eslint/ban-ts-comment": "error", - "camelcase": "off", - "@typescript-eslint/camelcase": "off", - "@typescript-eslint/consistent-type-assertions": "off", - "@typescript-eslint/explicit-function-return-type": [ - "error", - { - "allowExpressions": true - } - ], - "@typescript-eslint/func-call-spacing": [ - "error", - "never" - ], - "@typescript-eslint/naming-convention": [ - "error", - { - "format": null, - "filter": { - // you can expand this regex as you find more cases that require quoting that you want to allow - "regex": "^[A-Z][A-Za-z]*$", - "match": true - }, - "selector": "memberLike" - } - ], - "@typescript-eslint/no-array-constructor": "error", - "@typescript-eslint/no-empty-interface": "error", - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-extraneous-class": "error", - "@typescript-eslint/no-for-in-array": "error", - "@typescript-eslint/no-inferrable-types": "error", - "@typescript-eslint/no-misused-new": "error", - "@typescript-eslint/no-namespace": "error", - "@typescript-eslint/no-non-null-assertion": "warn", - "@typescript-eslint/no-unnecessary-qualifier": "error", - "@typescript-eslint/no-unnecessary-type-assertion": "error", - "@typescript-eslint/no-useless-constructor": "error", - "@typescript-eslint/no-var-requires": "error", - "@typescript-eslint/prefer-for-of": "warn", - "@typescript-eslint/prefer-function-type": "warn", - "@typescript-eslint/prefer-includes": "error", - "@typescript-eslint/prefer-string-starts-ends-with": "error", - "@typescript-eslint/promise-function-async": "error", - "@typescript-eslint/require-array-sort-compare": "error", - "semi": "off", - "@typescript-eslint/semi": [ - "error", - "never" - ], - "@typescript-eslint/type-annotation-spacing": "error", - "@typescript-eslint/unbound-method": "error" - }, - "ignorePatterns": "packages/glob/__tests__/_temp/**/", - "env": { - "node": true, - "es6": true, - "jest/globals": true - } -} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..0c5fb349 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,118 @@ +import github from 'eslint-plugin-github' +import jest from 'eslint-plugin-jest' +import prettier from 'eslint-plugin-prettier/recommended' + +const githubConfigs = github.getFlatConfigs() + +export default [ + { + ignores: [ + '**/node_modules/**', + '**/lib/**', + '**/dist/**', + 'packages/glob/__tests__/_temp/**', + '**/generated/**' + ] + }, + githubConfigs.recommended, + ...githubConfigs.typescript, + prettier, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + project: './tsconfig.eslint.json' + } + }, + rules: { + // Prettier + 'prettier/prettier': ['error', {endOfLine: 'auto'}], + + // Disable rules that conflict with project style + 'eslint-comments/no-use': 'off', + 'github/no-then': 'off', + 'github/filenames-match-regex': 'off', + 'import/no-namespace': 'off', + 'import/no-commonjs': 'off', + 'import/named': 'off', + 'import/no-unresolved': 'off', + 'i18n-text/no-en': 'off', + 'filenames/match-regex': 'off', + 'no-shadow': 'off', + 'no-unused-vars': 'off', + 'no-sequences': 'off', + 'no-undef': 'off', + 'no-only-tests/no-only-tests': 'off', + 'no-constant-condition': ['error', {checkLoops: false}], + camelcase: 'off', + + // Disable stricter rules from eslint-plugin-github v6 + '@typescript-eslint/no-shadow': 'off', + '@typescript-eslint/array-type': 'off', + '@typescript-eslint/no-wrapper-object-types': 'off', + '@typescript-eslint/no-unsafe-function-type': 'off', + + // TypeScript rules + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/explicit-member-accessibility': [ + 'error', + {accessibility: 'no-public'} + ], + '@typescript-eslint/no-require-imports': 'error', + '@typescript-eslint/await-thenable': 'error', + '@typescript-eslint/ban-ts-comment': 'error', + '@typescript-eslint/consistent-type-assertions': 'off', + '@typescript-eslint/explicit-function-return-type': [ + 'error', + {allowExpressions: true} + ], + '@typescript-eslint/naming-convention': [ + 'error', + { + format: null, + filter: { + regex: '^[A-Z][A-Za-z]*$', + match: true + }, + selector: 'memberLike' + } + ], + '@typescript-eslint/no-array-constructor': 'error', + '@typescript-eslint/no-empty-object-type': 'error', + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/no-extraneous-class': 'error', + '@typescript-eslint/no-for-in-array': 'error', + '@typescript-eslint/no-inferrable-types': 'error', + '@typescript-eslint/no-misused-new': 'error', + '@typescript-eslint/no-namespace': 'error', + '@typescript-eslint/no-non-null-assertion': 'warn', + '@typescript-eslint/no-unnecessary-qualifier': 'error', + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + '@typescript-eslint/no-useless-constructor': 'error', + '@typescript-eslint/prefer-for-of': 'warn', + '@typescript-eslint/prefer-function-type': 'warn', + '@typescript-eslint/prefer-includes': 'error', + '@typescript-eslint/prefer-string-starts-ends-with': 'error', + '@typescript-eslint/promise-function-async': 'error', + '@typescript-eslint/require-array-sort-compare': 'error', + '@typescript-eslint/unbound-method': 'error' + } + }, + { + files: ['**/__tests__/**/*.ts'], + ...jest.configs['flat/recommended'], + rules: { + ...jest.configs['flat/recommended'].rules, + 'jest/expect-expect': 'off', + 'jest/no-conditional-expect': 'off', + 'jest/no-standalone-expect': 'off', + 'jest/no-alias-methods': 'off', + 'jest/valid-expect': 'off', + 'jest/no-export': 'off', + 'jest/no-done-callback': 'off', + 'jest/no-jasmine-globals': 'off', + 'jest/no-identical-title': 'off', + 'jest/no-commented-out-tests': 'off' + } + } +]