import js from "@eslint/js"; import tseslint from "typescript-eslint"; import importPlugin from "eslint-plugin-import"; export default tseslint.config( { ignores: [ "**/dist/**", "**/node_modules/**", "**/*.d.ts", "**/coverage/**", ], }, js.configs.recommended, ...tseslint.configs.recommended, importPlugin.flatConfigs.recommended, importPlugin.flatConfigs.typescript, { languageOptions: { parserOptions: { projectService: true, ecmaVersion: 2020, sourceType: "module", }, }, }, { files: ["**/*.ts", "**/*.tsx"], rules: { // --- Project Conventions --- quotes: ["error", "single", { avoidEscape: true }], "comma-dangle": ["error", "always-multiline"], indent: ["error", 2, { SwitchCase: 1 }], // --- TypeScript --- "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/explicit-function-return-type": "off", "@typescript-eslint/explicit-module-boundary-types": "off", "@typescript-eslint/no-unused-vars": [ "error", { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }, ], "@typescript-eslint/consistent-type-imports": [ "error", { prefer: "type-imports" }, ], "@typescript-eslint/no-non-null-assertion": "warn", // --- Import Ordering --- "import/order": [ "error", { groups: [ "builtin", "external", "internal", "parent", "sibling", "index", "object", "type", ], "newlines-between": "always", alphabetize: { order: "asc", caseInsensitive: true }, }, ], "import/no-unresolved": "off", "import/no-duplicates": "error", // --- General --- "no-console": "warn", "prefer-const": "error", "no-var": "error", eqeqeq: ["error", "always"], }, }, { files: ["**/*.test.ts", "**/*.spec.ts"], rules: { "no-console": "off", "@typescript-eslint/no-explicit-any": "off", }, }, );