113 lines
3.3 KiB
TypeScript
113 lines
3.3 KiB
TypeScript
import js from '@eslint/js';
|
|
import eslintConfigPrettier from 'eslint-config-prettier/flat';
|
|
import reactHooks from 'eslint-plugin-react-hooks';
|
|
import reactRefresh from 'eslint-plugin-react-refresh';
|
|
import { defineConfig, globalIgnores } from 'eslint/config';
|
|
import globals from 'globals';
|
|
import tseslint from 'typescript-eslint';
|
|
|
|
const tsconfigRootDir = decodeURIComponent(new URL('.', import.meta.url).pathname).replace(
|
|
/^\/(.:\/)/,
|
|
'$1',
|
|
);
|
|
|
|
export const sourceIgnores = globalIgnores([
|
|
'**/dist/**',
|
|
'**/node_modules/**',
|
|
'**/coverage/**',
|
|
'**/.turbo/**',
|
|
'**/.vite/**',
|
|
'.claude/**',
|
|
'dev/**',
|
|
'**/*.tsbuildinfo',
|
|
'**/test/fixtures/**',
|
|
'packages/runtime/native/**',
|
|
'packages/mcp/src/generated/**',
|
|
]);
|
|
|
|
export default defineConfig([
|
|
sourceIgnores,
|
|
{
|
|
files: ['**/*.{js,mjs,cjs,ts,tsx}'],
|
|
extends: [js.configs.recommended],
|
|
languageOptions: {
|
|
ecmaVersion: 2023,
|
|
sourceType: 'module',
|
|
globals: {
|
|
...globals.es2023,
|
|
...globals.node,
|
|
},
|
|
},
|
|
rules: {
|
|
'no-unused-vars': 'off',
|
|
'no-useless-assignment': 'off',
|
|
'prefer-const': 'off',
|
|
'preserve-caught-error': 'off',
|
|
},
|
|
},
|
|
{
|
|
files: ['**/*.{ts,tsx}'],
|
|
extends: [tseslint.configs.recommended],
|
|
languageOptions: {
|
|
parserOptions: {
|
|
tsconfigRootDir,
|
|
},
|
|
},
|
|
rules: {
|
|
'prefer-const': 'off',
|
|
'@typescript-eslint/no-explicit-any': 'error',
|
|
'@typescript-eslint/no-empty-object-type': 'off',
|
|
'@typescript-eslint/no-this-alias': 'off',
|
|
'@typescript-eslint/no-unused-vars': [
|
|
'warn',
|
|
{
|
|
argsIgnorePattern: '^_',
|
|
varsIgnorePattern: '^_',
|
|
caughtErrorsIgnorePattern: '^_',
|
|
},
|
|
],
|
|
},
|
|
},
|
|
{
|
|
files: ['**/tests/**/*.{ts,tsx}', '**/*.test.{ts,tsx}'],
|
|
rules: {
|
|
'@typescript-eslint/no-explicit-any': 'off',
|
|
},
|
|
},
|
|
{
|
|
files: ['**/bench/**/*.{ts,tsx}', 'packages/proton/test/**/*.{ts,tsx}'],
|
|
rules: {
|
|
'@typescript-eslint/no-explicit-any': 'off',
|
|
},
|
|
},
|
|
{
|
|
// OIDB service layer is namespace-per-cmd by design — the
|
|
// structural-typing contract (namespace IS the OidbCallSpec) and
|
|
// the file:cmd 1:1 mapping are the whole point. Disable the
|
|
// module-syntax preference here only.
|
|
files: [
|
|
'packages/protocol/src/oidb-services/**/*.ts',
|
|
'packages/protocol/tests/oidb-services/**/*.ts',
|
|
],
|
|
rules: {
|
|
'@typescript-eslint/no-namespace': 'off',
|
|
},
|
|
},
|
|
{
|
|
files: ['packages/webui/src/**/*.{ts,tsx}', 'packages/ui/src/**/*.{ts,tsx}'],
|
|
extends: [reactHooks.configs.flat.recommended, reactRefresh.configs.vite],
|
|
languageOptions: {
|
|
globals: globals.browser,
|
|
parserOptions: {
|
|
tsconfigRootDir,
|
|
},
|
|
},
|
|
rules: {
|
|
'prefer-const': 'off',
|
|
'react-refresh/only-export-components': 'off',
|
|
'react-hooks/set-state-in-effect': 'off',
|
|
},
|
|
},
|
|
eslintConfigPrettier,
|
|
]);
|