chore(tooling): migrate from Biome to ESLint + Prettier

Replace Biome lint/check/format scripts with ESLint and Prettier commands, add Next + TypeScript oriented ESLint flat config, and remove biome.json. Update dependencies and lockfile to a single lint stack with Prettier-based formatting.
This commit is contained in:
zetaloop
2026-02-22 09:50:38 +08:00
parent acb04a02e7
commit f82a926b8f
6 changed files with 2462 additions and 165 deletions
+5
View File
@@ -0,0 +1,5 @@
.next
out
build
node_modules
pnpm-lock.yaml
+7
View File
@@ -0,0 +1,7 @@
{
"semi": false,
"singleQuote": false,
"tabWidth": 2,
"printWidth": 100,
"trailingComma": "all"
}
-67
View File
@@ -1,67 +0,0 @@
{
"$schema": "https://biomejs.dev/schemas/2.4.3/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true
},
"files": {
"ignoreUnknown": true,
"includes": [
"**/*.ts",
"**/*.tsx",
"**/*.js",
"**/*.jsx",
"**/*.mjs",
"**/*.json",
"**/*.css",
"!next-env.d.ts"
]
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 100
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {
"noUnusedImports": "error",
"useExhaustiveDependencies": "error"
},
"style": {
"noNonNullAssertion": "error",
"useImportType": "error"
},
"suspicious": {
"noExplicitAny": "error"
}
}
},
"javascript": {
"formatter": {
"quoteStyle": "double",
"semicolons": "asNeeded"
}
},
"css": {
"parser": {
"cssModules": true,
"tailwindDirectives": true
},
"formatter": {
"enabled": true
},
"linter": {
"enabled": true
}
},
"json": {
"formatter": {
"enabled": true
}
}
}
+43
View File
@@ -0,0 +1,43 @@
import { defineConfig, globalIgnores } from "eslint/config"
import nextVitals from "eslint-config-next/core-web-vitals"
import nextTypescript from "eslint-config-next/typescript"
import prettier from "eslint-config-prettier/flat"
const eslintConfig = defineConfig([
...nextVitals,
...nextTypescript,
{
files: ["**/*.{ts,tsx,mts,cts}"],
languageOptions: {
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
rules: {
"react-hooks/exhaustive-deps": "error",
"react-hooks/set-state-in-effect": "off",
"react-hooks/incompatible-library": "off",
"@next/next/no-async-client-component": "error",
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/no-non-null-assertion": "error",
"@typescript-eslint/no-unused-vars": [
"warn",
{ argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
],
"@typescript-eslint/consistent-type-imports": [
"error",
{ prefer: "type-imports", fixStyle: "inline-type-imports" },
],
"@typescript-eslint/no-floating-promises": "error",
"@typescript-eslint/no-misused-promises": [
"error",
{ checksVoidReturn: { attributes: false } },
],
},
},
prettier,
globalIgnores([".next/**", "out/**", "build/**", "node_modules/**", "next-env.d.ts"]),
])
export default eslintConfig
+12 -5
View File
@@ -6,10 +6,11 @@
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
"lint": "biome check .",
"lint:fix": "biome check --write .",
"format": "biome format --write .",
"check": "biome ci .",
"lint": "eslint . --max-warnings=0",
"lint:fix": "eslint . --fix",
"format": "prettier \"**/*.{ts,tsx,js,jsx,mjs,cjs,json,css,yml,yaml}\" --write",
"format:check": "prettier \"**/*.{ts,tsx,js,jsx,mjs,cjs,json,css,yml,yaml}\" --check",
"check": "pnpm lint && pnpm typecheck && pnpm format:check",
"typecheck": "tsc --noEmit"
},
"dependencies": {
@@ -31,11 +32,17 @@
"zustand": "^5.0.11"
},
"devDependencies": {
"@biomejs/biome": "^2.4.3",
"@tailwindcss/postcss": "^4",
"@typescript-eslint/eslint-plugin": "^8.56.0",
"@typescript-eslint/parser": "^8.56.0",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"eslint": "^9.39.3",
"eslint-config-next": "^16.1.6",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-react-hooks": "^7.0.1",
"prettier": "^3.8.1",
"shadcn": "^3.8.5",
"tailwindcss": "^4",
"tw-animate-css": "^1.4.0",
+2395 -93
View File
File diff suppressed because it is too large Load Diff