eslint.config.js•3.85 kB
// eslint.config.js
import globals from "globals";
import js from "@eslint/js";
import tseslint from "typescript-eslint";
import prettier from "eslint-config-prettier";
export default tseslint.config(
// Global ignores
{
ignores: [
"dist/",
"node_modules/",
"coverage/",
"test-results/",
"**/*.config.js",
"**/*.config.mjs",
"**/*.config.cjs",
".smithery/",
],
},
// Base JavaScript recommended rules
js.configs.recommended,
// TypeScript recommended rules (type-aware).
// This is what brings in the stricter type checking.
...tseslint.configs.recommendedTypeChecked,
// Configuration for TypeScript SOURCE files
{
files: ["src/**/*.ts"],
ignores: ["src/**/*.test.ts", "src/**/__tests__/**/*.ts"],
languageOptions: {
ecmaVersion: "latest",
sourceType: "module",
globals: {
...globals.node,
...globals.es2021,
},
parserOptions: {
project: "tsconfig.json",
tsconfigRootDir: import.meta.dirname,
},
},
rules: {
// === Base rules for all TypeScript files ===
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/no-unused-vars": [
"warn",
{
argsIgnorePattern: "^_",
varsIgnorePattern: "^_",
caughtErrorsIgnorePattern: "^_",
},
],
"@typescript-eslint/no-explicit-any": "warn",
// === Downgrade unsafe operations to warnings ===
"@typescript-eslint/no-unsafe-assignment": "warn",
"@typescript-eslint/no-unsafe-call": "warn",
"@typescript-eslint/no-unsafe-member-access": "warn",
"@typescript-eslint/no-unsafe-return": "warn",
// === Type-checking rules ===
"@typescript-eslint/await-thenable": "error",
"@typescript-eslint/no-misused-promises": [
"error",
{
checksVoidReturn: { attributes: false },
},
],
"@typescript-eslint/no-floating-promises": [
"error",
{
ignoreVoid: true,
},
],
},
},
// Configuration for TypeScript TEST files
{
files: ["src/**/*.test.ts", "src/**/__tests__/**/*.ts"],
languageOptions: {
ecmaVersion: "latest",
sourceType: "module",
globals: {
...globals.node,
...globals.es2021,
...globals.jest,
},
parserOptions: {
project: "tsconfig.test.json",
tsconfigRootDir: import.meta.dirname,
},
},
rules: {
// === Keep code clean, but as warnings ===
"@typescript-eslint/no-unused-vars": [
"warn",
{
argsIgnorePattern: "^_",
varsIgnorePattern: "^_",
caughtErrorsIgnorePattern: "^_",
},
],
"@typescript-eslint/no-unnecessary-type-assertion": "warn",
// === Turn off rules that are impractical for tests ===
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-unsafe-assignment": "off",
"@typescript-eslint/no-unsafe-call": "off",
"@typescript-eslint/no-unsafe-member-access": "off",
"@typescript-eslint/no-unsafe-return": "off",
"@typescript-eslint/no-unsafe-argument": "off",
"@typescript-eslint/no-misused-promises": "off",
"@typescript-eslint/no-floating-promises": "off",
"@typescript-eslint/require-await": "off", // Important for mocks
// === Turn off other less critical rules for tests ===
"@typescript-eslint/unbound-method": "off", // Often tricky with Jest mocks
"@typescript-eslint/no-non-null-assertion": "off", // Useful for telling TS "I know this exists in my test setup"
"@typescript-eslint/ban-ts-comment": "off", // Allows using @ts-ignore in tests if absolutely needed
},
},
// Prettier integration
prettier
);