mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-19 21:46:49 +00:00
0a1a5092f7
The shared context menu closed only on a click elsewhere: Escape did nothing, the arrow keys did nothing, and a scroll left the fixed menu hanging over content that had moved on. It now takes focus on its first item, moves with the arrow keys, and closes on Escape, scroll and resize. rules-of-hooks is an error again; its one hit was a test helper named like a hook.
100 lines
3.3 KiB
JavaScript
100 lines
3.3 KiB
JavaScript
import js from '@eslint/js';
|
|
|
|
import gitignore from 'eslint-config-flat-gitignore';
|
|
import eslintConfigPrettier from 'eslint-config-prettier';
|
|
import reactHooks from 'eslint-plugin-react-hooks';
|
|
import reactRefresh from 'eslint-plugin-react-refresh';
|
|
import tseslint from 'typescript-eslint';
|
|
|
|
// Minimal stub so the existing `// eslint-disable-next-line react/no-danger`
|
|
// directive in src/i18n/TransHtml.tsx resolves without pulling in the full
|
|
// eslint-plugin-react (not a dependency here). The rule is a no-op.
|
|
const reactStub = {
|
|
rules: {
|
|
'no-danger': {
|
|
meta: { schema: [] },
|
|
create() {
|
|
return {};
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
export default tseslint.config(
|
|
gitignore({ strict: false }),
|
|
{
|
|
ignores: [
|
|
'node_modules',
|
|
'dist',
|
|
'coverage',
|
|
'public',
|
|
'test-results',
|
|
'playwright-report',
|
|
'e2e/**',
|
|
'scripts/**',
|
|
'**/*.config.js',
|
|
'**/*.config.ts',
|
|
'**/*.config.mjs',
|
|
],
|
|
},
|
|
js.configs.recommended,
|
|
...tseslint.configs.recommended,
|
|
eslintConfigPrettier,
|
|
{
|
|
files: ['src/**/*.{ts,tsx}', 'tests/**/*.{ts,tsx}'],
|
|
plugins: {
|
|
'react-hooks': reactHooks,
|
|
'react-refresh': reactRefresh,
|
|
react: reactStub,
|
|
},
|
|
rules: {
|
|
'react/no-danger': 'off',
|
|
'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],
|
|
|
|
// --- Severities tuned to keep CI green on a codebase that was never linted ---
|
|
// (each rule below has pre-existing violations; surfaced as warnings, not blockers)
|
|
|
|
// A hook called conditionally is a crash waiting for the render that skips it.
|
|
'react-hooks/rules-of-hooks': 'error',
|
|
'react-hooks/exhaustive-deps': 'warn',
|
|
|
|
'@typescript-eslint/no-explicit-any': 'warn',
|
|
'@typescript-eslint/no-unused-vars': [
|
|
'warn',
|
|
{ argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_' },
|
|
],
|
|
'@typescript-eslint/no-unused-expressions': 'warn',
|
|
'@typescript-eslint/no-unsafe-function-type': 'warn',
|
|
'@typescript-eslint/no-this-alias': 'warn',
|
|
'@typescript-eslint/no-non-null-asserted-optional-chain': 'warn',
|
|
|
|
// js.recommended rules with pre-existing hits.
|
|
'no-empty': 'warn',
|
|
'no-useless-escape': 'warn',
|
|
'no-useless-assignment': 'warn',
|
|
'preserve-caught-error': 'warn',
|
|
},
|
|
},
|
|
{
|
|
// react-dom/server was worth ~190 KB raw / 57 KB gzip in a chunk three lazy
|
|
// routes share — including the Leaflet renderer, which is the default — for
|
|
// output that is always a single <svg>. utils/iconMarkup.ts does that job
|
|
// without Fizz, and this keeps the import from creeping back: nothing else
|
|
// would notice, the build stays green and the app keeps working.
|
|
files: ['src/**/*.{ts,tsx}'],
|
|
ignores: ['src/**/*.test.{ts,tsx}'],
|
|
rules: {
|
|
'no-restricted-imports': ['error', {
|
|
paths: [{
|
|
name: 'react-dom/server',
|
|
message: 'Use renderIconMarkup from utils/iconMarkup — Fizz is ~190 KB for one <svg>.',
|
|
}],
|
|
}],
|
|
'no-restricted-syntax': ['error', {
|
|
selector: "ImportExpression > Literal[value=/^react-dom\\u002F(server|static)/]",
|
|
message: 'Use renderIconMarkup from utils/iconMarkup — Fizz is ~190 KB for one <svg>.',
|
|
}],
|
|
},
|
|
},
|
|
);
|