Files
2026-07-13 12:12:04 +08:00

198 lines
5.5 KiB
JavaScript

import js from "@eslint/js";
import typescriptPlugin from "@typescript-eslint/eslint-plugin";
import typescriptParser from "@typescript-eslint/parser";
import {defineConfig} from "eslint/config";
import prettierConfig from "eslint-config-prettier";
import importPlugin from "eslint-plugin-import";
import onlyWarnPlugin from "eslint-plugin-only-warn";
import prettierPlugin from "eslint-plugin-prettier";
import sortDestructureKeysPlugin from "eslint-plugin-sort-destructure-keys";
import sortKeysFixPlugin from "eslint-plugin-sort-keys-fix";
import unusedImportsPlugin from "eslint-plugin-unused-imports";
import globals from "globals";
import tseslint from "typescript-eslint";
const config = defineConfig([
// ESLint recommended rules
js.configs.recommended,
// TypeScript ESLint recommended rules
...tseslint.configs.recommended,
// Prettier config - disables conflicting ESLint rules
{
rules: {
...prettierConfig.rules,
},
},
{
files: ["**/*.{js,mjs,cjs,jsx,ts,tsx}"],
languageOptions: {
ecmaVersion: "latest",
globals: {
...globals.node,
...globals.es2025,
},
parser: typescriptParser,
parserOptions: {
tsconfigRootDir: import.meta.dirname,
},
sourceType: "module",
},
plugins: {
"@typescript-eslint": typescriptPlugin,
import: importPlugin,
"only-warn": onlyWarnPlugin,
prettier: prettierPlugin,
"sort-destructure-keys": sortDestructureKeysPlugin,
"sort-keys-fix": sortKeysFixPlugin,
"unused-imports": unusedImportsPlugin,
},
rules: {
"@typescript-eslint/consistent-type-imports": "error",
"@typescript-eslint/no-empty-object-type": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-unused-vars": "off",
"import/consistent-type-specifier-style": ["error", "prefer-top-level"],
"import/newline-after-import": ["error", {count: 1}],
"import/no-duplicates": "error",
"import/order": [
"error",
{
alphabetize: {
caseInsensitive: true,
order: "asc",
},
groups: [
"type",
"builtin",
"external",
"internal",
"parent",
"sibling",
"index",
"object",
"unknown",
],
"newlines-between": "always",
pathGroups: [
{
group: "type",
pattern: "server-only",
position: "before",
},
{
group: "unknown",
pattern: "**/*.+(css|sass|scss)",
patternOptions: {dot: true, nocomment: true},
position: "after",
},
{
group: "unknown",
pattern: "{.,..}/**/*.+(css|sass|scss)",
patternOptions: {dot: true, nocomment: true},
position: "after",
},
{
group: "internal",
pattern: "~env",
position: "before",
},
{
group: "internal",
pattern: "@/**",
position: "after",
},
],
pathGroupsExcludedImportTypes: ["type"],
warnOnUnassignedImports: true,
},
],
"no-console": "warn",
"no-unused-vars": "off",
"object-curly-spacing": ["error", "never"],
"padding-line-between-statements": [
"error",
{blankLine: "always", next: "*", prev: "directive"},
{blankLine: "any", next: "directive", prev: "directive"},
{blankLine: "always", next: "*", prev: ["const", "let", "var"]},
{blankLine: "any", next: ["const", "let", "var"], prev: ["const", "let", "var"]},
{blankLine: "always", next: "return", prev: "*"},
],
"prettier/prettier": "error",
"sort-destructure-keys/sort-destructure-keys": [
"error",
{
caseSensitive: true,
},
],
"sort-imports": [
"error",
{
allowSeparatedGroups: true,
ignoreCase: false,
ignoreDeclarationSort: true,
ignoreMemberSort: false,
memberSyntaxSortOrder: ["none", "all", "multiple", "single"],
},
],
"sort-keys": [
"error",
"asc",
{
caseSensitive: true,
minKeys: 2,
natural: false,
},
],
"sort-keys-fix/sort-keys-fix": "error",
"unused-imports/no-unused-imports": "error",
"unused-imports/no-unused-vars": [
"error",
{
args: "after-used",
argsIgnorePattern: "^_",
caughtErrors: "none",
vars: "all",
varsIgnorePattern: "^_",
},
],
},
settings: {
"import/resolver": {
node: true,
typescript: true,
},
},
},
// Disable type checking for config files (.*.js, .*.cjs, .*.mjs)
{
files: [".*.js", ".*.cjs", ".*.mjs"],
...tseslint.configs.disableTypeChecked,
},
{
ignores: [
"**/.temp/**",
"**/.next/**",
"**/.swc/**",
"**/.turbo/**",
"**/.cache/**",
"**/.build/**",
"**/.vercel/**",
"**/.DS_Store",
"**/dist/**",
"**/build/**",
"**/public/**",
"**/node_modules/**",
"**/coverage/**",
"**/.contentlayer/",
"**/__snapshots__/**",
"**/pnpm-lock.yaml",
"**/.source/**",
"**/next-env.d.ts",
"!.vscode/**",
"!scripts/**",
],
},
]);
export default config;