Replace eslint/prettier with oxlint/oxfmt, add pre-commit hooks

Swap out eslint + 6 plugins for oxlint and prettier for oxfmt (oxc toolchain).
Set up husky + lint-staged to run linter and formatter on pre-commit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Neil 2026-03-16 20:38:27 -07:00
parent 846a4dc380
commit 2d9df606c6
10 changed files with 667 additions and 1871 deletions

2
.gitignore vendored
View file

@ -28,7 +28,7 @@ release/
Thumbs.db Thumbs.db
# Lint/cache # Lint/cache
.eslintcache .oxlintcache
# Logs # Logs
*.log *.log

1
.husky/pre-commit Normal file
View file

@ -0,0 +1 @@
pnpm exec lint-staged

7
.oxfmtrc.json Normal file
View file

@ -0,0 +1,7 @@
{
"$schema": "https://raw.githubusercontent.com/nicolo-ribaudo/oxc-project.github.io/refs/heads/json-schemas/oxfmt/v0.41.0/config.json",
"singleQuote": true,
"semi": false,
"printWidth": 100,
"trailingComma": "none"
}

View file

@ -1,6 +0,0 @@
out
dist
pnpm-lock.yaml
LICENSE.md
tsconfig.json
tsconfig.*.json

View file

@ -1,4 +0,0 @@
singleQuote: true
semi: false
printWidth: 100
trailingComma: none

View file

@ -1,32 +0,0 @@
import { defineConfig } from 'eslint/config'
import tseslint from '@electron-toolkit/eslint-config-ts'
import eslintConfigPrettier from '@electron-toolkit/eslint-config-prettier'
import eslintPluginReact from 'eslint-plugin-react'
import eslintPluginReactHooks from 'eslint-plugin-react-hooks'
import eslintPluginReactRefresh from 'eslint-plugin-react-refresh'
export default defineConfig(
{ ignores: ['**/node_modules', '**/dist', '**/out'] },
tseslint.configs.recommended,
eslintPluginReact.configs.flat.recommended,
eslintPluginReact.configs.flat['jsx-runtime'],
{
settings: {
react: {
version: 'detect'
}
}
},
{
files: ['**/*.{ts,tsx}'],
plugins: {
'react-hooks': eslintPluginReactHooks,
'react-refresh': eslintPluginReactRefresh
},
rules: {
...eslintPluginReactHooks.configs.recommended.rules,
...eslintPluginReactRefresh.configs.vite.rules
}
},
eslintConfigPrettier
)

23
oxlintrc.json Normal file
View file

@ -0,0 +1,23 @@
{
"$schema": "https://raw.githubusercontent.com/nicolo-ribaudo/oxc-project.github.io/refs/heads/json-schemas/oxlint/v0.17.0/config.json",
"plugins": ["typescript", "react", "react-hooks", "react-perf"],
"categories": {
"correctness": "error"
},
"rules": {
"react/jsx-no-duplicate-props": "error",
"react/jsx-no-undef": "error",
"react/jsx-uses-vars": "error",
"react/no-children-prop": "error",
"react/no-danger-with-children": "error",
"react/no-direct-mutation-state": "error",
"react/no-find-dom-node": "error",
"react/no-render-return-value": "error",
"react/no-string-refs": "error",
"react/no-unescaped-entities": "error",
"react/require-render-return": "error",
"react-hooks/rules-of-hooks": "error",
"react-hooks/exhaustive-deps": "warn"
},
"ignorePatterns": ["**/node_modules", "**/dist", "**/out"]
}

View file

@ -2,12 +2,13 @@
"name": "orca", "name": "orca",
"version": "1.0.0", "version": "1.0.0",
"description": "An Electron application with React and TypeScript", "description": "An Electron application with React and TypeScript",
"main": "./out/main/index.js",
"author": "example.com",
"homepage": "https://electron-vite.org", "homepage": "https://electron-vite.org",
"author": "example.com",
"main": "./out/main/index.js",
"scripts": { "scripts": {
"format": "prettier --write .", "format": "oxfmt --write .",
"lint": "eslint --cache .", "lint": "oxlint",
"prepare": "husky",
"typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false", "typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false",
"typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false", "typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false",
"typecheck": "npm run typecheck:node && npm run typecheck:web", "typecheck": "npm run typecheck:node && npm run typecheck:web",
@ -26,8 +27,6 @@
"electron-updater": "^6.3.9" "electron-updater": "^6.3.9"
}, },
"devDependencies": { "devDependencies": {
"@electron-toolkit/eslint-config-prettier": "^3.0.0",
"@electron-toolkit/eslint-config-ts": "^3.1.0",
"@electron-toolkit/tsconfig": "^2.0.0", "@electron-toolkit/tsconfig": "^2.0.0",
"@types/node": "^25.5.0", "@types/node": "^25.5.0",
"@types/react": "^19.2.7", "@types/react": "^19.2.7",
@ -36,16 +35,24 @@
"electron": "^41.0.2", "electron": "^41.0.2",
"electron-builder": "^26.0.12", "electron-builder": "^26.0.12",
"electron-vite": "^5.0.0", "electron-vite": "^5.0.0",
"eslint": "^9.39.1", "husky": "^9.1.7",
"eslint-plugin-react": "^7.37.5", "lint-staged": "^16.4.0",
"eslint-plugin-react-hooks": "^7.0.1", "oxfmt": "^0.41.0",
"eslint-plugin-react-refresh": "^0.5.2", "oxlint": "^1.56.0",
"prettier": "^3.7.4",
"react": "^19.2.1", "react": "^19.2.1",
"react-dom": "^19.2.1", "react-dom": "^19.2.1",
"typescript": "^5.9.3", "typescript": "^5.9.3",
"vite": "^7.2.6" "vite": "^7.2.6"
}, },
"lint-staged": {
"*.{ts,tsx,js,jsx,mts,cts}": [
"oxlint",
"oxfmt --write"
],
"*.{json,css,html,yaml,yml,md}": [
"oxfmt --write"
]
},
"pnpm": { "pnpm": {
"onlyBuiltDependencies": [ "onlyBuiltDependencies": [
"electron", "electron",

File diff suppressed because it is too large Load diff

View file

@ -11,9 +11,7 @@
"jsx": "react-jsx", "jsx": "react-jsx",
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"@renderer/*": [ "@renderer/*": ["src/renderer/src/*"]
"src/renderer/src/*"
]
} }
} }
} }