Migrate eslint to oxlint (#72)

This commit is contained in:
Vitaly Rtishchev
2026-04-01 22:01:53 +03:00
committed by GitHub
parent e70facef08
commit 168462c766
5 changed files with 340 additions and 3623 deletions
+2 -2
View File
@@ -11,7 +11,7 @@ This template comes with the following features:
- [TypeScript](https://www.typescriptlang.org/)
- [Storybook](https://storybook.js.org/)
- [Jest](https://jestjs.io/) setup with [React Testing Library](https://testing-library.com/docs/react-testing-library/intro)
- ESLint setup with [eslint-config-mantine](https://github.com/mantinedev/eslint-config-mantine)
- Oxlint setup for TypeScript and React sources
## npm scripts
@@ -24,7 +24,7 @@ This template comes with the following features:
### Testing scripts
- `typecheck` checks TypeScript types
- `lint` runs ESLint
- `lint` runs oxlint and stylelint
- `format:test` checks files with oxfmt
- `jest` runs jest tests
- `jest:watch` starts jest watch
-22
View File
@@ -1,22 +0,0 @@
import mantine from 'eslint-config-mantine';
import { defineConfig } from 'eslint/config';
import tseslint from 'typescript-eslint';
// @ts-check
export default defineConfig(
tseslint.configs.recommended,
...mantine,
{ ignores: ['**/*.{mjs,cjs,js,d.ts,d.mts}', '.next'] },
{
files: ['**/*.story.tsx'],
rules: { 'no-console': 'off' },
},
{
languageOptions: {
parserOptions: {
tsconfigRootDir: process.cwd(),
project: ['./tsconfig.json'],
},
},
}
);
+105
View File
@@ -0,0 +1,105 @@
import type { OxlintConfig } from 'oxlint';
export default {
plugins: ['react', 'typescript', 'jsx-a11y', 'jest'],
ignorePatterns: ['**/*.{mjs,cjs,js,d.ts,d.mts}', '.next', 'storybook-static'],
rules: {
'array-callback-return': 'error',
'no-duplicate-imports': 'error',
'no-var': 'error',
'no-self-compare': 'error',
'no-template-curly-in-string': 'error',
curly: 'error',
'default-case': 'off',
'default-case-last': 'error',
'no-alert': 'error',
'no-console': 'error',
'no-else-return': 'error',
'no-eval': 'error',
'no-lonely-if': 'error',
'no-multi-assign': 'error',
'no-multi-str': 'error',
'no-param-reassign': 'error',
'no-return-assign': 'error',
'no-script-url': 'error',
'no-sequences': 'error',
'no-throw-literal': 'error',
'no-unneeded-ternary': 'error',
'no-useless-call': 'error',
'no-useless-constructor': 'error',
'no-useless-return': 'error',
'operator-assignment': 'error',
'prefer-const': 'error',
'prefer-exponentiation-operator': 'error',
'prefer-object-has-own': 'error',
'prefer-object-spread': 'error',
'prefer-promise-reject-errors': 'error',
'prefer-template': 'error',
radix: 'error',
yoda: 'error',
eqeqeq: ['error', 'smart'],
'no-empty': 'off',
'no-loop-func': 'off',
'no-redeclare': 'off',
'no-undef': 'off',
'no-unused-expressions': 'off',
'no-use-before-define': 'off',
'typescript/ban-ts-comment': 'off',
'typescript/consistent-generic-constructors': 'error',
'typescript/no-deprecated': 'warn',
'typescript/no-empty-object-type': 'off',
'typescript/no-explicit-any': 'off',
'typescript/no-namespace': 'off',
'typescript/no-unsafe-function-type': 'off',
'no-unused-vars': [
'error',
{
args: 'all',
argsIgnorePattern: '^_',
caughtErrors: 'none',
caughtErrorsIgnorePattern: '^_',
destructuredArrayIgnorePattern: '^_',
ignoreRestSiblings: true,
},
],
'react/button-has-type': 'error',
'react/jsx-boolean-value': 'error',
'react/jsx-curly-brace-presence': [
'error',
{ props: 'never', children: 'never', propElementValues: 'ignore' },
],
'react/jsx-fragments': ['error', 'syntax'],
'react/jsx-no-comment-textnodes': 'error',
'react/jsx-no-duplicate-props': 'error',
'react/jsx-no-target-blank': 'error',
'react/no-children-prop': 'error',
'react/no-find-dom-node': 'error',
'react/no-string-refs': 'error',
'react/self-closing-comp': 'error',
'react/void-dom-elements-no-children': 'error',
'jsx-a11y/anchor-has-content': 'off',
'jsx-a11y/anchor-is-valid': 'off',
'jsx-a11y/label-has-associated-control': 'off',
'jsx-a11y/mouse-events-have-key-events': 'off',
'jsx-a11y/no-autofocus': 'off',
'jest/expect-expect': 'off',
'jest/no-export': 'off',
'jest/valid-title': 'off',
},
overrides: [
{
files: ['**/*.story.tsx'],
rules: {
'no-console': 'off',
'react/button-has-type': 'off',
},
},
],
} satisfies OxlintConfig;
+4 -12
View File
@@ -8,8 +8,8 @@
"analyze": "ANALYZE=true next build",
"start": "next start",
"typecheck": "tsc --noEmit",
"lint": "npm run eslint && npm run stylelint",
"eslint": "eslint .",
"lint": "npm run oxlint && npm run stylelint",
"oxlint": "oxlint .",
"stylelint": "stylelint '**/*.css' --cache",
"jest": "jest",
"jest:watch": "jest --watch",
@@ -30,8 +30,6 @@
},
"devDependencies": {
"@babel/core": "^7.28.4",
"@eslint/eslintrc": "^3",
"@eslint/js": "^9.37.0",
"@storybook/addon-themes": "^10.0.0",
"@storybook/nextjs": "^10.0.0",
"@storybook/react": "^10.0.0",
@@ -39,19 +37,14 @@
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.6.1",
"@types/eslint-plugin-jsx-a11y": "^6",
"@types/jest": "^30.0.0",
"@types/node": "^25.0.0",
"@types/react": "19.2.14",
"babel-loader": "^10.0.0",
"eslint": "^9.37.0",
"eslint-config-mantine": "^4.0.3",
"eslint-config-next": "16.2.1",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5",
"jest": "^30.2.0",
"jest-environment-jsdom": "^30.2.0",
"oxfmt": "^0.42.0",
"oxlint": "^1.58.0",
"postcss": "^8.5.6",
"postcss-preset-mantine": "1.18.0",
"postcss-simple-vars": "^7.0.1",
@@ -59,8 +52,7 @@
"stylelint": "^17.0.0",
"stylelint-config-standard-scss": "^17.0.0",
"ts-jest": "^29.4.4",
"typescript": "6.0.2",
"typescript-eslint": "^8.46.0"
"typescript": "6.0.2"
},
"packageManager": "yarn@4.13.0"
}
+229 -3587
View File
File diff suppressed because it is too large Load Diff